lm_snsorsによるCPUファンコントロール


予備サーバの不調に伴い、新規にAthlon64サーバを構築してCool'N'Quietを動かしましたが、当初はおやじのマザーボードではうまく制御ができないようで、pwmconfigで設定ファイルを作成できませんでした。(PWM制御が効かないようで、回転数が制御できませんでした。)
替わりにと言っては何ですが、おやじが使用しているマザーボード(GigaByte GA-K8N Pro-SLI)にはCPU SMART Fan Control機能というものがあり、CPU温度にあわせてFANの回転数を制御できるので、BIOSでこの機能も有効にしてみました。しかし、マザーボードのCPU SMART Fan Control機能が動作するため、Linuxから制御できないのが納得できず、調べたところファンやマザーボードによってはデフォルトままでは動作しないが、設定を変更すればよいことがわかりましたので以下に示します。こちらが、おやじの環境でのFAN制御の様子です。少し涼しくなってきたのでオン・オフを繰り返すときが多いようで、FAN寿命を考えると、MINTEMPを下げて、無停止にしたほうがいいような気がします。

なお、おやじのマザーボードではソフトからはPWM制御がCPUファン以外はできないようで、テストでもエラーになり制御ができませんでしたが、対応していればケースファン等の制御もできます。但し、どう設定するかは悩ましいと思いますが・・・。

注意: CPUや環境によってはCPUが熱破壊することも考えられるので、ここの内容を参考にFANコントロールを実行する場合は、各自のリスクでお願いします。おやじの環境(Athlon64 3200+ Venice)では、アイドル時にCPUファンが停止しても、ケースファンと電源のファンによる換気でCPU温度上昇は数度に抑えられています。従って、仮にFAN制御ができなくても熱破壊することはまずありません。因みに、pwmconfigでFAN制御のテストをする際に5秒間のFAN停止がありますし、MINSTART/MINSTOPのテストでは、テスト中に「Enter」を押さないとFANが停止したままになったりするので注意が必要です。(おやじの環境では、回りっぱなしだったので何も影響はありませんでしたが・・。)

■事前検証

まず、最初にファンコントロールにはlm_sensors(RPM名:sensors)が必要なので、こちらを参考にインストールしておいてください。
マザーボードのCPU SMART Fan Control機能が動作するため、Linuxから制御できないのが納得できませんでした。そこで、ケースを開けたままもう一度pwmconfigしてみたところ、pwmconfig起動時とテストの最後で一瞬ファンの回転が落ちていることがわかりました。これは、ファン制御はできているが回転数が追従していないのではと思い、改めてテスト結果を見ると最後のFAN停止のメッセージの直前で少し回転数が落ちているように見えました。
pwmconfigのテストのデフォルト設定は、PWM制御は255のスケールを15刻みで測定していることがわかりましたので、pwconfigの設定を変更し、64スケールで1刻みで測定するようにしてみました。その結果を以下に示します。


数値データと併せて見るともっとわかりやすいですが、実質、1/10の25以下でしか制御が利いておらず、これではデフォルトの15刻みではうまく動いていないと勘違いしても止むを得ないと思います。そこで、この設定をベースにpwmconfigで設定してみました。

