ファンスピード制御
関連記事
ファン制御はシステムに様々な恩恵をもたらします。CPU があまり使われていないときにファンを完全に停止することでシステムを静かにしたり電力を節約することが可能です。
目次
概要
デスクトップやノートパソコンのファンをコントロールする方法は複数存在します。必要に応じて選択してください:
- Fancontrol (lm-sensors) - ファンの速度を設定するスクリプト (Bash で書かれています)。デスクトップやシングルファンのディスクリートグラフィックカードが載っていないノートパソコンに適しています。
- NoteBook Fan Control (NBFC) - ノートパソコンのファンを制御するクロスプラットフォームのソリューション。C# で書かれており Mono ランタイムで動作します。Fancontrol でサポートされていない最新のノートパソコンに適しています。
- Dell ノートパソコン - 一部の Dell のノートパソコンで使用できるファン制御デーモン。
- ThinkPad ノートパソコン - 一部の ThinkPad ノートパソコンで使用できるファン設定。
- Asus ノートパソコン - Fancontrol や手動制御で一部の Asus ノートパソコンを設定。
Fancontrol (lm-sensors)
lm_sensors に含まれている fancontrol
を使うことで CPU やケースのファンの速度や音をコントロールできます。
新しいマザーボードの場合、サポートが 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 と増やしていってください。
設定
sensors を正しく設定できたら、pwmconfig
を実行してテストを行い、速度のコントロールを設定します。pwmconfig
の手順にしたがって基本速度をセットアップしてください。デフォルトの設定オプションで新しいファイル /etc/fancontrol
が作成されるはずです。
調整
生成された設定をもっと細かく調整したい場合、以下が設定ファイルの例です:
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/[your-hwmon-device]/device | sed -e 's/^\/sys\///'
DEVNAME
: デバイスの名前を設定。次を実行して下さい:
$ sed -e 's/[[:space:]=]/_/g' /sys/class/hwmon/[your-hwmon-device]/device/name
fancontrol
fancontrol を実行するには:
# /usr/bin/fancontrol
正しく設定できていればエラーが表示されずにシステムファンのコントロールが開始されます。このコマンドを実行した後、すぐにシステムファンが遅くなるのが聞こえるはずです。
fancontrol を起動時に自動的に動作させるには、fancontrol.service
を有効化してください。
非公式の GUI として fancontrol-guiAUR または fancontrol-kcmAUR をインストールして使うこともできます。
NBFC
NBFC はノートパソコンのためのクロスプラットフォームのファン制御ソリューションです。強力な設定システムを備えており、最新のノートパソコンを含めて様々なモデルのノートパソコンにあわせて調整できます。
インストール
NBFC は nbfcAUR または nbfc-gitAUR パッケージでインストールできます。インストールしたら nbfc.service
を起動・有効化してください。
設定
NBFC にはあらかじめプロファイルが付属しています。プロファイルは /opt/nbfc/Configs/
ディレクトリにインストールされます。プロファイルを使うときは、拡張子を付けずに正確なプロファイル名を使ってください (例えば some profile.xml
なら "some profile"
となります)。
NBFC が推奨するプロファイルが存在しないか確認:
$ nbfc config -r
プロファイルが存在した場合、プロファイルを使ってみてファンの速度がどのように管理されるか確認してみてください。例:
$ nbfc config -a "Asus Zenbook UX430UA"
推奨モデルが存在しない場合、NBFC の git リポジトリ や /opt/nbfc/Configs/
を開いて同じメーカーから製造された類似機種が存在しないか確認してください。例えば Asus Zenbook UX430UQ の場合、Asus Zenbook UX430UA の設定は全く機能しませんが (ファンが常に停止した状態になります)、Asus Zenbook UX410UQ の設定は上手く機能します。
オプションを確認するには nbfc
を実行してください。詳しい情報は 上流のページ を参照してください。
Dell ノートパソコン
i8kutilsAUR は Dell Inspiron や Latitude ノートパソコンでファンの速度を制御するデーモンです。dell_smm_hwmon
ドライバー (旧名 i8k
) による /proc/i8k
インターフェイスが利用されます。ノートパソコンの機種によって結果は変わります。
インストール
ファンの速度を制御するメインのパッケージは i8kutilsAUR です。必要に応じて以下のパッケージもインストールしてください:
- (
--daemon
オプションを使用して)i8kmon
をバックグラウンドサービスとして実行するには tcl のインストールが必要です。 - X11 デスクトップアプレットを実行するには tk と tcl も必要です。
設定
デフォルトでは 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[リンク切れ: 置換パッケージ: gcc] が必要です。i8kutils
のソースにある smm.c
ファイルを見つけてコンパイルしてください:
$ gcc -m32 -o smm smm.c
BIOS によるファンの速度制御を無効化するには、以下のコマンドを root で実行:
# ./smm 30a3
再度有効化するには:
# ./smm 31a3
サービスとしてインストール
以下のようなユニットファイルを使うことで 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
ThinkPad ノートパソコン
デフォルトでは、組み込みコントローラ (EC) がファンの速度を制御します。速度が遅すぎる、または音がうるさい場合、デーモンを使用することで制御を乗っ取ることができます。ただし危険性も伴います: あなたが責任を持って温度をコントロールしなければならなくなります。過度の高温はノートパソコンの寿命が縮まったり、致命的なダメージを与える可能性があります。安全上の理由からファンの制御はデフォルトで無効になっています。ファンの制御を有効にするには、カーネルパラメータに fan_control=1
を追加してください。
現在 AUR からインストールすることができるファン制御デーモンは simpfand-gitAUR と thinkfanAUR です。
インストール
thinkfanAUR をインストールしてください。インストールしたら、パッケージに含まれているファイルを確認してください:
# pacman -Ql thinkfan
thinkfan パッケージは以下の内容の /usr/lib/modprobe.d/thinkpad_acpi.conf
をインストールするため、ファン制御はデフォルトで有効になります:
options thinkpad_acpi fan_control=1
ファンのレベルを確認するには:
$ su # modprobe thinkpad_acpi # cat /proc/acpi/ibm/fan
デフォルトではファンレベルが "auto" になっているはずです。/proc/acpi/ibm/fan
に設定したいレベルを echo することで手動でファンの速度を制御できます。thinkfan デーモンは自動的に設定を行います。
サンプル設定ファイルのどれか (例: /usr/share/doc/thinkfan/examples/thinkfan.conf.simple
) を /etc/thinkfan.conf
にコピーして、必要に応じて編集してください。このファイルではどのセンサーを読み込むのか指定したり、ファンを制御するのに使用するインターフェイスを指定します。/proc/acpi/ibm/fan
が使用できない場合、汎用の hwmon センサーが使われるように以下のように指定する必要があります:
hwmon /sys/devices/virtual/thermal/thermal_zone0/temp
実行
thinkfan を手動で (root で) 実行して設定をテストできます:
# thinkfan -n
他のプログラムを実行してみて負担によってどのようにファンが変わるか確認してください。
適切に設定できたら、以下のコマンドで thinkfan コマンドを起動できます (root で実行):
# systemctl start thinkfan
もしくはシステムの起動時に自動的にロードするには:
# systemctl enable thinkfan
消滅した古いパッケージ
tpfandAUR[リンク切れ: アーカイブ: aur-mirror] と tpfand-no-halAUR[リンク切れ: アーカイブ: aur-mirror] (HAL 不要版) はすでに開発が止まっており、インストールできません。AUR に存在していた GTK+ フロントエンドの tpfan-adminAUR[リンク切れ: アーカイブ: aur-mirror] パッケージは温度の監視や分岐点を視覚的に変更することができました。
tpfand が開発されなくなったことにより、tpfanco と呼ばれるフォークが存在していました (実行ファイルの名前は tpfand と同じです): tpfanco-svnAUR[リンク切れ: アーカイブ: aur-mirror]。
tpfand の設定ファイルは /etc/tpfand.conf
でした (tpfanco も同じファイルを使用します)。
さらに、AUR の tpfand-profilesAUR[リンク切れ: アーカイブ: aur-mirror] パッケージは様々な thinkpad モデルの最新のファンプロファイルを提供していました。
Asus ノートパソコン
このセクションでは Fancontrol (lm-sensors) の Asus ノートパソコンでのドライバー設定について説明します。
カーネルモジュールの概要
- asus-nb-wmi は Linux カーネルに含まれているカーネルモジュールで、Asus 製ノートパソコンでは自動的にロードされます。制御できるのはシングルファンだけで、ファンがふたつある場合、制御することはできません。このモジュールをブラックリストに追加するとキーボードバックライトが動作しなくなります。
- asus_fan は一部の古い Asus ノートパソコンのファンを制御できるカーネルモジュールです。最新のモデルでは機能しません。
設定ファイルでは sysfs ファイルのフルパスを使います (例: /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1
)。hwmon1 という名前は再起動した後に他の番号に変わってしまう可能性があるためです。Fancontrol (lm-sensors) は Bash で書かれているため、設定ファイルではフルパスを使うことが可能です。完全な /etc/fancontrol
の設定例は ASUS N550JV#Fan control を参照してください。
asus-nb-wmi
asus-nb-wmi
カーネルモジュールはカーネルに含まれているため特にパッケージのインストールは必要ありません。
以下が制御するコマンドです。ファンを制御できるかどうか確認してください:
# echo 255 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1 # Full fan speed (Value: 255) # echo 0 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1 # Fan is stopped (Value: 0) # echo 2 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[[:print:]]*/pwm1_enable # Change fan mode to automatic # echo 1 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1_enable # Change fan mode to manual
上記のコマンドでファンを制御できたら #pmwconfig で設定ファイルを生成に進んでください。
asus_fan
asus-fan-dkms-gitAUR をインストールしてください。カーネルモジュールをロード:
# modprobe asus_fan
ファンを制御できるかどうか確認してください:
# echo 255 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm1 # Full CPU fan speed (Value: 255) # echo 0 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm1 # CPU fan is stopped (Value: 0) # echo 255 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm1 # Full GFX fan speed (Value: 255) # echo 0 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm1 # GFX fan is stopped (Value: 0) # echo 2 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm1_enable # Change CPU fan mode to automatic # echo 1 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm1_enable # Change CPU fan mode to manual # echo 2 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm2_enable # Change GFX fan mode to automatic # echo 1 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm2_enable # Change GFX fan mode to manual # cat /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/temp1_input # Display GFX temperature (will always be 0 when GFX is disabled/unused)
問題なく機能するようであれば、起動時にカーネルモジュールをロードするように設定すると良いでしょう:
/etc/modules-load.d/asus_fan.conf
# Load asus_fan module on boot: asus_fan
#pmwconfig で設定ファイルを生成に進んでください。
pmwconfig で設定ファイルを生成
pwmconfig
で設定ファイルを生成したときに There are no working fan sensors, all readings are 0
というエラーが表示される場合、コンソールを開いて以下のコマンドを実行してください:
# watch -n 1 "echo 2 > /sys/devices/platform/<kernel_module>/hwmon/hwmon[[:print:]]*/pwm1_enable"
asus_fan
カーネルモジュールを使っていてファンが2個搭載されている場合、別のコンソールで以下のコマンドを実行してください:
# watch -n 1 "echo 2 > /sys/devices/platform/<kernel_module>/hwmon/hwmon[[:print:]]*/pwm2_enable"
最後に、別のコンソールで以下のコマンドを実行:
# pwmconfig
設定ファイルが生成されたら、watch コマンドを実行しているコンソールは止めてください。Fancontrol (lm-sensors) に進んでください。
AMDGPU の sysfs によるファン制御
AMDGPU kernel driver offers fan control for graphics cards via hwmon in sysfs.
Configuration of manual control
To switch to manual fan control from automatic, run
# echo "1" > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1_enable
Set up fan speed to e.g. 50% (100% are 255 PWM cycles, thus calculate desired fan speed percentage by multiplying its value by 2.55):
# echo "128" > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1
To reset to automatic fan control, run
# echo "2" > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1_enable
amdgpu-fan
The amdgpu-fanAUR package is an automated fan controller for AMDGPU-enabled video cards written in Python. It uses a "speed-matrix" to match the frequency of the fans with the temperature of the GPU, for example:
speed_matrix: # -[temp(*C), speed(0-100%)] - [0, 0] - [40, 30] - [60, 50] - [80, 100]
Launch the fan control service by starting/enabling amdgpu-fan.service
.
amdfand-bin
Then amdfand-binAUR package is an native alternative to amdgpu-fanAUR. Launch the fan control service by starting/enabling amdfand.service
.
For this tool there are also GUI clients available: amdguid-glow-binAUR (Xorg) and amdguid-wayland-binAUR (Wayland). Before starting the client you need to enable/start amdgui-helper.service
.
fancurve script
Not just fan controls are offered via hwmon in sysfs, but also GPU temperature reading:
cat /sys/class/drm/card0/device/hwmon/hwmon0/temp1_input
This outputs GPU temperature in °C + three zeroes, e.g. 33000
for 33°C.
The bash script amdgpu-fancontrol by grmat offers a fully automatic fan control by using the described sysfs hwmon functionality. It also allows to comfortably adjust the fancurve's temperature/PWM cycles assignments and a hysteresis by offering abstracted configuration fields at the top of the script.
For safety reasons, the script sets fan control again to auto when shutting down. This may cause spinning up of fans, which can be worked around at cost of security by setting set_fanmode 1
in the section function reset_on_fail
.
Setting up fancurve script
To start the script, it is recommend to do so via systemd init system. This way the script's verbose output can be read via journalctl/systemctl status. For this purpose, a .service unit file is already included in the GitHub repository.
It may also be required to restart the script via a root-resume.service after hibernation in order to make it automatically function properly again:
/etc/systemd/system/root-resume.service
[Unit] Description=Local system resume actions After=suspend.target [Service] Type=simple ExecStart=/usr/bin/systemctl restart amdgpu-fancontrol.service [Install] WantedBy=suspend.target