2005/05/03(火)ハードウェアモニタ

2005/05/02 25:00 PC(Linux)
HDDが熱暴走に類似した症状を呈したので、今後が不安。

ハードウェアモニタを導入し、熱くなってきたらファンの回転を上げるという対処療法スクリプトを使って様子を見てみることにする。

[smartmontools]
すでにsmartsuiteというソフトが入っていて、
#smartctl /dev/hda
なんかでステータスが見られるのだが、温度に関しては87万度とか異常な値が出ている。調べてみると、smartsuiteはすでにメンテナンスされておらず、smartctlはsmartmontoolsというソフトに受け継がれたらしい。

smartmontoolsをインストールする。
smartmontoolsはtesting以降じゃないと無いので、
# apt-get install smartmontools/testing

# smartctl -A /dev/hda |grep -i temp
ほい正常動作。

[lm-sensors]
kernelが2.6系なので、testingじゃないとダメ。
# apt-get install lm-sensors/testing sysvinit/testing coreutils/testing libacl1/testing libattr1/testing
依存で引っかかると、
Sorry, but the following packages have unmet dependencies
などのメッセージが出る。依存関係は1つ1つで見てくのが普通? perlとlibc以外はこのやり方で大騒動は起こらないんだろうけど。今回は手動で全部見た。

さて入ったので、
# sensors-detect
で、使われているチップを見る。Ez!goはWinbondのW83627HFで確定(この後蓋開けて基盤上でも確認)。
モジュールがちゃんとロードされていれば、
# sensors
で見られるはずなのだが……
sensorが見つからないと怒られる。

カーネルフォルダに戻ってあれこれモジュールをコンパイル->ロードしてみる。
i2c-isa, i2c-810, i2c-algobit, i2c-sensor, i2c-chardev, w83781d(W83627HF互換)
とやってみたのだが、センサーはちゃんと見つけているようではあるものの
 "ERROR: Can't get IN0 data!"
 ……
と出てデータが出てこない。

色々調べて、最近のカーネルはW83627HF系の専用ドライバが出ているというのでカーネルアップ決断。
$ cd ~/kernel
$ wget     <a HREF="http://www.asahi-net.lkams.kernel.org/pub/linux/kernel/v2.6/linux-2.6.11.8.tar.gz" TARGET=_top>http://www.asahi-net.lkams.kernel.org/pub/linux/kernel/v2.6/linux-2.6.11.8.tar.gz</a>
$ tar -xvzf linux-2.6.11.8.tar.gz
$ cd linux-2.6.11.8
$ make menuconfig
で上記のもの(ただしw83781d->w83627hf)をモジュールではなくカーネル組み込みでごりごり追加し、
# make V=0
# make install
あーもう適当だ。ちょっとテンパってたのでカーネルの保存とか考えてないね。
再起動
# reboot

# sensors
w83627hf-isa-0290
Adapter: ISA adapter
VCore 1:   +1.50 V  (min =  +0.00 V, max =  +0.00 V)
VCore 2:   +1.28 V  (min =  +0.00 V, max =  +0.00 V)
+3.3V:     +3.28 V  (min =  +3.14 V, max =  +3.47 V)
……
ちゃんと表示されました! やった。

さらに、/sys/devices/platform/i2c-2/2-0290/の中を書き換えることでいくらかのコントロールが出来る。
echo 255 > /sys/devices/platform/i2c-2/2-0290/pwm1
でファンの回転がアップ。echoの値が2で通常。0でストップ。ただし、このマシンはBIOSでファン制御が強いのか20secくらいですぐ元に戻る。

で、やりたいことはHDDの温度が高いときにファンの回転をアップさせることなのでcron用の制御スクリプトを書く。最近はシェルスクリプトで失敗することが多いので、もうRubyでいいや。

/etc/cron.hourly/fancontrol_forHDD.rb
を作成し、
#! /usr/bin/ruby

$MAXTEMP=40

temp = `/usr/sbin/smartctl -A /dev/hda | grep -i temp`
temp = temp[/\s+(\d+)\s+\(Lifetime/, 1]

if $MAXTEMP < temp.to_i then
  (1..600).each {
    `echo 255 > /sys/devices/platform/i2c-2/2-0290/pwm1`
    sleep 1
        }
end
とした。40度を超えていたら10分回転アップを打ち続ける。cron.dの中がなんかちゃんと動いてないんだよな。ということでhourlyにしました。

さてこれでちゃんと動くかテストです。

[本家]
http://www2.lm-sensors.nu/~lm78/
OK キャンセル 確認 その他