サーバの温度監視(SuSE編)


おやじのサーバではHDDが不調になるケースが多く、新品でも1年半程度経過すると異音がし始めたりエラーが出たりしました。経過時間的にも初期不良や偶発故障と思われず、装置寿命のように見えます。おやじ自身はHDDの寿命に一番影響を与えるのは温度と考えていますので、これについて監視を行ってみることにしました。監視には、smartmontoolsというソフトが使えます。また、lm_sensorsを使用するとLinuxでもCPU温度やFAN回転数等のモニタができることがわかりましたので、早速導入してみました。
結果的には、そうむちゃくちゃな状態とも思えず、他の方はそれほどHDDが壊れるという話もないようなので、もうひとつの原因としてはアクセス数があるのかもしれません。

MRTGの設定やサンプル等は、こちらを参照願います。

■smartmontoolsのインストールと設定

smartmontoolsは、HDDのS.M.A.R.T.情報を読み出すツールで、今回はこれを利用しました。このツールはリアルタイムに情報を取得するだけでなく、エラーを検知した場合にメール通知することができるデーモンモードもあります。(本件はおまけで)

◆smartmontoolsのインストール

SuSE9.0/9.1ではsmartmontoolsは、デフォルトでインストールされていました。一応、YaSTでインストールされているか確認し、もしインストールされていなければインストールしてください。

◆smartmontoolの動作確認

smartmontoolsは、ほとんど設定はいりません。

  1. まずは、smartctlコマンド(SuSEではsmartmontoolsではないので注意)でS.M.A.R.T.機能を利用可能とする。下記は、hdaを監視する場合の例である。但し、このままではシステムを再起動すると無効になってしまうので、監視に使用するので、システム起動時にS.M.A.R.T.機能を利用可能とするため、同じ内容( smartctl -s on -o on -S on /dev/hda )を/etc/init.d/boot.localに追記しておく。前述の内容はHDDがATA(IDE)接続の場合である。SATA接続の場合は、kernel2.6.9以降という条件付で、smartctl -s on -o on -S on /dev/sda とすることで情報収集できる。

    # smartctl -s on -o on -S on /dev/hda
    smartctl version 5.1-18 Copyright (C) 2002-3 Bruce Allen
    Home page is http://smartmontools.sourceforge.net/

    === START OF ENABLE/DISABLE COMMANDS SECTION ===
    SMART Enabled.
    SMART Attribute Autosave Enabled.
    SMART Automatic Offline Testing Enabled every four hours.


  2. 続いて、S.M.A.R.T.でデータを取得してみる。多くのデータが表示されるが、ID=194(行頭の数字)が動作温度であり、最後の数字が現在の温度である。因みの、中ほどの046が過去最高温度である。なお、全てのHDDが温度データを持っているわけではないので、ID=194がなければあきらめるしかない。下記のコマンドイメージはATA(IDE)接続の場合である。SATA接続の場合は、kernel2.6.9以降という条件付で、 smartctl -i -d ata -a /dev/sda とすることで情報収集できる。

    # smartctl -a /dev/hda
    smartctl version 5.1-18 Copyright (C) 2002-3 Bruce Allen
    Home page is http://smartmontools.sourceforge.net/

    === START OF INFORMATION SECTION ===
    Device Model: ST3120022A
    Serial Number: 5JS1GR9R
    Firmware Version: 3.06
    Device is: Not in smartctl database [for details use: -P showall]
    ATA Version is: 6
    ATA Standard is: ATA/ATAPI-6 T13 1410D revision 2
    Local Time is: Tue Nov 2 22:29:51 2004 JST
    SMART support is: Available - device has SMART capability.
    SMART support is: Enabled

     (以下、ズラズラと解説と取得データが表示される)

     (snip)

    194 Temperature_Celsius 0x0022 042 046 000 Old_age Always - 42


◆HDD温度の測定

上記でHDDの温度データが採れるようになったので、これを利用してmrtgでグラフ化します。HDDの温度データは、smartctlコマンドを使ってデータを取得する perl スクリプトを作成し、 mrtg からの要求に対してHDDから温度データを読み取り返送するようにしました。おやじが作成したスクリプトはこちらのような簡単なもので、mrtgはデータが2系統必要なので同じデータを2個返送しています。(ATA(IDE)接続の場合とSATA接続の場合でコマンドが違うので、環境に合わせて選択すること。)このスクリプトを利用してHDD温度を監視するmrtg.cfgの例を以下に示しますが、このスクリプトは、/usr/local/bin配下にhdd_temp.cgiとして設置した場合の例です。(実際のmrtg.cfgでは、パラメータの後ろにあるコメントは消すこと。)