■pwmconfigの設定

  1. pwmconfigのテストパラメータを下記で変更する。下記はおやじの環境での設定値であり、デフォルトでテストしてからフルスピードから速度が落ちてくる値を目安にスケールと刻みを決定する。

    # cd /usr/sbin
    # sed -i "s/MAX=255/MAX=64/g" pwmconfig  
    <- 最大スケール
    # sed -i "s/STEP=15/STEP=1/g" pwmconfig
       <-ステップ

  2. pwmconfigを起動し、テストしてファン制御用の設定ファイル(/etc/fancontrol)を作成していく。
    この段階では、Enterで全て答えていけばよい。最初にPWMコントローラやFanセンサのチェックが

    # pwmconfig[Enter]
    This program will search your sensors for pulse width modulation (pwm)
    controls, and test each one to see if it controls a fan on
    your motherboard. Note that many motherboards do not have pwm
    circuitry installed, even if your sensor chip supports pwm.

    # 最初にPWMコントローラやFanセンサのチェックを実施。おやじの環境では
    # それぞれ3個あり、fan1がCPUファンで3375RPMで回っていることがわかる。
    # ケースファン等をマザーから接続していれば他のファンの回転数もでるので、
    # CPUファンがどれかは、BIOSやドキュメントで調べておくこと。

    We will attempt to briefly stop each fan using the pwm controls.
    The program will attempt to restore each fan to full speed
    after testing. However, it is ** very important ** that you
    physically verify that the fans have been to full speed
    after the program has completed.

    Found the following PWM controls:
       2-0290/pwm1
       2-0290/pwm2
       2-0290/pwm3

    Found the following fan sensors:
       2-0290/fan1_input     current speed: 3375 RPM
       2-0290/fan2_input     current speed: 0 ... skipping!
       2-0290/fan3_input     current speed: 0 ... skipping!

    Warning!!! This program will stop your fans, one at a time,
    for approximately 5 seconds each!!!
    This may cause your processor temperature to rise!!!
    If you do not want to do this hit control-C now!!!
    # Enterでテスト開始。テストの最後に5秒間をファンが停止する。
    Hit return to continue:
    [Enter]

    Testing pwm control 2-0290/pwm1 ...
      2-0290/fan1_input ... speed was 3375 now 0
        It appears that fan 2-0290/fan1_input
        is controlled by pwm 2-0290/pwm1
    # 1番目のPWMコントローラのテストを開始。
    Would you like to generate a detailed correlation (y)? [Enter]
    # グラフデータ取得するならそのままEnter。
    Would you like to generate a graphical plot using gnuplot (y)? [Enter]
        PWM 64 FAN 3308
        PWM 63 FAN 3375

        (snip)

        PWM 25 FAN 3308
        PWM 24 FAN 3308
        PWM 23 FAN 3308
        PWM 22 FAN 3308
        PWM 21 FAN 3245
        PWM 20 FAN 3308
        PWM 19 FAN 3245
        PWM 18 FAN 3245
        PWM 17 FAN 3183
        PWM 16 FAN 3245
        PWM 15 FAN 3125
        PWM 14 FAN 3125
        PWM 13 FAN 3068
        PWM 12 FAN 3068
        PWM 11 FAN 3013
        PWM 10 FAN 3013
        PWM 9 FAN 2909
        PWM 8 FAN 2909
        PWM 7 FAN 2812
        PWM 6 FAN 2766
        PWM 5 FAN 2556
        PWM 4 FAN 2556
        PWM 3 FAN 2311
        PWM 2 FAN 2250
        PWM 1 FAN 0
    Fan Stopped at PWM = 1
    Hit return to continue...[Enter]

    # 2番目のPWMコントローラのテストを開始。おやじの環境では未検出。
    Testing pwm control 2-0290/pwm2 ...
      2-0290/fan1_input ... speed was 3375 now 3375
        no correlation

    No correlations were detected.
    There is either no fan connected to the output of 2-0290/pwm2,
    or the connected fan has no rpm-signal connected to one of
    the tested fan sensors. (Note: not all motherboards have
    the pwm outputs connected to the fan connectors,
    check out the hardware database on http://www.almico.com/forumindex.php)

    Did you see/hear a fan stopping during the above test (n)? [Enter]

    # 3番目のPWMコントローラのテストを開始。おやじの環境では未検出。
    Testing pwm control 2-0290/pwm3 ...
      2-0290/fan1_input ... speed was 3375 now 3375
        no correlation

    No correlations were detected.
    There is either no fan connected to the output of 2-0290/pwm3,
    or the connected fan has no rpm-signal connected to one of
    the tested fan sensors. (Note: not all motherboards have
    the pwm outputs connected to the fan connectors,
    check out the hardware database on http://www.almico.com/forumindex.php)

    Did you see/hear a fan stopping during the above test (n)? [Enter]

    Testing is complete.
    Please verify that all fans have returned to their normal speed.

    The fancontrol script can automatically respond to temperature changes
    of your system by changing fanspeeds.
    # 設定ファイルを作成するためEnter。
    Do you want to set up its configuration file now (y)? [Enter]
    What should be the path to your fancontrol config file (/etc/fancontrol)? [Enter]
    /etc/fancontrol does not exist, shall I create it now (y)? [Enter]
    Loading configuration from /etc/fancontrol ...

    Select fan output to configure, or other action:
    1) 2-0290/pwm1 3) Just quit 5) Show configuration
    2) Change INTERVAL 4) Save and quit

    select (1-n):

  3. 測定が完了したので、これをベースに上記状態から設定していく。

    # CPUファンはpwm1で制御されるので、その設定を行うため1を選択。
    # 複数のファンが検出されると類似の項目(2-0290/pwm2等)が表示される。
    select (1-n): 1[Enter]

    Current temperature readings are as follows:
    2-0290/temp1_input 25
    2-0290/temp2_input 31
    2-0290/temp3_input 70

    Select a temperature sensor as source for 2-0290/pwm1:
    1) 2-0290/temp1_input
    2) 2-0290/temp2_input
    3) 2-0290/temp3_input
    4) None (Do not affect this PWM output)
    # CPUファンを制御する温度センサを選択する。おやじの環境ではtemp2なので
    # 2を選択。どのセンサかはsensorsコマンドでCPU負荷をかけながら調査する。
    select (1-n):
    2[Enter]

    # CPUファンを完全に停止する温度を設定。デフォルトは0度であるが、
    # おやじは室温25度ならアイドルで30度を超えないことを確認して30度にした。
    # 環境に応じて設定要。
    Enter the low temperature (C)
    at which the fan should be switched off (0): 30[Enter]

    # CPUファンを最大回転数でまわす温度を設定。デフォルトは60度であるが、
    # 3200+のTcaseの最大値は65度なので気持ちの問題で-10度した。
    Enter the high temperature (C)
    at which the fan should be switched to full speed (60): 55[Enter]

    # CPUファンを回転させるPWM値を設定する。デフォルトは150であるが、
    # そもそもおやじの場合は、25以下ぐらいでしか制御できない環境なので
    # 最終的には12に設定した。
    # ここで、「t」を選択すると10刻みで0からEnterを押す度にステップアップ
    # していくテストができるので回転を始めたところで「y」を押すとマージン
    # として「+20」した値がセットされるらしいというのも、pwconfigを改造して
    # ステップを1にしても止まらずに回りっぱなしだったため確認できていない。
    # 次のテストも停止しなかったので、バグかも知れない。
    Enter the minimum PWM value (0-64)
    at which the fan STARTS spinning (press t to test) (150): t[Enter]

    Now we increase the PWM value in 10-unit-steps.
    Let the fan stop completely, then press return until the
    fan starts spinning. Then enter 'y'.
    We will use this value +20 as the starting speed.
    Setting 2-0290/pwm1 to 10...
    Setting 2-0290/pwm1 to 20...
    Setting 2-0290/pwm1 to 30...
    Setting 2-0290/pwm1 to 40...
    Setting 2-0290/pwm1 to 50...
    Setting 2-0290/pwm1 to 60...
    Setting 2-0290/pwm1 to 70...
    Setting 2-0290/pwm1 to 80...
    Setting 2-0290/pwm1 to 90...
    Setting 2-0290/pwm1 to 100...
    Setting 2-0290/pwm1 to 110...
    Setting 2-0290/pwm1 to 120...
    Setting 2-0290/pwm1 to 130...
    Setting 2-0290/pwm1 to 140...
    Setting 2-0290/pwm1 to 150...
    Setting 2-0290/pwm1 to 160...
    Setting 2-0290/pwm1 to 170...
    Setting 2-0290/pwm1 to 180...
    Setting 2-0290/pwm1 to 190...
    Setting 2-0290/pwm1 to 200...
    Setting 2-0290/pwm1 to 210...
    Setting 2-0290/pwm1 to 220...
    Setting 2-0290/pwm1 to 230...
    Setting 2-0290/pwm1 to 240...
    Setting 2-0290/pwm1 to 64...
    OK, using 84

    # CPUファンが停止するPWM値を設定する。デフォルトは100であるが、
    # テストでは下記のようにうまく動作しなかったので、3に設定した。

    Enter the minimum PWM value (0-64)
    at which the fan STOPS spinning (press t to test) (100): t[Enter]

    Now we decrease the PWM value in 10-unit-steps.
    Let the fan reach full speed, then press return until the
    fan stops spinning. Then enter 'y'.
    We will use this value +20 as the minimum speed.
    Setting 2-0290/pwm1 to 54...
    Setting 2-0290/pwm1 to 44...
    Setting 2-0290/pwm1 to 34...
    Setting 2-0290/pwm1 to 24...
    Setting 2-0290/pwm1 to 14...
    Setting 2-0290/pwm1 to 4...
    Setting 2-0290/pwm1 to 0...
    OK, using 20

    # show configuration で設定ファイルの内容を確認する。
    select (1-n): 5[Enter]

    Common Settings:
    INTERVAL=10

    Settings of 2-0290/pwm1:
      Depends on 2-0290/temp2_input
      Controls 2-0290/fan1_input
      MINTEMP=30
      MAXTEMP=55
      MINSTART=84
      MINSTOP=20

    # インターバルが10秒と長いので一応5秒にした。急激な温度変化がなければ
    # 10秒のままでも可能。変更後に再確認。

    select (1-n): 2[Enter]

    Current interval is 10 seconds.
    Enter the interval at which fancontrol should update PWM values (in s):5[Enter]
    select (1-n): 5[Enter]

    Common Settings:
    INTERVAL=5

    Settings of 2-0290/pwm1:
      Depends on 2-0290/temp2_input
      Controls 2-0290/fan1_input
      MINTEMP=30
      MAXTEMP=55
      MINSTART=84
      MINSTOP=20

    # 設定内容を保存する。
    select (1-n): 5[Enter]

    Saving configuration to /etc/fancontrol...
    Configuration saved

  4. おやじの場合、パラメータがこのままでは動作しないので、「MINSTART」と「MINSTOP」を修正する。

    # vi /etc/fancontrol

    INTERVAL=5
    FCTEMPS=2-0290/pwm1=2-0290/temp2_input
    FCFANS= 2-0290/pwm1=2-0290/fan1_input
    MINTEMP=2-0290/pwm1=30
    MAXTEMP=2-0290/pwm1=55
    MINSTART=2-0290/pwm1=
    12
    MINSTOP=2-0290/pwm1=
    3

    「Esc」、「:」、「w」、「q」で保存する。

  5. 設定ができたので起動してみる。

    # /usr/sbin/fancontrol &> /var/log/fancontrol.log &
    [1] 17713

  6. ログで起動確認する。以下のようになっていればOK。

    # cat /var/log/fancontrol.log
    Common settings:
      INTERVAL=5

    Settings for 2-0290/pwm1:
      Depends on 2-0290/temp2_input
      Controls 2-0290/fan1_input
      MINTEMP=30
      MAXTEMP=55
      MINSTART=12
      MINSTOP=3

    Enabling PWM on fans...
    Starting automatic fan control...

  7. 負荷をかけたりしてsensorsで確認。各自の環境に合わせて微調整する。

    おやじの場合、30度で設定しているので部屋にクーラでも入れれば30度を切るのでアイドルではCPUファンは完全停止する。ただ、オン/オフのヒステリシスが設定できないので、設定温度と室温(+CPU自体の温度上昇)が微妙な関係になると、温度が下がりファンが停止するとCPU自体の発熱で若干(1度でも)温度が上昇するので回転し、また下がると止まるというポンピング減少が発生するのでファン寿命が少し気になる。従って、この温度になったら停止するという設定とこの回転を開始する温度の両方が設定できるといいかも。

  8. このままではシステム再起動で停止してしまうので、自動起動するようにする。通常、Redhat系なら/etc/rc.local、SuSEなら/etc/init.d/boot.localに5項のコマンドをそのまま書けばいいが、例によってSuSEはそんなに甘くはなかった。boot.localは起動時期が早すぎるので、ここに書いても起動できなかったためcronで対処した。以下はrootで実施すること。

    # crontab -e
    「i」を押す。

    @reboot /usr/sbin/fancontrol &> /var/log/fancontrol.log &

    「Esc」、「:」、「w」、「q」で保存する。
    $


    注:@rebootは時間指定の変わりに起動時だけ動作するという設定で、boot.localと同等の動作になる。


    システム起動時以外にもFANcontrol制御できるように、SuSE用に起動スクリプトを作ってみた。上記のcrontabでの起動の代わりに下記で設定すれば良い。

    # cd /etc/init.d
    # wget http://www.aconus.com/~oyaji/pc/fancontrol
    # chmod 755 fancontrol
    # insserv fancontrol



Top Pageへ