PCで遊んだ日々の備忘録

Making PC and Customization PC

ConkyにマルチCPUのコア温度とファン速度を表示する

手持ちの HP xw8400ワークステーション はマルチコアCPUを 2基搭載しています。2011年に中古で購入してカスタマイズしたものですが 2019年9月現在も現役です。

CPUクーラー ファン側の画像

CPUクーラー ファン側

CPUクーラー ヒートシンク側の画像

CPUクーラー ヒートシンク側

今回この CPUのそれぞれのコア温度とファン速度をハードウェア監視アプリである lm-sensors を使って Ubuntu 18.04LTS GNOMEデスクトップのシステムモニターConkyに表示してみました。

このページでは Conky設定ファイルに記述するコードを導く方法を掲載しています。(2019/09)

参考|lm_sensors - ArchWiki

アプリケーションパッケージ

CPU温度をはじめ、ハードウェアの情報を取得し表示するのに必要なアプリケーションパッケージは下表の3つです。

conky-all システム情報の表示
lm-sensors CPU の温度やファン等の情報取得
hddtemp SSDやHDDの温度など S.M.A.R.T情報の取得

事前にこれらを インストール しておきます。

lm-sensorsについては sensors-detectコマンドを実行して /etc ディレクトリに modulesファイルを作成しておきます。

▲ 目次へ

Conkyに CPU温度表示する 1

ConkyにCPU温度を表示するためには sensorsコマンドで表示される内容を設定ファイルである .conkyrcにソースコードとして記述する必要があります。

まずは端末から sensorsコマンドを実行します。

GNOME Terminal :

 $ sensors
(結果)
i5k_amb-isa-0000 ・・・物理メモリー
Adapter: ISA adapter
   ⋮
(中略)
   ⋮

coretemp-isa-0000 ・・・CPU 1
Adapter: ISA adapter
Core 0:       +54.0°C  (high = +80.0°C, crit = +100.0°C)
Core 1:       +52.0°C  (high = +80.0°C, crit = +100.0°C)
Core 2:       +51.0°C  (high = +80.0°C, crit = +100.0°C)
Core 3:       +52.0°C  (high = +80.0°C, crit = +100.0°C)

coretemp-isa-0001 ・・・CPU 2
Adapter: ISA adapter
Core 0:       +54.0°C  (high = +80.0°C, crit = +100.0°C)
Core 1:       +51.0°C  (high = +80.0°C, crit = +100.0°C)
Core 2:       +49.0°C  (high = +80.0°C, crit = +100.0°C)
Core 3:       +51.0°C  (high = +80.0°C, crit = +100.0°C)
 

下の画像は結果のスクリーンショットです。

この結果から .conkyrcに次のコードを記述してみると

${color yellowgreen}CPU(Xeon x5365):${color blue} ${alignr} ${execi 5 sensors | grep 'Core 0' | cut -c16-17}℃ 
 

訳すと

(黄緑)CPU(Xeon x5365):(以下色青),(右寄せ),(5秒間隔で sensorsにアクセスし Core 0の 16列目~17列目 の数値 を表示)

となり、デスクトップの Conkyには下の画像のように 1行に2つの温度が表示されてしまいます。

CPUが 1基ですとこのコードでよいのですが 2基の場合どうすればよいのか次のパートで説明します。

CPUが 2基の時のコード

このパートでは .conkyrc設定ファイルの記述のみで温度表示する方法を説明します。

1行に2つの温度が表示される原因は grepする行の名称、即ち Coreの後の数字が CPU1, CPU2共に同じためです。

これを区別する方法は coretemp-isa-0000 と coretemp-isa-0001 を grepするしかありません。しかし、それぞれ改行されていて今度は温度が拾えません。

そこで sensorsコマンドに -uオプションスイッチ を付け引数を coretemp-isa-0000として実行してみます。

端末から

 $ sensors -u coretemp-isa-0000
