ファンスピード制御

提供: ArchWiki
2016年10月26日 (水) 00:13時点におけるKusakata (トーク | 投稿記録)による版 (同期)
ナビゲーションに移動 検索に移動

関連記事

lm_sensors に含まれている fancontrol を使うことで CPU やケースのファンの速度や音をコントロールできます。この記事ではユーティリティの設定とセットアップについて扱います。

Dell のノートパソコンでは、i8kutils が使えます。

センサードライバー

新しいマザーボードの場合、サポートが Linux カーネルにまだ入っていない可能性があります。公式の lm-sensors デバイス表 を確認して、そのようなマザーボードの場合、実験的なドライバーが使えるかどうか見て下さい。

fancontrol に必要なモジュールをロードするのに lm_sensors.service を使うのは推奨されません。代わりに、モジュールを /etc/modules-load.d/load_these.conf に手動で記述してください。モジュールがロードされる順番によって hwmon に必要なシンボリックリンクが作成される順番が決まるからです。言い換えれば、lm_sensors.service を使用すると起動する度に何が起きるかわからなくなり、一貫性の観点からファンコントロールの設定ファイルが無意味になってしまいます。

/etc/conf.d/lm_sensors でモジュールを確認できます。モジュールが存在しない場合、root で sensors-detect を実行してください。modules-load.d ファイルでは1行毎に1つのモジュールを記述します。モジュールを指定すると再現可能な順番が作成されます。設定ファイルで絶対的なデバイス名を使用するという方法もあります [1]

lm-sensors

lm_sensors をセットアップしてください。

$ sensors
coretemp-isa-0000
Adapter: ISA adapter
Core 0:      +29.0°C  (high = +76.0°C, crit = +100.0°C)  

[...]

it8718-isa-0290
Adapter: ISA adapter
Vcc:         +1.14 V  (min =  +0.00 V, max =  +4.08 V)   
VTT:         +2.08 V  (min =  +0.00 V, max =  +4.08 V)   
+3.3V:       +3.33 V  (min =  +0.00 V, max =  +4.08 V)   
NB Vcore:    +0.03 V  (min =  +0.00 V, max =  +4.08 V)   
VDRAM:       +2.13 V  (min =  +0.00 V, max =  +4.08 V)   
fan1:        690 RPM  (min =   10 RPM)
temp1:       +37.5°C  (low  = +129.5°C, high = +129.5°C)  sensor = thermistor
temp2:       +25.0°C  (low  = +127.0°C, high = +127.0°C)  sensor = thermal diode

出力に CPU ファンの RPM の値が表示されない場合、fan divisor を増やす必要があります。ファンの速度が表示され0よりも高い場合は、次のステップにスキップしてください。

fan_div の増加

sensors の出力の1行目は温度や電圧を調べるためにマザーボードによって使用されるチップセットです。

/etc/sensors.d/ にファイルを作成してください:

/etc/sensors.d/fan-speed-control.conf
chip "coretemp-isa-*"
set fanX_div 4

coretemp-isa- はチップセットの名前に、X は変更する CPU の番号に置き換えてください。

ファイルを保存して、root で実行:

# sensors -s

このコマンドは設定ファイルをリロードします。もう一度 sensors を実行して、RPM が正しく読み出されたか確認して下さい。読み出されない場合は、divisor を 8, 16, 32 と増やしていってください。

設定

ノート: 経験者はこのセクションをスキップして /etc/fancontrol を自分で書くことで、ファンが最大速度で回らないようにすることができます。

sensors を正しく設定できたら、pwmconfig を実行してテストを行い、速度のコントロールを設定します。pwmconfig の手順にしたがって基本速度をセットアップしてください。デフォルトの設定オプションで新しいファイル /etc/fancontrol が作成されるはずです。

調整

警告: 以下の手順ではファンの速度を調整します。実行する前に CPU の負担度が低いことを確認してください。
ノート: 環境によっては、スクリプトがエラーを報告することがあります。エラーは無視して問題ありません。問題は PWM が上下するまでスクリプトが待てないことです。

生成された設定をもっと細かく調整したい場合、以下が設定ファイルの例です:

INTERVAL=10
DEVPATH=hwmon0=devices/platform/coretemp.0 hwmon2=devices/platform/w83627ehf.656
DEVNAME=hwmon0=coretemp hwmon2=w83627dhg
FCTEMPS=hwmon0/device/pwm1=hwmon0/device/temp1_input
FCFANS= hwmon0/device/pwm1=hwmon0/device/fan1_input
MINTEMP=hwmon0/device/pwm1=20
MAXTEMP=hwmon0/device/pwm1=55
MINSTART=hwmon0/device/pwm1=150
MINSTOP=hwmon0/device/pwm1=105
  • INTERVAL: デーモンが CPU 温度を問い合せてファンの速度を調整する頻度。INTERVAL は秒数で指定します。

