ConkyにマルチCPUのコア温度とファン速度を表示する
手持ちの HP xw8400ワークステーション はマルチコアCPUを 2基搭載しています。2011年に中古で購入してカスタマイズしたものですが 2019年9月現在も現役です。
今回この CPUのそれぞれのコア温度とファン速度をハードウェア監視アプリである lm-sensors を使って Ubuntu 18.04LTS GNOMEデスクトップのシステムモニターConkyに表示してみました。
このページでは Conky設定ファイルに記述するコードを導く方法を掲載しています。(2019/09)
アプリケーションパッケージ
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通りあります。
一時的:GRUBメニューで設定
PC起動または再起動後 GRUBメニューが表示されたらEキーを押すと起動コマンドを編集する画面が表示されます。
Linuxで始まるコマンドラインに acpi_enforce_resources=laxを追加します。(最後尾の $vt_handoffの後にスペースを入れて追加してもよいです)
Linux /boot/vmlinuz-4.15.0-62…(中略)…a7df ro quiet splash acpi_enforce_resources=lax $vt_handoff
下の画像はその時の写真です。
入力したらF10キーを押せば今回限りこのオプションモードで Ubutnuが起動します。まずこの方法でロードされるのかを確認します。
恒久的:GRUB設定ファイルに記述
一時的な方法でロードすることが出来たらGRUB設定ファイルに記述することで恒久的にロードされます。
端末から
$ sudo nano /etc/default/grub
を実行し次を記述して保存します。
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi_enforce_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ファイルで補正しようと思います。