(結果)
coretemp-isa-0000 ・・・CPU 1
Adapter: ISA adapter
Core 0:
  temp2_input: 54.000
  temp2_max: 80.000
  temp2_crit: 100.000
  temp2_crit_alarm: 0.000
Core 1:
  temp3_input: 52.000
  temp3_max: 80.000
  temp3_crit: 100.000
  temp3_crit_alarm: 0.000
Core 2:
  temp4_input: 51.000
  temp4_max: 80.000
  temp4_crit: 100.000
  temp4_crit_alarm: 0.000
Core 3:
  temp5_input: 51.000
  temp5_max: 80.000
  temp5_crit: 100.000
  temp5_crit_alarm: 0.000
 

下の画像は結果のスクリーンショットです。coretemp-isa-0001 で実行しても同様の結果が得られます。

この結果から .conkyrcに次のコードを記述してみると

${color yellowgreen}CPU1(Xeon x5365):${color blue} ${alignr} ${execi 5 sensors -u coretemp-isa-0000 | grep 'temp2_input' | cut -c16-17}℃ 
${color yellowgreen}CPU2(Xeon x5365):${color blue} ${alignr} ${execi 5 sensors -u coretemp-isa-0001 | grep 'temp2_input' | cut -c16-17}℃ 
 

となり、Conkyには下の画像のように温度が表示されます。

これで 2基の CPU温度がそれぞれ表示されるようになりました。以上が 1つ目の方法です。次のセクションでは 2つ目の方法を説明します。

▲ 目次へ

Conkyに CPU温度表示する 2

2基のCPUの Core番号(ラベル名)が同じになっているので、2基目の CPUの Core番号を変更します。/etc/ sensors.d / ディレクトリに変更内容を記述したファイルを配置します。

まずホームディレクトリに Heulett-Packard_0A08Hという名前のファイルを作成します。ファイル名は任意ですが今回はマザーボードの型番にしました。

端末から

  $ touch /home/ユーザー名/Heulett-Packard_0A08H 
 

を実行すると空のファイルが作成されるのでテキストエディタで開き、下記を記述して保存します。

gedit :

chip "coretemp-isa-0000"
  label temp2 "Core 0"
  label temp3 "Core 1"
  label temp4 "Core 2"
  label temp5 "Core 3"

chip "coretemp-isa-0001"
  label temp2 "Core 4"
  label temp3 "Core 5"
  label temp4 "Core 6"
  label temp5 "Core 7"
 

次にこのファイルを /etc/sensors.d/ ディレクトリにコピーします。

端末から

 $ sudo cp Heulett-Packard_0A08H /etc/sensors.d
 

を実行し、続けて sensorsコマンドを実行すれば次の様に Core番号が変更されます。

(結果)
i5k_amb-isa-0000 ・・・物理メモリー
Adapter: ISA adapter
   ⋮
(中略)
   ⋮

coretemp-isa-0000 ・・・CPU 1
Adapter: ISA adapter
Core 0:       +54.0°C  (high = +80.0°C, crit = +100.0°C)
Core 1:       +52.0°C  (high = +80.0°C, crit = +100.0°C)
Core 2:       +51.0°C  (high = +80.0°C, crit = +100.0°C)
Core 3:       +52.0°C  (high = +80.0°C, crit = +100.0°C)

coretemp-isa-0001 ・・・CPU 2
Adapter: ISA adapter
Core 4:       +54.0°C  (high = +80.0°C, crit = +100.0°C)
Core 5:       +50.0°C  (high = +80.0°C, crit = +100.0°C)
Core 6:       +49.0°C  (high = +80.0°C, crit = +100.0°C)
Core 7:       +50.0°C  (high = +80.0°C, crit = +100.0°C)
 

下の画像は結果のスクリーンショットです。

この結果から .conkyrcに次のコードを記述してみると

