Linux で MSI B550M シリーズマザーボードのセンサーデータが読めない問題を解決する

簡体字中国語からAIで翻訳しました。原文を読む

6月末ごろ、All-in-One ミニマシンを組みました。マザーボードは MSI の B550M PRO-VDH で、Proxmox VE(Debian ベース)をインストールしたところ、lm-sensors で取得できるデータが少なすぎて、温度も全部は取れませんでした

取得できたのはこれだけでした:

root@home:~# sensors
nvme-pci-0100
Adapter: PCI adapter
Composite:    +38.9°C  (low  = -273.1°C, high = +89.8°C)
                       (crit = +94.8°C)
Sensor 1:     +38.9°C  (low  = -273.1°C, high = +65261.8°C)
Sensor 2:     +36.9°C  (low  = -273.1°C, high = +65261.8°C)

k10temp-pci-00c3
Adapter: PCI adapter
Tctl:         +41.0°C
Tccd1:        +40.0°C

Reddit を確認してみると、同じような問題に遭遇している人がいました。原因は、Linux カーネルが MSI B550M シリーズのマザーボードで使われている Nuvoton NCT6687-R コントローラーチップをネイティブサポートしていないことで、自分でサードパーティ製のカーネルモジュールを読み込む必要があります:Fred78290/nct6687d

また、Secure Boot を有効にしているため、カーネルモジュールは署名されていないと読み込めません。そのため、MOK (Machine Owner Key) と DKMS (Dynamic Kernel Module Support) のモジュール自動署名を設定する必要があります

MOK の生成と登録

Debian Wiki の Secure Boot の章によると、Ubuntu と合わせるために MOK は /var/lib/shim-signed/mok/ ディレクトリに置くべきだそうなので、openssl で MOK を生成します:

mkdir -p /var/lib/shim-signed/mok/

cd /var/lib/shim-signed/mok/

openssl req -nodes -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -days 36500 -subj "/CN=Kernel Signing MOK/"

openssl x509 -inform der -in MOK.der -out MOK.pem

MOK を作成したら、mokutil で登録します:

mokutil --import /var/lib/shim-signed/mok/MOK.der

求めに従って登録用のワンタイムパスワードを設定し、控えてから再起動します

reboot

次に画面の指示に従って MOK の登録を選択し、先ほど設定したワンタイムパスワードを入力して登録を確定します

起動後に、MOK が正常に登録されたか確認できます:

mokutil --test-key /var/lib/shim-signed/mok/MOK.der

DKMS の設定

自分の Proxmox VE には DKMS が入っていないようなので、手動でインストールします:

apt-get update
apt-get install dkms

次に /etc/dkms/framework.conf を編集し、コメントアウトされている mok_signing_key と mok_certificate を見つけてコメントを外し、先ほどの MOK の場所に変更します

# Location of the key and certificate files used for Secure boot. $kernelver
# can be used in path to represent the target kernel version.
# mok_signing_key can also be a "pkcs11:..." string for PKCS#11 engine, as
# long as the sign_file program supports it.
# (default: /var/lib/dkms):
mok_signing_key=/var/lib/shim-signed/mok/MOK.priv
mok_certificate=/var/lib/shim-signed/mok/MOK.der

モジュールのビルドとインストール

リポジトリをクローンしてビルドします。以下は deb パッケージをビルドしてインストールする手順です。Proxmox VE では build-essential やカーネルヘッダーなど、いくつか足りないパッケージを求められるかもしれません。とにかく足りないものを入れてください (o゜▽゜)o☆

他のディストリビューションでは Fred78290/nct6687d の README.md を参考にしてください

cd /tmp
git clone https://github.com/Fred78290/nct6687d
cd nct6687d
make deb
dpkg -i ../nct6687d-dkms_*.deb

インストールが完了したら /etc/modules ファイルを編集し、nct6687 を追加します:

root@home:~# cat /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.

nct6687

あとは再起動するか、modprobe nct6687d でモジュールを読み込みます

sensors-detect を再実行

sensors-detect

