「smartmontools」によるハードディスクの監視

「smartmontools」によるハードディスクの監視を行う。
また、「MRTG」によりハードディスクの温度監視を行う。
この時、ネットワーク上のホストの場合、「Net-SNMP」を利用して監視を行う。
「MRTG」、「Net-SNMP」の導入については、各OSの設定のページを参照。
なお、ここでは、Linuxの場合のデバイス指定になっているが、各OSごとのハードディスクのデバイスファイルを指定する。

「smartmontools」の実行

「smartmontools」のインストール

Linuxであれば、大体のディストリビューションでパッケージが用意されているので、ディストリビューションごとの方法でインストールする。
FreeBSDではPortsのパスは
/usr/ports/sysutils/smartmontools
になる。

「S.M.A.R.T.」の有効化

Unix# smartctl -s on -o on -S on /dev/hda

smartctl コマンドの主なオプションは以下の通り。

オプション 説明
-a すべての情報を表示する。
-A 温度やシークエラーなどの状況を表示する。
-i ハードディスクのS.M.A.R.T.サポート状況を表示する。
-l ログを表示する(引数にerror, selftest, directoryのいずれかを指定)。
-t テストを実行する(引数にshort,longのいずれかを指定)。
-h ヘルプ。

なお、RedHatやFedoraでは smartctl コマンドの作者が異なり、中身も異なるので、オプションも多少違ってくる。

-a オプションで表示される情報のうち、以下は注意しておいた方が良い。

ID 内容 説明
5 Reallocated_Sector_Ct ハードディスクが読み込み・書き込みのエラーを見つけ、代替させた不良セクタ数。
7 Seek_Error_Rate ハードディスクの磁気ヘッドのシークエラー率。
8 Seek_Time_Performance ハードディスクの磁気ヘッドのパフォーマンス。
この値の減少は障害の兆候である。
194 Temperature_Celsius ハードディスクの温度。
196 Reallocated_Event_Count 不良セクタから予備領域にデータを移した回数。
197 Current_Pending_Sector 不安定なセクタ数。
198 Offline_Uncorrectable 修復できないセクタの読み書き時のエラー量。
この値が増えることはハードディスクに問題がある。
200 Multi_Zone_Error_Rate セクタへの書き込みエラー率。
201 Soft_Read_Error_Rate ソフトウェアがハードディスクからのデータ読み取りエラー率。
「smartd」デーモンの設定

「smartd」デーモンの設定

Unix# vi /etc/smartd.conf <= 設定ファイルの編集
DEVICESCAN
↓
#DEVICESCAN <= コメントアウト

/dev/hda -H -m root@localhost <= 追加(ハードディスク異常時にrootにメールを送信する)

「smartd」デーモンの自動実行

Linuxであれば、ディストリビューションごとのパッケージでインストールしていれば、その方法に則って設定する。
FreeBSDでは以下のように設定する。

FreeBSD# vi /etc/rc.conf <= 設定ファイルの編集
smartd_enable="YES" <= 追加
「MRTG」による温度のグラフ化

温度の取得

「MRTG」に値を渡す為のスクリプトを作成する。
必要な値は
・入力
・出力
・稼働時間
・ホスト名
であり、改行で区切って渡す。
ここでは稼働時間とホスト名は指定しない。
また、ハードディスクを複数用意しているので、入力と出力を指定している。
もし一つしかない場合、出力の部分を
echo 0
とする。

Unix# vi gethddtemp.sh <= スクリプトの新規作成
#!/bin/sh

/usr/sbin/smartctl -A /dev/hda | grep Temperature_Celsius | awk '{print $10}'
/usr/sbin/smartctl -A /dev/hdb | grep Temperature_Celsius | awk '{print $10}'
echo
echo


Unix# chmod 755 /root/gethddtemp.sh <= スクリプトファイルに実行権限付加

「MRTG」の設定

スクリプトから温度を取得するの場合

基本的には、Targetの部分で作成したスクリプトを指定するだけで、その他の部分は大体他の「MRTG」の設定と同じ。
また、温度が60度を越えたらメールで通知する。
なお、警告メール用のスクリプトは後述。

Unix# vi /etc/mrtg/mrtg.cfg <= 設定ファイルの編集
以下を追加
SetEnv[_]: HOSTNAME="localhost.crimson-snow.net"
ThreshDir: /var/www/mrtg
ThreshProgI[_]: /root/mrtg_warning.pl
ThreshProgO[_]: /root/mrtg_warning.pl
ThreshProgOKI[_]: /root/mrtg_warning.pl
ThreshProgOKO[_]: /root/mrtg_warning.pl