### HDD Temperature ###
#  --- Target に hdd_temp.cgi のあるパスを指定
#                   バックティック (`) は必要
Target[htemp]: `perl /usr/local/bin/hdd_temp.cgi`
#      --- MaxBytes を各自の場合にあわせて下さい
MaxBytes[htemp]: 60                     #データの最大値(最大セッション数)
Options[htemp]:  gauge, growright, absolute, integer, nopercent, noinfo
                                        #gauge:データの値の差をとらない(取得情報は既に平均値)
#growright:グラフの横軸(時間)を左が過去になるよう指定
#absolute:gauge同様データの値の差をとらず、計測時間間隔で割った値 #integer:値を整数化
#noinfo:HTMLの先頭にデバイス名等を表示しない
#nopercent:パーセント表示しない(取得情報は既に%値)
#Unscaled[htemp]: dwmy #最大値に対して値が小さいのでデータに合わせて拡大縮小 YLegend[htemp]: Temperature #Y軸の軸の名前(ラベル)を指定 ShortLegend[htemp]: deg. #Y軸の軸の単位(ラベル)を指定 LegendI[htemp]: TEMP  #OID1(受信側)のラベルを指定 LegendO[htemp]: TEMP  #OID2(送信側)のラベルを指定 Legend1[htemp]: HDD温度 #OID1(受信側)のグラフ名(ラベル)を指定
Legend2[htemp]: HDD温度 #OID2(送信側)のグラフ名(ラベル)を指定
Title[htemp]: HDD Temperature #HTMLのタイトル PageTop[htemp]: <H1>HDD Temperature</H1>
#HTMLのページ上部に表示される内容

■lm_sensorsのインストールと設定

lm_sensorsは、マザーボードのセンサチップからデータを取得するツールで、多くのマザーボードに対応可能です。但し、導入そのものは簡単ですが、正しく動かすとなるとsmartmonntoolsのように簡単ではありません。特に、正しい値を取得するための設定(対応方法)がマザーボード(センサチップ)毎に異なりますので、自動検出でうまく測定できればいいのですが、測定値がおかしい場合は、ドキュメントと睨めっこしながらカット・アンド・トライすることになりますので根性を入れてやりましょう。どうやっても、値が正常にならないケースもあります。このような状況なので、全く同じ環境がない限り対応方法は絶対に同じにはならないので、他人を頼ることはできません。従って、本件だけはおやじもサポートは一切できませんのであしからず。
 ここでは、とりあえず現用機と予備機の2例をあげておきますが、いずれも自動検出ではうまくいかず、対処方法もセンサチップが違いますので全く異なりました。まずは、おやじの現用機であるAOpen AX4SPE-Nの例を以下に示します。

◆lm_sensorsのインストール

lm_sensorsをインストールしようとYaSTで調べたのですが、最初はうまくヒットしないのでソースから入れようかと思ったのですが、再度調べたところSuSE9.0/9.1ではsensorsという名称になっており、デフォルトでインストールされていました。一応、YaSTでインストールされているか確認し、もしインストールされていなければインストールしてください。

◆lm_sensorsの設定