${color yellowgreen}CPU1(Xeon x5365):${color blue} ${alignr} ${execi 5 sensors | grep 'Core 0' | cut -c16-17}℃ 
${color yellowgreen}CPU2(Xeon x5365):${color blue} ${alignr} ${execi 5 sensors | grep 'Core 4' | cut -c16-17}℃ 
 

となり、これで 2基の CPU温度がそれぞれ表示されるようになります。以上が 2つ目の方法です。こちらはひと手間かかりますがソースコードは短くなります。

▲ 目次へ

カーネルモジュールがロードされない時は

上述の [Conkyに CPU温度表示する 1] セクションのデスクトップスクリーンショットで下記のように CPU と Case のファン速度が表示されません。

----------------------
FAN
 CPU :		--rpm
 Case:		--rpm
----------------------
 

これは sensorsコマンドの実行結果にファン速度が表示されず、Conky設定ファイルにコードを記述できないからですが、

本当の原因は SMSC LPC47B397-NC センサーチップのカーネルモジュール kernel driver smsc47b397 がロードされていないためです。

lm-sensrsのインストール後 sensers-detectコマンドを実行した時、最後に次のような表示がありました。

(前略)
To load everything that is needed, add this to /etc/modules:
#----cut here----
# Chip drivers
coretemp
i5k_amb
smsc47b397
#----cut here----
If you have some drivers built into your kernel, the list above will
 contain too many modules. Skip the appropriate ones!

Do you want to add these lines automatically to /etc/mdules? (yes/NO) yes 
Successful!
(後略)
 

これはユーザーが yes と入力したことで 「/etc/ディレクトリにチップドライバを記述したファイル mdulesを作成した」 わけです。

下の画像は実際の mdulesファイルのスクリーンショットです。

それぞれのドライバーの主な役割は下表になります。

coretemp CPU温度情報
i5k_amb メモリーモジュール温度情報
smsc47b397 ファン速度情報, CPU温度情報

Ubuntuのログイン画面が表示される前のブートプロセスで mdulesファイルに記述されたドライバーのカーネルモジュールがロードされる仕組みになっています。

ところが何故か smsc47b397 だけがロードされてないようで、その原因は不明です。

どうやらマザーボードによってこのような現象が起こるようで、調べた結果 Ubuntu日本語フォーラム に似たようなスレッドあり解決に至りました。

カーネルモジュール smsc47b397をロードする

smsc47b397をロードするには次のオプションを付けてカーネルを起動します。

acpi_enforce_resources=lax
 

直訳すると「ACPIのリソースを強制する」で、下記はその意味について GitHub の記述内容を Googl翻訳したものです。

ネイティブドライバーとACPI操作領域(SystemIOおよびSystemMemoryのみ)間のリソースの競合を確認します。ACPIで宣言されたIOポートとメモリは、任意のAMLコードでACPIサブシステムによって使用される可能性があり、レガシードライバーに干渉する可能性があります。

strict(デフォルト):ACPIが要求するリソースへのアクセスは拒否されます。予約済みのリソースにアクセスしようとするレガシードライバーは、それらを使用してデバイスにバインドできません。

lax:ACPIが要求するリソースへのアクセスが許可されます。予約済みリソースにアクセスしようとするレガシードライバは正常にバインドされますが、警告メッセージがログに記録されます。

no:ACPI OperationRegionsは予約済みとしてマークされておらず、それ以上のチェックは実行されません。

要するにカーネルモジュールを強制的にロードさせるわけですね。そしてこのオプションの使い方は、一時的と恒久的の 2通りあります。

PC起動または再起動後 GRUBメニューが表示されたらEキーを押すと起動コマンドを編集する画面が表示されます。

Linuxで始まるコマンドラインに acpi_enfoce_resources=laxを追加します。(最後尾の $vt_handoffの後にスペースを入れて追加してもよいです)

Linux /boot/vmlinuz-4.15.0-62…(中略)…a7df ro quiet splash acpi_enfoce_resources=lax $vt_handoff 
 

