ZabbixでHDDのS.M.A.R.T.を監視してみる

CentOSサーバのHDDの状態把握と障害予兆を検知する必要がでてきたので、ZabbixでHDDのS.M.A.R.T.を監視する方法を組み込んでみました。

参考文献

今回の記事は元ネタがあり、Zabbix.comのwikiを参考に組み込みました。
S.M.A.R.T. HDD Monitoring with Zabbix

1.smartctlをインストールする

LinuxでHDDのS.M.A.R.T.を読み込むにはsmartctlを使用します。CentOS6でインストールするにはsmartctlではなくsmartmontoolsでインストールします。

# yum install smartmontools

このサーバのHDDは東芝の「MQ01ABD050」。2.5インチのSATA-HDDで容量500GBです。このHDDでのsmartctlの結果がコチラ。

# smartctl -A /dev/sdb
smartctl 5.43 2012-06-30 r3573 [i686-linux-2.6.32-504.12.2.el6.i686] (local build)
Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000b   100   100   050    Pre-fail  Always       -       0
  2 Throughput_Performance  0x0005   100   100   050    Pre-fail  Offline      -       0
  3 Spin_Up_Time            0x0027   100   100   001    Pre-fail  Always       -       1068
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       6
  5 Reallocated_Sector_Ct   0x0033   100   100   050    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000b   100   100   050    Pre-fail  Always       -       0
  8 Seek_Time_Performance   0x0005   100   100   050    Pre-fail  Offline      -       0
  9 Power_On_Hours          0x0032   089   089   000    Old_age   Always       -       4707
 10 Spin_Retry_Count        0x0033   100   100   030    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       6
191 G-Sense_Error_Rate      0x0032   100   100   000    Old_age   Always       -       1
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       0
193 Load_Cycle_Count        0x0032   100   100   000    Old_age   Always       -       442
194 Temperature_Celsius     0x0022   100   100   000    Old_age   Always       -       34 (Min/Max 19/44)
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   200   200   000    Old_age   Always       -       0
220 Disk_Shift              0x0002   100   100   000    Old_age   Always       -       0
222 Loaded_Hours            0x0032   090   090   000    Old_age   Always       -       4078
223 Load_Retry_Count        0x0032   100   100   000    Old_age   Always       -       0
224 Load_Friction           0x0022   100   100   000    Old_age   Always       -       0
226 Load-in_Time            0x0026   100   100   000    Old_age   Always       -       255
240 Head_Flying_Hours       0x0001   100   100   001    Pre-fail  Offline      -       0

smartctlの結果を見る限りでは、2列目の「ATTRIBUTE_NAME」(属性名)と10列目の「RAW_VALUE」(生の値)を参照出来ればS.M.A.R.T.監視できそうです。

2.smartctlのコマンドを組み立てて見みる

HDDの障害予兆を検知したいのですが、今回のサーバでは定番のID#187 Reported_Uncorrectを拾うことができないのでID#197 Current_Pending_SectorとID#198 Offline_Uncorrectableの値を取得できるようにします。2列目の文字列でgrepし、awkで10列目の値だけを取り出します。
おまけにTempでgrepすれば、HDDの温度を取得することも可能です。

# smartctl -A /dev/sdb | grep  Current_Pending_Sector | awk '{print $10}'
0
# smartctl -A /dev/sdb | grep Offline_Uncorrectable | awk '{print $10}'
0
# smartctl -A /dev/sdb | grep Temp | awk '{print $10}'
34

3.zabbixユーザはパスワードなしでsudo smartctlを利用可能にする

smartctlはroot権限で実行しないと動作しないようです。Zabbixがコマンドを実行する場合はZabbixユーザを利用するのでコマンドの前にsudoを置いて実行する必要があります。
ただしデフォルトではrootパスワードを要求されてしまうので、visudoを編集してZabbixユーザはパスワードなしでsudo smartctlを実行できるようにします。

# visudo

- Defaults requiretty
+ #Defaults requiretty

+ zabbix  ALL=(ALL) NOPASSWD: /usr/sbin/smartctl -A /dev/sd?

4.Zabbixエージェントにユーザパラメータを設定する

次に監視対象サーバのZabbixエージェントにユーザパラメータで監視項目を追加します。Zabbixの監視アイテムのキーとしてhdd.smartを使用し、第1引数で監視HDDを指定・第2引数で属性名(監視項目)を指定します。この際、awkの10列目を示す$10を第10引数として認識させないよう、$でエスケープし$$10とすることを忘れないでください。

# vi /etc/zabbix/zabbix_agentd.conf
+ UserParameter=hdd.smart[*],smartctl -A /dev/$1 | grep $2 | awk '{print $$10}'

# service zabbix-agent restart

zabbix_agentd.confを編集後、zabbix-agentを再起動します。

5.Zabbixのコマンドテスト

ZabbixのGUIからhdd.smartの監視設定を行う前に、エージェント上でユーザパラメータを呼び出せるか、Zabbixサーバから対象CentOSサーバにSMART情報を呼び出せるのかをコマンドで確認します。

■Zabbixエージェント上でユーザパラメータを呼び出せるかのテスト

# zabbix_agentd -t hdd.smart[sdb,Temp]
hdd.smart[sdb,Temp]            [t|28]
# zabbix_agentd -t hdd.smart[sdb,Offline_Uncorrectable]
hdd.smart[sdb,Offline_Uncorrectable]            [t|0]

■ZabbixサーバからコマンドでHDDのSMARTを呼び出せるかテスト

# zabbix_get -s 198.51.100.86 -k hdd.smart[sdb,Temp]
28
# zabbix_get -s 198.51.100.86 -k hdd.smart[sdb,Offline_Uncorrectable]
0

この2つが成功したらS.M.A.R.T.のZabbix設定は終わったも同然。あとはZabbix上でアイテムとトリガーを作成するだけです。

6.Zabbixのアイテム設定

ということで、Zabbixでアイテムとトリガーを作成します。キーの第1引数はHDDを指定、第2引数で監視項目を指定します。

名前 $1 – 訂正不可能エラー数
タイプ Zabbixエージェント
キー hdd.smart[sdb,Offline_Uncorrectable]
データ型 数値(整数)
データの形式 10進数

hdd_smart_sdb_Current_Pending_Sector

7.障害予兆のトリガー設定

アイテム設定が出来たところで、最後にトリガーを設定します。Current_Pending_SectorもOffline_Uncorrectableも0が正常で、エラーが発生するとカウントアップするらしい。ということでこんなトリガーにしました。

名前 HDD障害予兆 sdb
条件式 {host:hdd.smart[sdb,Offline_Uncorrectable].last()}>0 | {host:hdd.smart[sdb,Current_Pending_Sector].last()}>0

8.グラフとか

このサーバはHDD2台でsoftwareRAID1を組んでいるのでHDD故障1台ならシステムへの影響はありません。障害予兆監視と同時にZabbixでRAID監視も行っているため、RAIDが崩壊するまでの訂正不可能エラー数の推移をグラフ化して調査したいと思います。
zabbix_hdd_failuresymptoms

ついでにHDDの内部温度をグラフ化してみました。サーバルーム温度は旧サイトで紹介したUSB温度計の温度を取得したもの。いずれリサイクル記事を投稿する予定です。
グラフを見るとHDDの内部温度は、部屋の+10度で安定しているのがわかりますね。
zabbix_hdd_temp

9.HDDのS.M.A.R.T.監視設定完了

ということでS.M.A.R.T.監視設定が完了しました。ハードウェアRAID可能なRAIDカードを搭載したサーバでは利用できませんが、PCサーバでは役に立つのではないでしょうか。