はじめに (対象読者・この記事でわかること)
この記事は、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系なら:
Bashsudo apt update sudo apt install lm-sensors fancontrol
次に、センサー検出を実行します。yesと答えるだけの対話形式です。
Bashsudo sensors-detect # 途中で「Some chips need to be blacklisted?」と聞かれても # デフォルト(Enter)で進めて問題ありません
検出完了後、即座に回転数を見てみましょう:
Bashsensors
出力例(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(パルス幅変調)制御に対応しているかを見极めます:
Bashsudo pwmconfig
対話形式で以下を聞かれます:
- 監視対象のセンサー(CPU温度やマザー温度)を選択
- 対応するファン(/sys/class/hwmon/hwmon/pwm)を選択
- 最低回転時のPWM値(0〜255)をテスト
- 最高回転時のPWM値をテスト
- 自動起動するかどうか
テスト中はファンが止まったり急加速したりするので、負荷のかかる作業は避けてください。完了すると/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サービスとして起動します:
Bashsudo systemctl start fancontrol sudo systemctl enable fancontrol
しばらくしてsensorsで回転数を見ると、CPU温度に応じてfan2のRPMが変化しているはずです。
ハマった点やエラー解決
エラー1:「pwmconfig: There are no pwm-capable sensor modules installed」
原因:マザーボードのSuper I/Oが未サポートか、カーネルモジュールがロードされていない
解決:
Bashsudo 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/fancontrolのDEVPATH=行を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)"'
Bashchmod +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同等の静音化・冷却制御が可能です。次回は、複数の温度閾点を使った「段階制御」や、ゲーム起動時のみ最大冷却にする「アプリケーション連動」について紹介する予定です。
参考資料