下の画像はその時の写真です。

入力したらF10キーを押せば今回限りこのオプションモードで Ubutnuが起動します。まずこの方法でロードされるのかを確認します。

一時的な方法でロードすることが出来たらGRUB設定ファイルに記述することで恒久的にロードされます。

端末から

 $ sudo nano /etc/default/grub
 

を実行し次を記述して保存します。

GRUB_COMDLINE_LINUX_DEFAULT="quiet splash acpi_enfoce_resources=lax" 
 

下の画像は GRUB設定ファイルのスクリーンショットです。

 

最後に次のコマンドを忘れずに実行します。

 $ sudo update-grub

これで設定完了です。

▲ 目次へ

Conkyに ファン速度を表示する

下記はカーネルモジュールがロードされたところで sensorsコマンドを実行してみた結果です。

(結果)
i5k_amb-isa-0000 ・・・物理メモリー
Adapter: ISA adapter
   ⋮
(中略)
   ⋮

coretemp-isa-0000 ・・・CPU 1
Adapter: ISA adapter
   ⋮
(中略)smsc47b397-isa-0480
Adapter: ISA adapter
fan1:        1200 RPM ・・・CPUクーラーファン1 
fan2:        3286 RPM ・・・メモリーファン
fan3:        1783 RPM ・・・ケースファン
fan4:        1206 RPM ・・・CPUクーラーファン2
temp1:        +46.0°C
temp2:        +52.0°C
temp3:        +35.0°C
temp4:        +37.0°C

coretemp-isa-0001 ・・・CPU 2
Adapter: ISA adapter
   ⋮
(後略)
 

下の画像は結果のスクリーンショットです。

この結果から .conkyrcに次のコードを記述してみると

${color yellowgreen}CPU1:${color yellowgreen} ${alignr}${execi 5 sensors | grep 'fan1' | cut -c14-17} rpm
${color yellowgreen}CPU2:${color yellowgreen} ${alignr}${execi 5 sensors | grep 'fan4' | cut -c14-17} rpm
${color yellowgreen}Memory:${color yellowgreen} ${alignr}${execi 5 sensors | grep 'fan2' | cut -c14-17} rpm 
${color yellowgreen}Cace:${color yellowgreen} ${alignr}${execi 5 sensors | grep 'fan3' | cut -c14-17} rpm
 

となり、Conkyには下の画像のようにファン速度が表示されます。

これで 2基のCPUクーラーだけでなく、メモリーモジュールと PCケースのファン速度も表示できるようになりました。

▲ 目次へ

雑感

ファン速度について

下の画像は今回設定した Conkyのスクリーンショットです。この中でファン速度のラベルが 4種類ありどのファンがどのラベル名に対応するのかについては Ubuntu上から調べようがありませんでした。

結局ファンの仕様書にある回転速度と照らし合わせるしか方法がなく今回の場合、回転速度の差が大きかったので特定できました。

しかし、もしも同じ回転速度だったらまったく区別出来ないところでした。環境によっては使えないようです。

参考|Windowsシステムモニターの数値

下の画像は Ubuntuと同じ SSDの第1パーティションに導入している Windows 7上のシステムモニター(HWMonitoer v1.20.0)のスクリーンショットです。

当然ですが lm-sensorsの結果とほぼ同じです。

メモリーモジュールの温度について

メモリーモジュールの温度の数値が高すぎるような気がします。理由はこのページ冒頭の写真や下の写真のような専用の冷却ファンがあるからです。

マザーボードの種類によって lm-sensorsが取得するデータにはオフセット値がずれている事があるようです。

いずれ熱電対とデータロガーを購入して実測してみます。温度差が10℃以上あるようなら /etc/sensors.d/Heulett-Packard_0A08Hファイルで補正しようと思います。

▲ 目次へ

クリエイティブ・コモンズ・ライセンス
Top of Pageの画像
sidemenuの画像