xmobarにRyzenの温度を表示させる
問題
AMD Ryzen環境でxmobarの ThermalZone が動かなくて温度が計測できなかった。
Linuxカーネルを6.0.2にしてk10tempをRyzen 7000シリーズ対応にすれば良いと思っていたので意外な結果でした。 Ryzen Threadripperでも同じでした。前からこういう状態だったけどカーネルの問題だと思っていたので放置していました。温度表示は必須の項目ではないですし。流石にずっとサポートされないし、おかしいなと思って調べることにしました。
Intel Core第8世代を使っているラップトップPCでは正常に動いていました。
原因
Linuxカーネルのk10tempが正常に働いていても、
/sys/class/thermal
がIntel環境と大きく異なり、
thermal_zone0
が存在しません。
自分の環境では以下のようになっています。
/sys/class/thermal🔒
2022-10-18T21:18:21 ❯ ll
合計 0
drwxr-xr-x 2 root root 0 10月 18 21:11 ./
drwxr-xr-x 60 root root 0 10月 18 21:11 ../
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device0 -> ../../devices/virtual/thermal/cooling_device0/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device1 -> ../../devices/virtual/thermal/cooling_device1/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device2 -> ../../devices/virtual/thermal/cooling_device2/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device3 -> ../../devices/virtual/thermal/cooling_device3/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device4 -> ../../devices/virtual/thermal/cooling_device4/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device5 -> ../../devices/virtual/thermal/cooling_device5/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device6 -> ../../devices/virtual/thermal/cooling_device6/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device7 -> ../../devices/virtual/thermal/cooling_device7/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device8 -> ../../devices/virtual/thermal/cooling_device8/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device9 -> ../../devices/virtual/thermal/cooling_device9/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device10 -> ../../devices/virtual/thermal/cooling_device10/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device11 -> ../../devices/virtual/thermal/cooling_device11/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device12 -> ../../devices/virtual/thermal/cooling_device12/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device13 -> ../../devices/virtual/thermal/cooling_device13/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device14 -> ../../devices/virtual/thermal/cooling_device14/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device15 -> ../../devices/virtual/thermal/cooling_device15/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device16 -> ../../devices/virtual/thermal/cooling_device16/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device17 -> ../../devices/virtual/thermal/cooling_device17/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device18 -> ../../devices/virtual/thermal/cooling_device18/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device19 -> ../../devices/virtual/thermal/cooling_device19/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device20 -> ../../devices/virtual/thermal/cooling_device20/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device21 -> ../../devices/virtual/thermal/cooling_device21/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device22 -> ../../devices/virtual/thermal/cooling_device22/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device23 -> ../../devices/virtual/thermal/cooling_device23/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device24 -> ../../devices/virtual/thermal/cooling_device24/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device25 -> ../../devices/virtual/thermal/cooling_device25/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device26 -> ../../devices/virtual/thermal/cooling_device26/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device27 -> ../../devices/virtual/thermal/cooling_device27/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device28 -> ../../devices/virtual/thermal/cooling_device28/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device29 -> ../../devices/virtual/thermal/cooling_device29/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device30 -> ../../devices/virtual/thermal/cooling_device30/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device31 -> ../../devices/virtual/thermal/cooling_device31/
lrwxrwxrwx 1 root root 0 10月 18 21:11 cooling_device32 -> ../../devices/virtual/thermal/cooling_device32/
MultiCoreTempでパスを与える解決策
How to use k10temp in xmobar? : xmonad
を見て知ったのですが、
MultiCoreTemp
の方は読み込むパスを環境に合わせて調整できるため、自分の場合(Ryzen 7950X使用)は、
Run MultiCoreTemp ["-t", "<avg>°C", "-hwmonitor-path", "/sys/module/k10temp/drivers/pci:k10temp/0000:00:18.3/hwmon/hwmon0"] 100
のように記述すれば温度が得られます。
K10Tempを使う解決策
確か前調べたときは存在しなかったと思うのですが、 K10Temp というそのものズバリなプラグインが存在していました。
自分の場合は、
Run K10Temp "0000:00:18.3" [] 100
のように記述しておけば温度が取得できました。指定する数値はさきほどと同じく、
/sys/bus/pci/drivers/k10temp/
のディレクトリを確認すれば良いです。
テンプレートは基本的にデフォルトのTemp: <Tdie>C
で問題ないようです。
Tctl
の方はファンコントロール用の温度で、他はccd個別の温度です。
ちなみにHWiNFOの画面を見てもらえるとわかるのだが、CPUの温度が「CPU(Tctl)」「CPU(Tdie)」「CPU」と3つある。先の2つはCPUから読み取れる温度で、CPU(Tctl)はUEFIなどで読み取れる値、CPU(Tdie)は実際のダイ温度、CPUはマザーボードのセンサーから読み取る値となっている。CPU(Tctl)はCPU(Tdie)に10度加えた値となっているので気にしないこととし、今回は「CPU(Tdie)」と「CPU」の2つの値に注目して検証していこう。なお単純に「CPU」と書くと紛らわしいため、「CPU(M)」としておく。
ASCII.jp:X370&第2世代Ryzenの挙動に迫る!「G-Master Hydro X470A」で検証 (3/3)
設定の出し分け
これでAMDとIntelで.xmobarrc
が異なるようになったのですが、
xmobarの設定もGitで管理したいため、
.xmobarrc
がデバイスごとに異なると大変です。
xmobarもxmonadと同じくライブラリとしても提供されているので、最初はxmonadのようにソースコードを書いてビルドして、
Haskellによる条件分岐で同一ソースで一部だけ変更しようかと思いましたが、
statusBar
に渡せるのがコマンド名だけなので接続方法が分からなくて断念しました。いやxmobarを設定したものを自前でビルドすれば良さそうではあるのですが、それなら別にバイナリ利用でも問題ないかなと思いました。
今回は単純にシェルスクリプトでシンボリックリンクの張り先を変えることにして対応することにしました。
hostname=$(hostname)
ln -sfv .xmonad/.xmobarrc-$hostname .xmobarrc