Linuxサーバでファン制御
自宅で24時間稼働させているサーバーにおいて、最も摩耗しやすく、かつトラブルが表面化しやすいパーツが冷却ファンです。長期間の運用により、ある日突然、ファンから軸ブレやベアリングの劣化に伴う激しい異音が発生することがあります。以前「ASRock Beebox + PT3で構築したミニPC録画サーバの紹介」で構築したような小型サーバーの場合、ファンの高回転化が騒音をさらに増長させます。物理的なパーツ交換が最終的な解決策であることは明白ですが、代替パーツの手配には数日を要するのが通例です。そこで、交換までの直近の対処として、Linux側からファンの動作を制御し、不快な騒音を最小限に抑える手法を導入します。
ハードウェア交換までの時間を技術で稼ぐ
本記事の目的は、Linux(CentOS 7等)の標準的なツール群を用い、マザーボード上のハードウェアモニターチップに直接介入してファンの回転数を操作することにあります。BIOSやUEFIの設定に依存せず、OS側で柔軟なファンカーブを再定義することで、異音が発生する特定の回転域を回避したり、低負荷時にファンを完全に停止させたりすることが可能になります。物理的な故障をソフトウェアのハックでカバーし、システム稼働の継続と居住環境の静穏を両立させることが狙いです。
静寂と冷却のバランスを定義する
制御における具体的な目標として、CPU温度が比較的低いアイドル時において、ファンの出力をPWM値:0(完全停止)に設定します。これにより、常用域での物理的な騒音をゼロにします。一方で、温度上昇に伴う熱暴走を避けるため、CPU温度が70°Cを超えた場合には強制的に最大出力で冷却を行うフェイルセーフを維持します。単に音を消すのではなく、温度計の数値に基づいた「静止」と「冷却」の明確な境界線を引くことが、今回の暫定処置のゴールです。
自動制御の壁と制御ポートの特定
Linux環境でファン制御を試みる際、最大の課題となるのは「制御対象の特定」と「ハードウェアによる自動制御の介入」です。多くのマザーボードでは、チップセットが独自にファン速度を管理しており、OS側からの安易な書き込みを無視します。また、/sys/class/hwmon/ 以下には複数のデバイスやPWMポートが存在するため、どのポートが実際に物理ファンと結線されているかを突き止める作業が必要となります。これらを誤ると、冷却が必要な箇所が冷やされず、システムに致命的な損傷を与えるリスクが生じます。
lm_sensorsとsysfsを駆使したファンカーブの再構築
これらの課題を解決し、汎用的なLinux環境でファン制御を実現する手順を以下に解説します。
lm_sensorsの導入とスキャン
まず、温度やファン速度を取得・操作するための標準パッケージを導入します。
yum install -y lm_sensors
インストール後、以下のコマンドでマザーボード上のセンサーチップを特定します。
sensors-detect
すべての問いに対して「YES」で回答し、最後に設定を保存することで、カーネルが各センサーを認識できるようになります。
制御ポートの特定とモード変更
多くの環境では、初期状態でハードウェアによる自動制御が働いています。以下のコマンドで各ポートの状態を確認します。
cat /sys/class/hwmon/hwmon1/pwm[1-5]_enable
値が 5(Smart Fanモード等)になっている場合、手動での操作が受け付けられません。すべてのポートに対して 1 を書き込み、マニュアルモードへ変更します。
echo 1 > /sys/class/hwmon/hwmon1/pwm1_enable echo 1 > /sys/class/hwmon/hwmon1/pwm2_enable echo 1 > /sys/class/hwmon/hwmon1/pwm3_enable echo 1 > /sys/class/hwmon/hwmon1/pwm4_enable echo 1 > /sys/class/hwmon/hwmon1/pwm5_enable
対象ファンの特定(実機検証)
どのPWMポートが物理ファンに繋がっているか不明瞭な場合があります。以下のコマンドを順に実行し、ファンが停止する(音が消える)ポートを探します。
echo 0 > /sys/class/hwmon/hwmon1/pwm1 # ... echo 0 > /sys/class/hwmon/hwmon1/pwm5
今回の検証では、pwm2 に 0 を書き込んだ瞬間に異音が消失したため、制御対象が pwm2 であることが特定できました。他のPWMXは元のモードに戻しておきましょう。
デフォルトファンカーブの解析
設定を変更する前に、チップセットが保持しているデフォルトの制御ポイント(auto_point)を確認します。今回の検証環境では、以下の数値が設定されていました。
| 制御ポイント | 温度閾値 (temp) | 出力値 (PWM) | 状態の目安 |
| Point 1 | 50,000 (50°C) | 0 | 停止 |
| Point 2 | 55,000 (55°C) | 76 | 低速回転(異音発生) |
| Point 3 | 65,000 (65°C) | 204 | 中速回転(異音発生) |
| Point 4 | 70,000 (70°C) | 229 | 高速回転 |
| Point 5 | 73,000 (73°C) | 255 | 最大回転 |
ファンカーブ(auto_point)の書き換え
異音を封じ込めるため、常用域(例:55°C〜65°C)に対応するポイントの出力を「0」に設定します。
# 55℃および65℃のポイントでファンを停止させる echo 0 > /sys/class/hwmon/hwmon1/pwm2_auto_point2_pwm echo 0 > /sys/class/hwmon/hwmon1/pwm2_auto_point3_pwm
これにより、高負荷時にのみファンが回転する「準ファンレス」の状態を論理的に作り出すことができます。
まとめ
「壊れたパーツは速やかに交換する」のがメンテナンスの鉄則ですが、交換までのダウンタイムをいかに快適に過ごすか、あるいは低負荷時の不要な騒音をどう排除するかという問いに対し、Linuxの強力な制御機構は明確な回答を提示してくれます。今回紹介した sysfs インターフェースを通じた直接操作は、BeeBoxのような小型サーバーに限らず、多くのLinuxシステムで応用可能な汎用性の高いハックです。物理的な限界を論理的な操作で補い、自分にとって最適な道具へと作り変える。これこそが、納戸工房が大切にしている「ものづくりとテクノロジー」の交差点にある楽しみと言えるでしょう。