アーキテクチャをスマートに。

株式会社ネオジニア代表。ITアーキテクトとしてのお仕事や考えていることなどをたまに綴っています。(記事の内容は個人の見解に基づくものであり、所属組織を代表するものではありません)

Ubuntu 11.10 on ThinkPad X220 でファン制御

あけましておめでとうございます。
約半年の間、諸事情によりブログを休んでいましたが、2012年になり、気持ちも新たに、ブログを再開しようと思います。

まずは、Ubuntuネタ。

最近仕事用に購入した ThinkPad X220 に Ubuntu 11.10 x86_64 をインストールしました。
しばらくしてCPUファンの音が気になり、回転数を調べてみると 約3600RPM。
特に負荷がかかっているわけではないのに、ほぼフル回転。

とりあえずファンを制御する方法

これはちょっとおかしいと思ってググッてみると、ThinkPad ではCPUファンの制御がうまく行かないという情報が。

カーネルモジュールのオプションで対応できるとのこと。
http://www.thinkwiki.org/wiki/How_to_control_fan_speed

vi /etc/modprobe.d/options などして以下のように書く。(Redhat系では /etc/modprobe.d/fan)

options thinkpad_acpi fan_control=1

モジュールを再ロード。

sudo modprobe -rv thinkpad_acpi
sudo modprobe -v thinkpad_acpi

ファン回転数をレベル1にセット

echo level 1 | sudo tee /proc/acpi/ibm/fan

すると、約1900RPM まで下がり、静かになった。CPU温度は59度まで上がり、そこで止まった。

温度によって回転数を自動制御したい

この方法ではCPUに負荷がかかって温度が上がったときにファンの回転数が上がらない。
手動で回転数を変更させるのはちょっと嫌だ。
自動的にファンの回転数が変化するようにしたい。
と思ってまたググッていると、thinkfan なるものを発見。
http://www.naney.org/diki/d/2010-11-13-thinkfan.html

さっそくインストールしてみる。

sudo apt-get install thinkfan

設定ファイルは、/etc/default/thinkfan /etc/thinkfan.conf にある。(2012-03-28 パスが間違ってたので修正)
開いてみると、なにやら T61p でのしきい値の設定例が書かれている。とりあえずこの値で使ってみようということで、thinkfan を起動してみる。

sudo thinkfan -n

ところが、/proc/acpi/ibm/thermal がないとかでエラーになり、実行できない。

X220でthinkfanを動かす

公式Wiki (ドイツ語)によると、ThinkPad X220/T420s/T420 では、温度センサのデバイスファイルが別の位置にあるため、認識できないんだとか。
で、そのサイトにあるとおり、手動でセンサーを検出させるべく対処。

lm-sensors をインストール。

sudo apt-get install lm-sensors

センサーを検出

sudo sensors-detect

質問にはすべて YES と答える。
(デフォルトYESなのでEnterキー連打でよいが、一番最後の Do you want to add these lines automatically to /etc/modules? (yes/NO) だけデフォルトNOなので注意する)

/etc/modules を再読み込みさせる。(または再起動する)

sudo start module-init-tools 

センサーの値を読んでみる。

$ sensors
acpitz-virtual-0
Adapter: Virtual device
temp1:        +50.0°C  (crit = +99.0°C)

thinkpad-isa-0000
Adapter: ISA adapter
fan1:        3498 RPM

coretemp-isa-0000
Adapter: ISA adapter
Physical id 0:  +51.0°C  (high = +86.0°C, crit = +100.0°C)
Core 0:         +47.0°C  (high = +86.0°C, crit = +100.0°C)
Core 1:         +46.0°C  (high = +86.0°C, crit = +100.0°C)

このように、CPUコアの温度(coretemp)が表示されればOK。

これで、温度センサーが認識され、スペシャルファイルが出来ているはずなので、以下のコマンドで調べてみる。

$ find /sys/devices -type f -name "temp*_input"
/sys/devices/platform/coretemp.0/temp1_input
/sys/devices/platform/coretemp.0/temp2_input
/sys/devices/platform/coretemp.0/temp3_input
/sys/devices/virtual/hwmon/hwmon0/temp1_input

OK。

一番最初のセンサーがCPU全体の温度のようなので、これをセンサーデバイスとして thinkfan.conf に設定する。(しきい値設定の前に記述)

sensor /sys/devices/platform/coretemp.0/temp1_input

テスト

ファン回転数が制御されるかどうかをテスト。

まずファンのスピードを自動に設定。

echo level auto | sudo tee /proc/acpi/ibm/fan

ファンがうるさくなった。

thinkファンをフォアグラウンドで起動。

sudo thinkfan -n

おお、静かになった。
いけてる様子。

Ctrl+C でthinkfan を停止。

実験

次にファン回転数が自動的に変化するかどうかを実験。

ファンを止め、CPU温度を上昇させてみる。

echo watchdog 0 | sudo tee /proc/acpi/ibm/fan
echo disabled | sudo tee /proc/acpi/ibm/fan

sensorsコマンドをwatchし、温度上昇を監視。

$ watch sensors
Every 2.0s: sensors                                     Mon Jan  2 16:36:14 2012

acpitz-virtual-0
Adapter: Virtual device
temp1:        +60.0°C  (crit = +99.0°C)

thinkpad-isa-0000
Adapter: ISA adapter
fan1:           0 RPM

coretemp-isa-0000
Adapter: ISA adapter
Physical id 0:  +60.0°C  (high = +86.0°C, crit = +100.0°C)
Core 0:         +58.0°C  (high = +86.0°C, crit = +100.0°C)
Core 1:         +58.0°C  (high = +86.0°C, crit = +100.0°C)

ちょっと怖いので、60度くらいまででやめておく。
Ctrl+C で watch をやめ、thinkfan を起動する。

sudo thinkfan -n

ファンが回転しだし、レベル5 → 4 → 3 と下がっていった。
大成功。うまく自動制御出来ている様子。

デーモン起動

本格的に thinkfan をデーモンとして起動。

/etc/default/thinkfan ファイルの修正が必要。

START=yes

とし、

sudo /etc/init.d/thinkfan start

thinkfan.conf のしきい値

いろいろ試した結果、X220 では以下のような設定で運用することにしました。

(0,     0,      52)
(1,     48,     60)
(2,     59,     63)
(4,     61,     65)
(6,     64,     68)
(7,     67,     32767)

とりあえずこれで様子見。


2012/03/28 追記。
もう少し高めの温度でも大丈夫そうなので、出来るだけ静かになるよう以下の設定に修正して運用しています。ご参考になれば。

(0,     0,      64)
(1,     55,     66)
(2,     65,     68)
(4,     67,     70)
(6,     69,     72)
(7,     71,     32767)