MRTGで温度監視

Last-modified: 2008-11-08 (土) 11:29:59 (3303d)

HDDの温度監視

smartmontoolsのインストール

# apt-get install smartmontools
パッケージリストを読みこんでいます... 完了
依存情報ツリーを作成しています... 完了
以下のパッケージが新たにインストールされます:
  smartmontools
アップグレード: 0 個, 新規インストール: 1 個, 削除: 0 個, 保留: 1 個
351kB のアーカイブを取得する必要があります。
展開後に 608kB のディスク容量が追加消費されます。
取得:1 http://updates.vinelinux.org 3.1/i386/plus smartmontools 5.33-1vl0.6 [351kB]
351kB を 1s 秒で取得しました (196kB/s)
変更を適用しています...
Preparing...                ########################################### [100%]
Note that you can use a configuration file /etc/smartd.conf to control the
startup behavior of the smartd daemon.  See man 8 smartd for details.
Run "/sbin/chkconfig --add smartd", to start smartd service on system boot
   1:smartmontools          ########################################### [100%]
Run "/etc/rc.d/init.d/smartd start" to start smartd service now.
完了

/dev/hdaの情報を表示

# smartctl -a /dev/hda
smartctl version 5.33 [i686-pc-linux-gnu] Copyright (C) 2002-4 Bruce Allen
Home page is http://smartmontools.sourceforge.net/
:
:
193 Load_Cycle_Count        0x0012   100   100   050    Old_age   Always       -       248
194 Temperature_Celsius     0x0002   122   122   000    Old_age   Always       -       45 (Lifetime Min/Max 13/61)
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       0
:
:

194 Temperature_Celsius・・・が表示されればOKです。右っ側の45という数字が現在の温度です。

温度取得スクリプトの作成

/usr/sbin/smartctl -A /dev/hdaの結果から温度の値のみをスクリプトで取得してMRTGに渡すことにします。

# vi /usr/local/mrtg-2/hdd_temp.sh

新規に作成します。

#!/bin/sh
/usr/sbin/smartctl -A /dev/hda|grep Temperature_Celsius|awk '{print $10}{print $10}'

MRTGは入力が2系統なためprintで同じデータを2つ出力しています。

実行権限を与える

# chmod 755 /usr/local/mrtg-2/hdd_temp.sh

mrtg.cfgの編集

# vi /usr/local/mrtg-2/lib/mrtg.cfg

追加

### HDD Temperature ###
Target[htemp]: `/usr/local/mrtg-2/hdd_temp.sh`
MaxBytes[htemp]: 56
Options[htemp]: gauge, growright, absolute, integer, nopercent, noinfo
Unscaled[htemp]: dwmy
YLegend[htemp]: Temperature
ShortLegend[htemp]: deg.
LegendI[htemp]: TEMP 
LegendO[htemp]: TEMP 
Legend1[htemp]: HDD温度
Legend2[htemp]: HDD温度
Title[htemp]: HDDの温度
PageTop[htemp]: <H1>HDDの温度</H1>

実行

# /usr/local/mrtg-2/bin/mrtg /usr/local/mrtg-2/lib/mrtg.cfg

インデックスページを作る

# /usr/local/mrtg-2/bin/indexmaker --columns=1 \
--addhead="<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=euc-jp\">" \
/usr/local/mrtg-2/lib/mrtg.cfg > /home/httpd/html/mrtg/index.html

CPUの温度監視

ハードウェアのセンサ情報を取得するにはI2CとLM Sensorsが必要らしい。 初め、最新のI2C 2.9.1 と LM Sensors 2.9.1 でやったがうまく動いてくれなかったので、旧バージョンのlm_sensors-2.7.0 をインストールしました。Vine Linux 3.1はカーネルにi2cを含んでいるのでi2c-2.7.0は入れなくいいようです。

ちなみに、PCはHITACHI FLORA 330 DK3です。このPCはACERのOEMでS57Lというマザーボードを搭載しています。チップセットにはSiS630が、センサチップにはITE8705Fが使われています。

lm_sensorsのインストール

http://secure.netroedge.com/%7Elm78/index.html

# wget http://secure.netroedge.com/%7Elm78/archive/lm_sensors-2.7.0.tar.gz
--16:37:54--  http://secure.netroedge.com/%7Elm78/archive/lm_sensors-2.7.0.tar.gz
           => `lm_sensors-2.7.0.tar.gz'
secure.netroedge.com をDNSに問いあわせています... 206.228.191.3
secure.netroedge.com[206.228.191.3]:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 595,379 [application/x-tar]

100%[==============================================>] 595,379      174.73K/s    ETA 00:00

16:37:58 (156.57 KB/s) - `lm_sensors-2.7.0.tar.gz' を保存しました [595379/595379]
# tar zxf lm_sensors-2.7.0.tar.gz
# cd lm_sensors-2.7.0

