はじめに (対象読者・この記事でわかること)

この記事は、Linuxマシンのファン回転数を「見たい」「抑えたい」「自動化したい」と考えている方を対象にしています。特に自宅サーバーやゲーミングPCをLinuxで運用していて「ファンがうるさい」「温度が気になる」「BIOSで制限できない」という悩みを抱えている方に最適です。

記事を読むことで、lm-sensorsで温度・回転数を取得し、fancontrolで自動制御するまでの一連の手順がわかります。Ubuntu/Debian系をメインに、トラブルシューティングも含めて解説しますので、手元のマシンですぐに試せます。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 - Linuxのターミナルでコマンドを打ったことがある - sudoで管理者権限を使った経験がある - BIOS/UEFIにアクセスできる環境を持っている

なぜLinuxでファン制御が必要なのか

WindowsやmacOSではメーカー提供のアプリで静かにできることが多いですが、Linuxではドライバが不足していたり、ファームウェアが手薄だったりして「ファンがフル回転のまま」になりがちです。特にMini-ITXマザーや自作サーバー、ノートPCの換装モデルでは顕著です。

lm-sensorsはカーネルが読み取れるハードウェア・モニタリングチップ(Super I/OやEC)のレジスタを直接読み出し、温度・電圧・回転数をリアルタイムで表示します。fancontrolはその数値をもとに、PID制御でファンの回転数を調整し、冷却と静音のバランスを保ちます。両者ともGPLで公開されており、ほぼ全てのディストリビューションのリポジトリに含まれています。

lm-sensorsで回転数を取得し、fancontrolで自動制御する

ステップ1:lm-sensorsのインストールと初期検出

まず、パッケージマネージャからlm-sensorsをインストールします。Ubuntu/Debian系なら:

Bash
sudo apt update sudo apt install lm-sensors fancontrol

次に、センサー検出を実行します。yesと答えるだけの対話形式です。

Bash
sudo sensors-detect # 途中で「Some chips need to be blacklisted?」と聞かれても # デフォルト(Enter)で進めて問題ありません

検出完了後、即座に回転数を見てみましょう:

Bash
sensors

出力例(Ryzen 7 5800X + B550マザー):

k10temp-pci-00c3
Adapter: PCI adapter
Tctl:  +45.2°C
Tdie:  +45.2°C

nct6798-isa-0a30
Adapter: ISA adapter
fan1:        0 RPM  (min =    0 RPM)
fan2:      892 RPM  (min =    0 RPM)
fan3:        0 RPM  (min =    0 RPM)
fan4:     1054 RPM  (min =    0 RPM)
fan5:        0 RPM  (min =    0 RPM)
fan6:        0 RPM  (min =    0 RPM)

fan2がCPUファン、fan4がケースファンといった具合です。0 RPMの場合はケーブル未接続か、PWM制御対象外です。

ステップ2:fancontrolの設定ファイルを生成

PWM(パルス幅変調)制御に対応しているかを見极めます:

Bash
sudo pwmconfig

対話形式で以下を聞かれます:

  1. 監視対象のセンサー(CPU温度やマザー温度)を選択
  2. 対応するファン(/sys/class/hwmon/hwmon/pwm)を選択
  3. 最低回転時のPWM値(0〜255)をテスト
  4. 最高回転時のPWM値をテスト
  5. 自動起動するかどうか

テスト中はファンが止まったり急加速したりするので、負荷のかかる作業は避けてください。完了すると/etc/fancontrolが生成されます。

生成された設定ファイルの例:

# Configuration file generated by pwmconfig
INTERVAL=2
DEVPATH=hwmon1=devices/platform/nct6798.2592 hwmon2=devices/pci0000:00/0000:00:18.3
DEVNAME=hwmon1=nct6798 hwmon2=k10temp
FCTEMPS=hwmon1/pwm2=hwmon2/temp1_input
FCFANS=hwmon1/pwm2=hwmon1/fan2_input
MINTEMP=hwmon1/pwm2=40
MAXTEMP=hwmon1/pwm2=75
MINSTART=hwmon1/pwm2=100
MINSTOP=hwmon1/pwm2=50

ステップ3:fancontrolサービスの起動と有効化

設定ファイルができたら、systemdサービスとして起動します:

Bash
sudo systemctl start fancontrol sudo systemctl enable fancontrol

しばらくしてsensorsで回転数を見ると、CPU温度に応じてfan2のRPMが変化しているはずです。

ハマった点やエラー解決

エラー1:「pwmconfig: There are no pwm-capable sensor modules installed」

原因:マザーボードのSuper I/Oが未サポートか、カーネルモジュールがロードされていない
解決

Bash
sudo modprobe nct6775 # チップに応じて異なる echo nct6775 | sudo tee -a /etc/modules sudo reboot

再びpwmconfigを実行してみてください。

エラー2:「fancontrol[1234]: Error: file not found: /sys/class/hwmon/hwmon1/pwm2」

原因:デバイスパスが変わってしまう(特にUSB機器を増減させると起きやすい)
解決DEVPATHを固定するために、/etc/udev/rules.d/99-fix-hwmon.rulesを作成:

SUBSYSTEM=="hwmon", ATTR{name}=="nct6798", SYMLINK+="hwmon/nct6798"

その後、/etc/fancontrolDEVPATH=行をSYMLINKを指すように書き換えます。

エラー3:ファンが最低回転以下に下がらない

原因:マザー側のファンストップ防止機能が働いている
解決MINSTARTを少し上げる(例:50→80)か、MINTEMPを下げる(例:40→35)ことで、ファンを常に回したままにします。静音重視ならBIOSで「Fan Stop」機能を無効にすることも検討しましょう。

発展:Grafana + Prometheusで可視化

fancontrolで取得した値はnode_exporterのtextfile-collecter経由でPrometheusに送れます。以下のスクリプトを/usr/local/bin/sensors_to_prom.shとして配置:

Bash
#!/bin/bash sensors -j | jq -r ' to_entries[] | select(.value | type == "object") | .key as $chip | .value | to_entries[] | select(.value | type == "object") | .key as $label | .value | to_entries[] | "node_\(.key){chip=\"\($chip)\",label=\"\($label)\"} \(.value)"'
Bash
chmod +x /usr/local/bin/sensors_to_prom.sh

/etc/cron.d/sensors

* * * * * prometheus /usr/local/bin/sensors_to_prom.sh > /var/lib/prometheus/node_exporter/sensors.prom

これでGrafanaで「CPU温度とファン回転数の相関」が可視化でき、閾値アラートを掛けられます。

まとめ

本記事では、lm-sensorsでファン回転数を取得し、fancontrolで自動制御するまでの流れを解説しました。

  • lm-sensorsのインストールとsensors-detectでの検出
  • pwmconfigによる設定ファイル生成とPID制御の仕組み
  • systemdサービス化とトラブルシューティング
  • Prometheus連携による可視化手順

fancontrolを使うことで、LinuxマシンでもWindows同等の静音化・冷却制御が可能です。次回は、複数の温度閾点を使った「段階制御」や、ゲーム起動時のみ最大冷却にする「アプリケーション連動」について紹介する予定です。

参考資料