あとは y で進めていけば OK です。では、sensors の結果を見てみましょう:

root@home:~# sensors
nct6687-isa-0a20
Adapter: ISA adapter
+12V:           12.12 V  (min = +12.12 V, max = +12.14 V)
+5V:             5.08 V  (min =  +5.07 V, max =  +5.08 V)
+3.3V:           3.34 V  (min =  +0.00 V, max =  +3.34 V)
CPU Soc:       998.00 mV (min =  +1.00 V, max =  +1.00 V)
CPU Vcore:       1.17 V  (min =  +0.24 V, max =  +1.17 V)
CPU 1P8:         1.83 V  (min =  +1.83 V, max =  +1.83 V)
CPU VDDP:        0.00 V  (min =  +0.00 V, max =  +0.00 V)
DRAM:            1.35 V  (min =  +1.35 V, max =  +1.36 V)
Chipset:       784.00 mV (min =  +0.78 V, max =  +0.89 V)
CPU SA:        694.00 mV (min =  +0.69 V, max =  +0.86 V)
Voltage #2:      1.52 V  (min =  +1.52 V, max =  +1.53 V)
AVCC3:           3.38 V  (min =  +3.38 V, max =  +3.38 V)
AVSB:            3.34 V  (min =  +0.00 V, max =  +3.34 V)
VBat:            1.83 V  (min =  +0.00 V, max =  +1.83 V)
CPU Fan:        920 RPM  (min =  758 RPM, max =  920 RPM)
Pump Fan:         0 RPM  (min =    0 RPM, max =    0 RPM)
System Fan #1: 2238 RPM  (min = 2097 RPM, max = 2238 RPM)
System Fan #2:    0 RPM  (min =    0 RPM, max =    0 RPM)
System Fan #3:    0 RPM  (min =    0 RPM, max =    0 RPM)
System Fan #4:    0 RPM  (min =    0 RPM, max =    0 RPM)
System Fan #5:    0 RPM  (min =    0 RPM, max =    0 RPM)
System Fan #6:    0 RPM  (min =    0 RPM, max =    0 RPM)
CPU:            +45.0°C  (low  = +38.0°C, high = +45.0°C)
System:         +42.5°C  (low  = +35.0°C, high = +42.5°C)
VRM MOS:        +40.5°C  (low  = +33.0°C, high = +40.5°C)
PCH:            +43.5°C  (low  = +34.0°C, high = +43.5°C)
CPU Socket:     +40.0°C  (low  = +33.0°C, high = +40.0°C)
PCIe x1:        +38.0°C  (low  = +32.0°C, high = +38.0°C)
M2_1:            +0.0°C  (low  =  +0.0°C, high =  +0.0°C)

nvme-pci-0100
Adapter: PCI adapter
Composite:    +38.9°C  (low  = -273.1°C, high = +89.8°C)
                       (crit = +94.8°C)
Sensor 1:     +38.9°C  (low  = -273.1°C, high = +65261.8°C)
Sensor 2:     +36.9°C  (low  = -273.1°C, high = +65261.8°C)

k10temp-pci-00c3
Adapter: PCI adapter
Tctl:         +45.4°C
Tccd1:        +42.5°C

じゃじゃーん (≧∇≦)ノ

カーネルアップグレードへの対応

Proxmox VE で apt dist-upgrade を実行してカーネルをアップグレードしたところ、次のようなメッセージが出ました:

dkms: autoinstall for kernel 6.8.8-4-pve was skipped since the kernel headers for this kernel do not seem to be installed.

これは新しいカーネルのヘッダーがインストールされていないためです(以前は特定バージョンのヘッダーをインストールしていました)。ここでは以前インストールした特定バージョンのヘッダーをアンインストールし、proxmox-headers-6.8 メタパッケージ(常に PVE カーネル 6.8 系の最新バージョンを指す)をインストールします。こうすれば apt dist-upgrade を実行するたびにヘッダーもカーネルと一緒に更新されます

reboot した後に dkms autoinstall を実行すれば完了です