設定ファイルの残りの部分は設定オプションごとに (少なくとも) 2つの値に分けられます。それぞれの設定オプションではまずファンの速度を設定するのに書き出される PWM デバイスが指定されており、次の"フィールド"が実際に設定する値となっています。これによって複数のファンと温度の監視・コントロールが可能です。

  • FCTEMPS: CPU 温度を読み込むための温度インプットデバイス。上記の例では /sys/class/hwmon/hwmon0/device/temp1_input
  • FCFANS: (温度と同じように) /sys/class/hwmon/hwmon0/device/fan1_input で読み込むことができる、現在のファン速度。
  • MINTEMP: CPU ファンを止める温度 (°C)。効率的な CPU はアイドル状態のときファンを必要としません。安全だということが確認できる温度の範囲内で設定してください。この値を0に設定するのは推奨されません。ハードウェアが壊れてしまう可能性があります。
  • MAXTEMP: ファンを最大速度で回す温度 (°C)。CPU が壊れたりシャットダウンする温度から10か20ほど低い温度に設定するべきです (°C)。この値を MINTEMP に近づけるとファンがずっと高回転することになります。
  • MINSTOP: ファンが回転を停止する PWM の値。ファンごとに値を少し変えます。/sys/class/hwmon/hwmon0/device/pwm1 に異なる値を echo (0 から 255 の間) して CPU ファンを監視することで調整できます。CPU ファンが停止したら、その値を使って下さい。
  • MINSTART: ファンが回転をもう一度開始する PWM の値。大きな電圧が必要になるので普通は MINSTOP より高い値にします。

さらに設定ファイルが最新であることを fancontrol が検証するのに必要な2つの設定があります。設定名とイコール記号で始まって、スペースで区切られた hwmon-class-device=setting のグループが後ろに付く行です。設定のどこかに使用する hwmon クラスデバイスごとに設定を指定しないと、fancontrol は動作しません。

  • DEVPATH: 物理デバイスを設定。次のコマンドを実行することで確認できます:
readlink -f /sys/class/hwmon/hwmon-device/device | sed -e 's/^\/sys\///'
  • DEVNAME: デバイスの名前を設定。次を実行して下さい:
$ sed -e 's/[[:space:]=]/_/g' /sys/class/hwmon/hwmon-device/device/name
ヒント:
  • MAXPWMMINPWM オプションを使ってファンの速度の範囲を制限できます。詳しくは fancontrol のマニュアルページを見て下さい。
  • モジュールのロードのタイミングによって、再起動で DEVPATH だけでなく温度センサーのパスも変わることがあります (hwmon0/device/temp1_input が hwmon0/temp1_input になる)。これは大抵カーネルの更新時に起こります。システムログをチェックしてトラブルメーカーが誰なのか確認して下さい: # systemctl status fancontrol.service。そして設定ファイルを適切に修正して下さい。

fancontrol

fancontrol を実行するには:

# /usr/bin/fancontrol

正しく設定できていればエラーが表示されずにシステムファンのコントロールが開始されます。このコマンドを実行した後、すぐにシステムファンが遅くなるのが聞こえるはずです。

fancontrol を起動時に自動的に動作させるには、fancontrol.service有効化してください。

ノート: カーネルをアップグレード・変更する際、fancontrol を実行しているとデバイスパスが変わってエラーが発生することがあります。sensors-detect を実行してシステムを再起動すれば問題は解決します。

i8kutils

i8kutilsAUR は Dell Inspiron や Latitude ノートパソコンでファンの速度を制御する手段を提供します。dell_smm_hwmon ドライバー (旧名 i8k) による /proc/i8k インターフェイスが利用されます。ノートパソコンの機種によって結果は変わります。

依存パッケージ

(--daemon オプションを使用して) i8kmon をバックグラウンドサービスとして実行するには tcl のインストールが必要です。X11 デスクトップアプレットを実行するには tk も必要です。

設定

デフォルトでは i8kmon は CPU の温度やファンの速度を受動的に監視することしかしません。ファン速度の制御を有効にするには、--auto オプションを使用して実行するか、あるいは /etc/i8kutils/i8kmon.conf で永続的にオプションを有効にしてください:

set config(auto)       1

同じ設定ファイルでファンの速度が変化する温度を調整できます。使用できるファンの速度は3つだけです (high, low, off)。以下のようになっているセクションを見てください:

set config(0)  {{0 0}  -1  55  -1  55}
set config(1)  {{1 1}  45  75  45  75}
set config(2)  {{2 2}  65 128  65 128}

上記の例では CPU 温度が 55 °C に達したらファンを低速で回し始め、75 °C で高速に切り替えます。65 °C まで温度が落ちたら低速に戻り、45 °C になったらファンは完全に停止します。

BIOS によるファンスピード制御を無効化

i8kmon で制御できない場合は BIOS によるファンの速度コントロールをオフにする必要があります。ノートパソコンによっては smm ユーティリティを使ってオフにできます。このユーティリティは I/O ポートに直接書き込みを行ってプロセッサの System Management Mode を呼び出すため非常に危険です。自己責任で使ってください。

smm は手動でコンパイル・インストールする必要があります。64ビット環境では、gcc-multilib が必要です。i8kutils のソースにある smm.c ファイルを見つけてコンパイルしてください:

$ gcc -m32 -o smm smm.c

BIOS によるファンの速度制御を無効化するには、以下のコマンドを root で実行:

# ./smm 30a3

再度有効化するには:

# ./smm 31a3
ノート: 上記のコマンドは BIOS による他の電源管理機能も無効化してしまうことがあり、電源ボタンが押されたことを Linux から認識できなくなったりする可能性があります。

サービスとしてインストール

以下のようなユニットファイルを使うことで systemd サービスとして i8kmon を自動で起動できます:

/etc/systemd/system/i8kmon.service
[Unit]
Description=i8kmon

[Service]
#ExecStartPre=/usr/bin/smm 30a3  # uncomment to disable BIOS fan control
#ExecStopPost=/usr/bin/smm 31a3  # ... and re-enable it afterwards
ExecStart=/usr/bin/i8kmon -d
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target