makeするのに.configファイルが必要なので、自分のマシンに合ったものをコピーしてください。

# ls /usr/src/linux/configs/
kernel-2.4.27-athlon-smp.config  kernel-2.4.27-i586-smp.config
kernel-2.4.27-athlon.config      kernel-2.4.27-i586.config
kernel-2.4.27-i386-BOOT.config   kernel-2.4.27-i686-smp.config
kernel-2.4.27-i386-smp.config    kernel-2.4.27-i686.config
kernel-2.4.27-i386.config
# cp /usr/src/linux/configs/kernel-2.4.26-i686.config /usr/src/linux/.config
# make
# make install

センサの自動検出

# prog/detect/sensors-detect

適当にEnterを押していく。

起動してみる

# prog/init/lm_sensors.init start
Starting up sensors: starting module __i2c-sis630__
starting module __i2c-isa__
starting module __eeprom__
starting module __sis5595__
starting module __it87__
                                                           [  OK  ]
  • 起動しない場合
    # vi /etc/ld.so.conf

    に以下を追加

    /usr/local/lib
    # ldconfig

センサ情報を見る

# sensors
eeprom-i2c-0-50
Adapter: SMBus SIS630 adapter at f080
Algorithm: Non-I2C SMBus adapter
Memory type:            SDRAM DIMM SPD
Memory size (MB):       128

eeprom-i2c-0-51
Adapter: SMBus SIS630 adapter at f080
Algorithm: Non-I2C SMBus adapter
Memory type:            SDRAM DIMM SPD
Memory size (MB):       256

it87-isa-0290
Adapter: ISA adapter
Algorithm: ISA algorithm
VCore 1:   +1.74 V  (min =  +1.53 V, max =  +1.87 V)
VCore 2:   +2.56 V  (min =  +2.25 V, max =  +2.75 V)
+3.3V:     +6.64 V  (min =  +2.96 V, max =  +3.60 V)   ALARM
+5V:       +5.17 V  (min =  +4.50 V, max =  +5.48 V)
+12V:     +11.84 V  (min = +11.36 V, max = +13.80 V)
-12V:     -27.36 V  (min = -15.86 V, max = -13.40 V)   ALARM
-5V:      -13.64 V  (min = -10.13 V, max =  -9.44 V)   ALARM
Stdby:     +0.00 V  (min =  +4.50 V, max =  +5.48 V)   ALARM
VBat:      +3.32 V
fan1:        0 RPM  (min = 3000 RPM, div = 2)          ALARM
fan2:     3924 RPM  (min = 3000 RPM, div = 2)
fan3:        0 RPM  (min = 3000 RPM, div = 2)
Temp1/MB:    +76庵  (min =  +20庵, max =  +60庵)
Temp2/CPU:   -79庵  (min =  +20庵, max =  +60庵)
Temp3:       +55庵  (min =  +20庵, max =  +60庵)

Tempの値が可笑しいので修正します。ITE8705Fのドキュメントがdoc/chips/it87に有ったのでそれを参考にmodules.confを編集します。

# vi /etc/modules.conf

に以下を追加

options it87 temp_type=0x31

temp_typeをいろいろ変えてみる。

  • (抜粋)doc/chips/it87の表
      Legal values:
            sensor1         sensor2         sensor3         value
            -------         -------         -------         -----
            diode           diode           diode           0x07
            diode           diode           thermistor      0x23
            diode           thermistor      diode           0x15
            diode           thermistor      thermistor      0x31
            thermistor      diode           diode           0x0e
            thermistor      diode           thermistor      0x2a   ** default
            thermistor      thermistor      diode           0x1c
            thermistor      thermistor      thermistor      0x38

しかし自分のPCではtemp_typeをどうやってもTemp2とTemp3がまともな値にならない。

Temp1/MB:    +39庵  (min =  +20庵, max =  +60庵)
Temp2/CPU:   +95庵  (min =  +20庵, max =  +60庵)
Temp3:       +55庵  (min =  +20庵, max =  +60庵)