続いて、lm_sensorsの設定を行いますが、基本的な設定はいたって簡単です。但し、最初に取得できる値は未調整なのでおかしな値になっていることが多く、これについては個別に設定ファイル(/etc/sensors.conf等)を修正する必要があります。
  1. まずは、マザーボードに載っているセンサを調査する。「sensors-detect」と入力すると、いろいろ質問されますが基本的にはYes(Enter入力。大文字で表示されている値がデフォルトを示す。)で問題ないはずですので、最後まで答えてください。但し、PCI接続のセンサ検出でディスプレイカードが検出されることが多く(おやじは2台とも検出した)、これは意味がないし、後でセンスした時にわけのわからないデータがゾロゾロでてくるので、「no」としたほうがよい。下記では、savage-4を検出している。

    # sensors-detect
    This program will help you to determine which I2C/SMBus modules you need to
    load to use lm_sensors most effectively.
    You need to have done a `make install', issued a `depmod -a' and made sure
    `/etc/modules.conf' (or `/etc/conf.modules') contains the appropriate
    module path before you can use some functions of this utility. Read
    doc/modules for more information.
    Also, you need to be `root', or at least have access to the /dev/i2c[-/]* files
    for some things if you do not have them already.
    If you have patched your kernel and have some drivers built-in you can
    safely answer NO if asked to load some modules. In this case, things may
    seem a bit confusing, but they will still work.

    BIOS vendor (ACPI): AOpen
    We can start with probing for (PCI) I2C or SMBus adapters.
    You do not need any special privileges for this.
    Do you want to probe now? (YES/no):
    [Enter]
    Probing for PCI bus adapters...
    Use driver `i2c-i801' for device 00:1f.3: Intel 82801EB ICH5
    Use driver `i2c-savage4' for device 01:00.0: S3 Savage 4
    Probe succesfully concluded.

    We will now try to load each adapter module in turn.
    Load `i2c-i801' (say NO if built into your kernel)? (YES/no):[Enter]
    Note: /etc/modules.conf.local is more recent than /lib/modules/2.4.21-243-default/modules.
    dep
    Module loaded succesfully.
    Load `i2c-savage4' (say NO if built into your kernel)? (YES/no):
    no
    Do you now want to be prompted for non-detectable adapters? (yes/NO):[Enter]
    To continue, we need module `i2c-dev' to be loaded.
    If it is built-in into your kernel, you can safely skip this.
    i2c-dev is not loaded. Do you want to load it now? (YES/no):[Enter]
    Note: /etc/modules.conf.local is more recent than /lib/modules/2.4.21-243-default/modules.
    dep
    Module loaded succesfully.

    We are now going to do the adapter probings. Some adapters may hang halfway
    through; we can't really help that. Also, some chips will be double detected;
    we choose the one with the highest confidence value in that case.
    If you found that the adapter hung after probing a certain address, you can
    specify that address to remain unprobed. That often
    includes address 0x69 (clock chip).

    Next adapter: SMBus I801 adapter at 5000 (Non-I2C SMBus adapter)
    Do you want to scan it? (YES/no/selectively):[Enter]
    Client found at address 0x08
    Client found at address 0x2e
    Probing for `Myson MTP008'... Failed!
    Probing for `National Semiconductor LM78'... Failed!
    Probing for `National Semiconductor LM78-J'... Failed!
    Probing for `National Semiconductor LM79'... Failed!
    Probing for `National Semiconductor LM80'... Success!
    (confidence 3, driver `lm80')
    Probing for `National Semiconductor LM85'... Failed!
    Probing for `Analog Devices ADM1027 or ADT7463'... Failed!
    Probing for `SMSC EMC6D100 and EMC6D101'... Failed!
    Probing for `National Semiconductor LM87'... Failed!
    Probing for `Winbond W83781D'... Failed!
    Probing for `Winbond W83782D'... Failed!
    Probing for `Winbond W83783S'... Failed!
    Probing for `Winbond W83791D'... Failed!
    Probing for `Winbond W83627HF'... Failed!
    Probing for `Asus AS99127F'... Failed!
    Probing for `Winbond W83L784R/AR'... Failed!
    Probing for `Winbond W83L785TS'... Failed!
    Probing for `Analog Devices ADM9240'... Failed!
    Probing for `Dallas Semiconductor DS1780'... Failed!
    Probing for `National Semiconductor LM81'... Failed!
    Probing for `Analog Devices ADM1026'... Failed!
    Probing for `Analog Devices ADM1025'... Failed!
    Probing for `Analog Devices ADM1024'... Failed!
    Probing for `Analog Devices ADM1022'... Failed!
    Probing for `Texas Instruments THMC50'... Failed!
    Probing for `ITE IT8705F / IT8712F / SiS 950'... Failed!
    Client found at address 0x44
    Client found at address 0x4e
    Probing for `National Semiconductor LM75'... Failed!
    Probing for `Dallas Semiconductor DS1621'... Failed!
    Probing for `Analog Devices ADM1021'... Failed!
    Probing for `Analog Devices ADM1021A/ADM1023'... Failed!
    Probing for `Maxim MAX1617'... Success!
    (confidence 3, driver `adm1021')
    Probing for `Maxim MAX1617A'... Failed!
    Probing for `TI THMC10'... Failed!
    Probing for `National Semiconductor LM84'... Success!
    (confidence 6, driver `adm1021')
    Probing for `Genesys Logic GL523SM'... Failed!
    Probing for `Onsemi MC1066'... Failed!
    Probing for `National Semiconductor LM83'... Failed!
    Probing for `Philips Semiconductors PCF8591'... Success!
    (confidence 1, driver `pcf8591')
    Client found at address 0x50
    Probing for `Serial EEPROM'... Success!
    (confidence 8, driver `eeprom')
    Probing for `DDC monitor'... Failed!
    Client found at address 0x52
    Probing for `Serial EEPROM'... Success!
    (confidence 8, driver `eeprom')
    Client found at address 0x69

    Some chips are also accessible through the ISA bus. ISA probes are
    typically a bit more dangerous, as we have to write to I/O ports to do
    this. Do you want to scan the ISA bus? (YES/no):[Enter]
    Probing for `National Semiconductor LM78'
    Trying address 0x0290... Failed!
    Probing for `National Semiconductor LM78-J'
    Trying address 0x0290... Failed!
    Probing for `National Semiconductor LM79'
    Trying address 0x0290... Failed!
    Probing for `Winbond W83781D'
    Trying address 0x0290... Failed!
    Probing for `Winbond W83782D'
    Trying address 0x0290... Failed!
    Probing for `Winbond W83627HF'
    Trying address 0x0290... Success!
    (confidence 8, driver `w83781d')
    Probing for `Winbond W83697HF'
    Trying address 0x0290... Failed!
    Probing for `Silicon Integrated Systems SIS5595'
    Trying general detect... Failed!
    Probing for `VIA Technologies VT82C686 Integrated Sensors'
    Trying general detect... Failed!
    Probing for `VIA Technologies VT8231 Integrated Sensors'
    Trying general detect... Failed!
    Probing for `ITE IT8705F / IT8712F / SiS 950'
    Trying address 0x0290... Failed!
    Probing for `IPMI BMC KCS'
    Trying address 0x0ca0... Failed!
    Probing for `IPMI BMC SMIC'
    Trying address 0x0ca8... Failed!

    Some Super I/O chips may also contain sensors. Super I/O probes are
    typically a bit more dangerous, as we have to write to I/O ports to do
    this. Do you want to scan for Super I/O sensors? (YES/no):[Enter]
    Probing for `SMSC 47M1xx Super IO Fan Sensors'
    Failed!
    Probing for `VT1211 Super IO Sensors'
    Failed!
    Probing for `Winbond W83627HF Super IO Sensors'
    Failed!
    Probing for `Winbond W83627THF Super IO Sensors'
    Failed!
    Probing for `Winbond W83697HF Super IO Sensors'
    Failed!

    Now follows a summary of the probes I have just done.
    Just press ENTER to continue:[Enter]

    Driver `lm80' (should be inserted):
    Detects correctly:
    * Bus `SMBus I801 adapter at 5000' (Non-I2C SMBus adapter)
    Busdriver `i2c-i801', I2C address 0x2e
    Chip `National Semiconductor LM80' (confidence: 3)

    Driver `adm1021' (should be inserted but causes problems):
    Detects correctly:
    * Bus `SMBus I801 adapter at 5000' (Non-I2C SMBus adapter)
    Busdriver `i2c-i801', I2C address 0x4e
    Chip `National Semiconductor LM84' (confidence: 6)
    Misdetects:
    * Bus `SMBus I801 adapter at 5000' (Non-I2C SMBus adapter)
    Busdriver `i2c-i801', I2C address 0x4e
    Chip `Maxim MAX1617' (confidence: 3)

    Driver `pcf8591' (may not be inserted):
    Misdetects:
    * Bus `SMBus I801 adapter at 5000' (Non-I2C SMBus adapter)
    Busdriver `i2c-i801', I2C address 0x4e
    Chip `Philips Semiconductors PCF8591' (confidence: 1)

    Driver `eeprom' (should be inserted):
    Detects correctly:
    * Bus `SMBus I801 adapter at 5000' (Non-I2C SMBus adapter)
    Busdriver `i2c-i801', I2C address 0x50
    Chip `Serial EEPROM' (confidence: 8)
    * Bus `SMBus I801 adapter at 5000' (Non-I2C SMBus adapter)
    Busdriver `i2c-i801', I2C address 0x52
    Chip `Serial EEPROM' (confidence: 8)

    Driver `w83781d' (should be inserted):
    Detects correctly:
    * ISA bus address 0x0290 (Busdriver `i2c-isa')
    Chip `Winbond W83627HF' (confidence: 8)


    I will now generate the commands needed to load the I2C modules.
    Sometimes, a chip is available both through the ISA bus and an I2C bus.
    ISA bus access is faster, but you need to load an additional driver module
    for it. If you have the choice, do you want to use the ISA bus or the
    I2C/SMBus (ISA/smbus)?[Enter] 
    Use of uninitialized value in string eq at /usr/sbin/sensors-detect line 3222.
    Use of uninitialized value in string eq at /usr/sbin/sensors-detect line 3234.

    To make the sensors modules behave correctly, add these lines to either
    /etc/modules.conf or /etc/conf.modules:

    #----cut here----
    # I2C module options
    alias char-major-89 i2c-dev
    options adm1021 ignore=0,0x4e
    #----cut here----

    To load everything that is needed, add this to some /etc/rc* file:

    #----cut here----
    # I2C adapter drivers
    modprobe i2c-i801
    modprobe i2c-isa
    # I2C chip drivers
    modprobe lm80
    modprobe adm1021
    modprobe eeprom
    modprobe w83781d
    # sleep 2 # optional
    /usr/local/bin/sensors -s # recommended
    #----cut here----

    WARNING! If you have some things built into your kernel, the list above
    will contain too many modules. Skip the appropriate ones! You really should
    try these commands right now to make sure everything is working properly.
    Monitoring programs won't work until it's done.

    Do you want to generate /etc/sysconfig/lm_sensors? (YES/no):[Enter]
    Copy /usr/share/doc/packages/sensors/prog/init/lm_sensors.init
    to /etc/init.d/lm_sensors for initialization at boot time.


    最初にPCI接続のセンサチップ、続いてISA接続のセンサチップの検出が行われ、検出すると「Success」と出る。おやじのこのマザーには、メタやたらいろいろなセンサが載っていたが、メインはWinbond のW83627HFである。(このままでは、おかしなデータが山ほど出るので、後で設定を編集して整理した。)

  2. 上記作業で、最後のほうに「/etc/rc.*」と「/etc/modules.conf or /etc/conf.modules」に追加するように内容が提示されるが、sensors-detectの最後で「/etc/sysconfig/lm_sensors」に同じ内容が設定されるので、この作業は不要である。

  3. 最後に、lm_sensorsの起動スクリプトが用意されているのでこれを登録し、システムを再起動する。

    # cp /usr/share/doc/packages/sensors/prog/init/lm_sensors.init  /etc/init.d/lm_sensors
    # chmod 755 /etc/init.d/lm_sensors
    # chkconfig lm_sensors on


以上で、取り敢えずの設定は完了です。バックアアプ機(GigaByte GA-6OXT-A)も同じ操作で実施しましたが、検出されるチップが異なるだけでした。

 

◆lm_sensorsの動作確認と調整

以上で設定が完了したので、実際にデータを取得してみましょう。まずは、現用機のAOpen AX4SPE-Nの例です。

  1. 下記のように「sensors」と入力すると、ズラズラと取得した各センサの値が出てくる。

    # sensors
    lm80-i2c-0-2e
    Adapter: SMBus I801 adapter at 5000
    Algorithm: Non-I2C SMBus adapter
    +5V:       +6.71 V  (min =  +6.71 V, max =  +6.71 V)   ALARM
    VTT:       +2.55 V  (min =  +2.55 V, max =  +2.55 V)  
    +3.3V:     +4.43 V  (min =  +4.43 V, max =  +4.43 V)  
    +Vcore:    +3.76 V  (min =  +3.76 V, max =  +3.76 V)  
    +12V:     +16.10 V  (min = +16.10 V, max = +16.10 V)  
    -12V:     -16.11 V  (min = -16.11 V, max = -16.11 V)  
    -5V:       -6.70 V  (min =  -6.70 V, max =  -6.70 V)  
    fan1:        0 RPM  (min =    0 RPM, div = 1)         
    fan2:        0 RPM  (min =    0 RPM, div = 1)         
    temp:     -1.00 庵 (hot:limit =  -1庵,  hysteresis =  -1庵) ALARM
             (os: limit =  -1庵,  hysteresis =  -1庵) ALARM
    alarms:   Board temperature input (LM75)               ALARM

    lm84-i2c-0-4e
    Adapter: SMBus I801 adapter at 5000
    Algorithm: Non-I2C SMBus adapter
    Board:        +0庵  (min =  +15庵, max = -128庵)
    CPU:         +45庵  (min =   +0庵, max =   +0庵)ALARM (HIGH)

    eeprom-i2c-0-50
    Adapter: SMBus I801 adapter at 5000
    Algorithm: Non-I2C SMBus adapter
    Memory type:            DDR SDRAM DIMM SPD
    Memory size (MB):       256

    eeprom-i2c-0-52
    Adapter: SMBus I801 adapter at 5000
    Algorithm: Non-I2C SMBus adapter
    Memory type:            DDR SDRAM DIMM SPD
    Memory size (MB):       256

    w83627hf-isa-0290
    Adapter: ISA adapter
    Algorithm: ISA algorithm
    VCore 1:   +1.48 V  (min =  +1.26 V, max =  +1.53 V)             
    VCore 2:   +1.52 V  (min =  +1.26 V, max =  +1.53 V)             
    +3.3V:     +3.24 V  (min =  +2.97 V, max =  +3.63 V)             
    +5V:       +4.94 V  (min =  +4.50 V, max =  +5.48 V)             
    +12V:     +11.70 V  (min = +10.79 V, max = +13.11 V)             
    -12V:     -12.03 V  (min = -13.21 V, max = -10.90 V)             
    -5V:       -5.10 V  (min =  -5.51 V, max =  -4.51 V)             
    V5SB:      +5.48 V  (min =  +4.50 V, max =  +5.48 V)             
    VBat:      +2.88 V  (min =  +2.70 V, max =  +3.29 V)             
    fan1:        0 RPM  (min = 3000 RPM, div = 2)              ALARM 
    fan2:        0 RPM  (min = 3000 RPM, div = 2)              ALARM 
    fan3:        0 RPM  (min = 1500 RPM, div = 4)              ALARM 
    temp1:       +34庵  (limit =  +60庵)                       sensor = thermistor          
    temp2:     +34.0庵  (limit =  +60庵, hysteresis =  +50庵) sensor = thermistor          
    temp3:    +208.0庵  (limit =  +60庵, hysteresis =  +50庵) sensor = thermistor          
    vid:      +1.400 V
    alarms:  
    beep_enable:
              Sound alarm disabled


    ところが、よく見ると各種の測定値がおかしかったり、ALARMの閾値がおかしいためアラームになったりしている。因みに「庵」は「℃」の文字化け。これらは、センサチップ毎に対処方法が異なるので、/usr/share/doc/packages/sensores/doc/chips/xxx を見て対処が必要である。

  2. まずは、余計な情報は自動化するのに不便なので、Winbond のW83627HFの情報(一番最後の情報)のみ取得するよう、「/etc/sysconfig/lm_sensors」の内容を編集(不要なモジュールをコメントアウト)する。

    MODULE_0=i2c-i801
    MODULE_1=i2c-isa
    MODULE_2=lm80
    MODULE_3=adm1021
    MODULE_4=eeprom
    MODULE_5=w83781d

              ↓編集

    #MODULE_0=i2c-i801
    MODULE_0=i2c-isa
    #MODULE_2=lm80
    #MODULE_3=adm1021
    #MODULE_4=eeprom
    MODULE_1=w83781d

  3. 設定が完了したらシステムを再起動し、再度「sensors」でデータを取得してみる。これにより、上記の一番最後のブロックだけが出力されるようになった。

  4. ただ、このマザーでは、FAN回転数が検出できなかったりtemp3が異常な温度を示したりしていたが、いずれも対処はできなかった。肝心のCPUとケース温度は、Motherboard MonitorのMotherboard Listで調べてみると見ると、temp1がCASEでtemp2/3がCPUであることがわかるのでこれを使用することにし、実際にあっているかはBIOSとCPU負荷をかけたりして、temp2がCPU温度であることを確認した。

続いて、バックアップ機のGigaByte GA-6OXT-Aの例を示す。こちらのセンサは、ITE8712Fというもの。

  1. 下記のように「sensors」と入力すると、ズラズラと取得した各センサの値が出てくる。

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

    eeprom-i2c-0-51
    Adapter: SMBus I801 adapter at 5000
    Algorithm: Non-I2C SMBus adapter
    Memory type:            SDRAM DIMM SPD
    Memory size (MB):       128

    it87-isa-0290
    Adapter: ISA adapter
    Algorithm: ISA algorithm
    VCore 1:   +1.50 V  (min =  +1.53 V, max =  +1.87 V)  ALARM
    VCore 2:   +1.26 V  (min =  +2.25 V, max =  +2.75 V)  ALARM
    +3.3V:     +6.58 V  (min =  +2.96 V, max =  +3.60 V)  ALARM
    +5V:       +4.91 V  (min =  +4.50 V, max =  +5.48 V)
    +12V:     +11.84 V  (min = +11.36 V, max = +13.80 V)
    -12V:     -13.25 V  (min = -15.86 V, max = -13.40 V)  ALARM
    -5V:       -1.60 V  (min = -10.13 V, max =  -9.44 V)  ALARM
    Stdby:     +5.02 V  (min =  +4.50 V, max =  +5.48 V)
    VBat:      +4.08 V
    fan1:     3708 RPM  (min = 3000 RPM, div = 2)
    fan2:        0 RPM  (min = 3000 RPM, div = 2)         ALARM
    fan3:        0 RPM  (min = 3000 RPM, div = 2)         ALARM
    Temp1/MB:    +25庵  (min = +20庵, max =  +60庵)
    Temp2/CPU:   +90庵  (min = +20庵, max =  +60庵)       ALARM
    Temp3:       +77庵  (min = +20庵, max =  +60庵)       ALARM


    こちらは、あまり余計な情報は出てこなかったので不要moduleの調整は行わなかったが、このボードではCPUファンが検出できていた。ただ、+3.3Vの値が2倍になっていたり、Temp2/CPUやTemp3の温度が燃えてしまいそうな値をしている。これらは、センサチップ毎に対処方法が異なるので、/usr/share/doc/packages/sensores/doc/chips/it87 を見て対処してみた。

  2. +3.3Vについては、「/etc/sensors.conf」のit87のセクションで、in2(label からこの値が+3.3Vであることがわかる)の値が2倍になるよう設定されているので、この行をコメントアウトした。

        compute in2   2*@, @/2

              ↓編集

    #    compute in2   2*@, @/2

  3. 温度については、Motherboard MonitorのMotherboard Listで調べてみると見ると、temp1がCASEでtemp3 diodeがCPUであることがわかる。また、チップセットのドキュメントを見ると、センサによってmodduleの指定でtemp_typeを指定することになっており、temp1:2:3がthermistor:thermistor:diodeの場合は、0x1Cにするよう指定されているので、それに合わせて、以下のように設定しなおした。

  4. Temp3がCPUなので、「/etc/sensors.conf」のit87のセクションのlabel値を変更した。

        label temp1       "Temp1/MB"
        set   temp1_over  40
        set   temp1_hyst  20
        label temp2       "Temp2
    /CPU"
        set   temp2_over  45
        set   temp2_hyst  25
    #   ignore temp3
        label temp3       "Temp3"
        set   temp3_over  45
        set   temp3_hyst  25


              ↓編集

        label temp1       "Temp1/MB"
        set   temp1_over  40
        set   temp1_hyst  20
        label temp2       "Temp2"
        set   temp2_over  45
        set   temp2_hyst  25
    #   ignore temp3
        label temp3       "Temp3
    /CPU"
        set   temp3_over  45
        set   temp3_hyst  25

  5. 続いて、温度異常を修正するため「/etc/sysconfig/lm_sensors」の内容を編集した。temp_typeの追加が必要であるが、"  "でくくらないと有効にならなかった。

    MODULE_0=i2c-i801
    MODULE_1=i2c-isa
    MODULE_2=eeprom
    MODULE_3=it87


              ↓編集

    MODULE_0=i2c-i801
    MODULE_1=i2c-isa
    MODULE_2=eeprom
    MODULE_3=
    "it87 temp_type=0x1c"

  6. 設定が完了したらシステムを再起動し、再度「sensors」でデータを取得してみると、下記のように変更され、正しい値が取得できるようになった。

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

    eeprom-i2c-0-51
    Adapter: SMBus I801 adapter at 5000
    Algorithm: Non-I2C SMBus adapter
    Memory type:            SDRAM DIMM SPD
    Memory size (MB):       128

    it87-isa-0290
    Adapter: ISA adapter
    Algorithm: ISA algorithm
    VCore 1:   +1.50 V  (min =  +1.53 V, max =  +1.87 V)  ALARM
    VCore 2:   +1.26 V  (min =  +2.25 V, max =  +2.75 V)  ALARM
    +3.3V:     
    +3.31 V  (min =  +1.48 V, max =  +1.80 V)  ALARM
    +5V:       +4.91 V  (min =  +4.50 V, max =  +5.48 V)
    +12V:     +11.84 V  (min = +11.36 V, max = +13.80 V)
    -12V:     -13.25 V  (min = -15.86 V, max = -13.40 V)  ALARM
    -5V:       -1.60 V  (min = -10.13 V, max =  -9.44 V)  ALARM
    Stdby:     +5.02 V  (min =  +4.50 V, max =  +5.48 V)
    VBat:      +4.08 V
    fan1:     3708 RPM  (min = 3000 RPM, div = 2)
    fan2:        0 RPM  (min = 3000 RPM, div = 2)         ALARM
    fan3:        0 RPM  (min = 3000 RPM, div = 2)         ALARM
    Temp1/MB:    +25庵  (min = +20庵, max =  +60庵)
    Temp2:       
    +25庵  (min = +20庵, max =  +60庵)       ALARM
    Temp3
    /CPU:   +40庵  (min = +20庵, max =  +60庵)       ALARM



◆CPUとケース温度の測定

上記でマザーボードからいろいろなデータが採れるようになったので、これを利用してmrtgでグラフ化します。ここでは、CPUとケースの温度を取得するようにした。sensorsコマンドを使ってデータを取得する perl スクリプトを作成し、 mrtg からの要求に対してルータからデータを読み取り返送するようにしました。おやじが作成したスクリプトはこちらのようなもので、取得したいデータのパラメータを2個(1個の場合は同じデータを返送)指定すれば、それらのデータが返送されるようにしました。(実際のmrtg.cfgでは、パラメータの後ろにあるコメントは消すこと。)
#### CPU & CASE Temperature ###
#  --- Target に cpu_temp.cgi のあるパスを指定
#                   バックティック (`) は必要
Target[ctemp]: `perl /usr/local/bin/cpu_temp.cgi temp1 temp2`
#      --- MaxBytes を各自の場合にあわせて下さい
MaxBytes[ctemp]: 80                     #データの最大値(最大セッション数)
Options[ctemp]:  gauge, growright, absolute, integer, nopercent, noinfo
                                        #gauge:データの値の差をとらない(取得情報は既に平均値)
#growright:グラフの横軸(時間)を左が過去になるよう指定
#absolute:gauge同様データの値の差をとらず、計測時間間隔で割った値 #integer:値を整数化
#noinfo:HTMLの先頭にデバイス名等を表示しない
#nopercent:パーセント表示しない(取得情報は既に%値)
#Unscaled[ctemp]: dwmy #最大値に対して値が小さいのでデータに合わせて拡大縮小 YLegend[ctemp]: Temperature #Y軸の軸の名前(ラベル)を指定 ShortLegend[ctemp]: deg. #Y軸の軸の単位(ラベル)を指定 LegendI[ctemp]: CASE #OID1(受信側)のラベルを指定 LegendO[ctemp]: CPU&nbsp; #OID2(送信側)のラベルを指定 Legend1[ctemp]: CPU温度 #OID1(受信側)のグラフ名(ラベル)を指定
Legend2[ctemp]: Case温度 #OID2(送信側)のグラフ名(ラベル)を指定
Title[ctemp]: CPU & CASE Temperature #HTMLのタイトル PageTop[ctemp]: <H1>CPU & CASE Temperature</H1>
#HTMLのページ上部に表示される内容

■smartmontoolsで常時監視(おまけ)

smartmontoolsは、リアルタイムに情報を取得するだけでなく、エラーを検知した場合にメール通知することができるデーモンモードもあります。
 せっかくなので、何かHDDでエラーが発生したらメール通知が来るようにしてみました。実際には、トラブルがないとメール通知はされないので、本当に動作するものなのかは確認できていません。

  1. 「/etc/smartd.conf」で、設定を行う。デフォルトで「DEVICESCAN」と設定されており、デーモン起動時に自動スキャンが行われるが、今回は、明示的に設定するのでこれはコメントアウトする。
    設定したのは下記のとおりで、hdaをヘルスチェックしエラーがあったときだけ(-H)指定されたアドレスにメール通知(-m ADD)するというものである。

    #DIVICESCAN
    
    /dev/hda -H -m root@localhost

  2. 設定ができたら、smartdの起動スクリプトを設定し起動しておく。

    # chkconfig smartd on
    # /etc/init.d/smartd start




Top Pageへ