### Disk Temperature ####
Target[disktemp]: `/root/gethddtemp.sh`
ThreshMaxI[disktemp]: 60
ThreshMaxO[disktemp]: 60
MaxBytes[disktemp]: 100
Unscaled[disktemp]: dwmy
Options[disktemp]: gauge, absolute, growright, nopercent, noinfo, integer
YLegend[disktemp]: Disk Temperature
ShortLegend[disktemp]: (Celsius)
LegendI[disktemp]: hda
LegendO[disktemp]: hdb
Legend1[disktemp]: hda
Legend2[disktemp]: hdb
Title[disktemp]: HDD 温度
PageTop[disktemp]: <H1>HDD 温度</H1>

「Net-SNMP」経由で温度を取得するの場合

ネットワーク上のホスト等では「Net-SNMP」経由で取得する。
この場合、まず温度を監視したいホスト上で上記の温度を取得するスクリプトを作成し、「Net-SNMP」の設定を行う。
その後、「MRTG」側のホストで上記の設定の Target の部分を変更する。
その他の設定は基本的に上記と同じ。

Unix# vi /etc/snmp/snmpd.conf <= 設定ファイルの編集
# exec .1.3.6.1.4.1.2021.51 ps /bin/ps
↓
exec .1.3.6.1.4.1.2021.51 HDD_Temperature /root/gethddtemp.sh <= 温度監視用のスクリプトファイルを指定

「MRTG」側のホストで「Net-SNMP」経由で温度が取得できるか確認する。
なお、ここでは温度取得対象のホストのIPアドレスを 192.168.0.2 としている。

Unix# snmpwalk -v 2c -c public 192.168.0.2 .1.3.6.1.4.1.2021.51 <= 温度が取得できるか確認
UCD-SNMP-MIB::ucdavis.51.1.1 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.51.2.1 = STRING: "HDD_Temperature"
UCD-SNMP-MIB::ucdavis.51.3.1 = STRING: "/root/gethddtemp.sh"
UCD-SNMP-MIB::ucdavis.51.100.1 = INTEGER: 0
UCD-SNMP-MIB::ucdavis.51.101.1 = STRING: "52"
UCD-SNMP-MIB::ucdavis.51.101.2 = STRING: "52"
UCD-SNMP-MIB::ucdavis.51.101.3 = ""
UCD-SNMP-MIB::ucdavis.51.101.4 = ""
UCD-SNMP-MIB::ucdavis.51.102.1 = INTEGER: 0
UCD-SNMP-MIB::ucdavis.51.103.1 = ""

上記の様に取得できれば問題ない。
ここで、
UCD-SNMP-MIB::ucdavis.51.101.1 = STRING: "52"
UCD-SNMP-MIB::ucdavis.51.101.2 = STRING: "52"
の部分が温度になるので、この部分を利用して「MRTG」を設定する。
「MRTG」の設定は基本的にスクリプトから温度を取得する場合と Target の部分が違うだけで、 その他は同じなので、変更部分だけを記述する。

Unix# vi /etc/mrtg/mrtg.cfg <= 設定ファイルの編集
Target[disktemp]: `/root/gethddtemp.sh`
↓
Target[disktemp]: .1.3.6.1.4.1.2021.51.101.1&.1.3.6.1.4.1.2021.51.101.2:public@192.168.0.2 <= 変更

警告メール用スクリプト作成

上記の「MRTG」の設定で、警告時・復旧時にメールを送信するように設定したので、そのスクリプトを作成する。
警告時・復旧時に実行されるスクリプトには
・識別子
・閾値
・現在のパラメータ値
の3つが引数として渡されるので、これを利用してスクリプトを作成する。

Unix# vi /root/mrtg_warning.pl <= 警告時メール用スクリプトファイル作成
#!/usr/bin/perl

$TO = "root";
$FROM = "root";
if ($ARGV[1] < $ARGV[2]){
  $SUBJECT = "[ Warning : $ENV{'HOSTNAME'} ] $ARGV[0]";
} else {
  $SUBJECT = "[ Recovery : $ENV{'HOSTNAME'} ] $ARGV[0]";
}

open(MAIL,"|/usr/bin/nkf -j | /usr/sbin/sendmail -f $FROM -t");

print MAIL "From: $FROM\n";
print MAIL "To: $TO\n";
print MAIL "Subject: $SUBJECT\n\n";

if ($ARGV[1] < $ARGV[2]){
  print MAIL `date` . "$ARGV[0] が閾値以上になりました。\n";
} else {
  print MAIL `date` . "$ARGV[0] が正常値に戻りました。\n";
}

print MAIL "------------------------------------------------- \n";
print MAIL "  閾値   : $ARGV[1] \n";
print MAIL "  現在値 : $ARGV[2] \n";
print MAIL "------------------------------------------------- \n\n";

foreach(@ARGV){
  print MAIL "$_\n";
}

close(MAIL);


Unix# chmod 755 /root/mrtg_warning.pl <= スクリプトファイルに実行権限付加

「MRTG」の実行

修正後、2回はエラーが出力されるので、3回実行する。

Unix# mrtg /etc/mrtg/mrtg.cfg

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

Unix# indexmaker --columns=1 /etc/mrtg/mrtg.cfg > /var/www/mrtg/index.html
▲ページのトップへ