仕方ないのでTemp1のデータのみ使う。上の結果ではTemp1/MBとなってるが実際はCPUみたいだ。CGIスクリプトにF5アタックを行ったら急激に変化したのでたぶんCPUだろう。sensorsの表記を編集したい場合は/etc/sensors.confをいじればよい。

不要なモジュールを読み込まないようにする

logを見るとエラーが出ているので温度取得に関係ないモジュールを外す。

# vi /etc/sysconfig/lm_sensors
#MODULE_0=i2c-sis630
MODULE_0=i2c-isa
#MODULE_2=eeprom
#MODULE_3=sis5595
MODULE_1=it87

自動起動の設定

起動スクリプトのコピー

# cp prog/init/lm_sensors.init /etc/rc.d/init.d/lm_sensors
# chkconfig lm_sensors on

リブートして動作することを確認する。

CPU温度値の取得

CPUの温度は

# cat /proc/sys/dev/sensors/it87-isa-0290/temp1
60.0 20.0 35.0

を見ることでも得られる。

なので、ここの値をスクリプトで取得してMRTGに渡すことにする。

# vi /usr/local/mrtg-2/cpu_temp.sh

新規に作成します。

#!/bin/sh
awk '{print int($3)}{print int($3)}' /proc/sys/dev/sensors/it87-isa-0290/temp1

MRTGは入力が2系統なためprintで同じデータを2つ出力しています。

実行権限を与える

# chmod 755 /usr/local/mrtg-2/cpu_temp.sh

mrtg.confの編集

# vi /usr/local/mrtg-2/lib/mrtg.cfg

追加

### CPU Temperature ###
Target[ctemp]: `/usr/local/mrtg-2/cpu_temp.sh`
MaxBytes[ctemp]: 48
Options[ctemp]: gauge, growright, absolute, integer, nopercent, noinfo
Unscaled[ctemp]: dwmy
YLegend[ctemp]: Temperature
ShortLegend[ctemp]: deg.
LegendI[ctemp]: TEMP&nbsp;
LegendO[ctemp]: TEMP&nbsp;
Legend1[ctemp]: CPU温度
Legend2[ctemp]: CPU温度
Title[ctemp]: CPUの温度
PageTop[ctemp]: <H1>CPUの温度</H1>

実行

# /usr/local/mrtg-2/bin/mrtg /usr/local/mrtg-2/lib/mrtg.cfg

何回か実行してエラーが出なくなればOK。

インディクスページの作成

# /usr/local/mrtg-2/bin/indexmaker --columns=1 \
--addhead="<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=euc-jp\">" \
/usr/local/mrtg-2/lib/mrtg.cfg > /home/httpd/html/mrtg/index.html

CPUの温度監視(ノートパソコンの場合)

ノートパソコンの場合、センサチップが搭載されていない場合が多い。その代わり、ACPIにより温度取得ができる。

以下は、IBM Thinkpad X23(低電圧版モバイルPentium III-M 866MHz)の話。

Thinkpad X23では、ACPIによりCPUの温度を取得できる。

モジュールを組み込む

ACPI関係のモジュールを探す

# modprobe -l |grep acpi
/lib/modules/2.4.27-0vl7/kernel/drivers/acpi/asus_acpi.o
/lib/modules/2.4.27-0vl7/kernel/drivers/acpi/processor.o
/lib/modules/2.4.27-0vl7/kernel/drivers/acpi/thermal.o
/lib/modules/2.4.27-0vl7/kernel/drivers/acpi/toshiba_acpi.o
/lib/modules/2.4.27-0vl7/kernel/drivers/hotplug/acpiphp.o

thermal.oが関係しそうなモジュールなので、

# modprobe thermal

とやると組み込める。

lsmodでthermalがあればOK。

# lsmod
Module                  Size  Used by    Tainted: P
thermal                 8068   0
:
:

/proc/acpiにthermal_zoneが現れているはずなので、

# cat /proc/acpi/thermal_zone/THM0/temperature
temperature:             49 C

でCPUの温度が表示される。

ちなみに、

# modprobe processor

を組み込むと、/proc/acpiにprocessorが現れて、

# cat /proc/acpi/processor/CPU/performance
state count:             2
active state:            P0
states:
   *P0:                  733 MHz, 12500 mW, 500 uS
    P1:                  466 MHz, 9500 mW, 500 uS

でCPUの情報などを確認できる。

起動時に自動的に組み込まれるように、

# vi /etc/rc.d/rc.local

一番下に追加

modprobe thermal

あとは、上と同じようにシェルスクリプトで値を取得してMRTGに渡せばよい。

コメント