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進数 |
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が崩壊するまでの訂正不可能エラー数の推移をグラフ化して調査したいと思います。
ついでにHDDの内部温度をグラフ化してみました。サーバルーム温度は旧サイトで紹介したUSB温度計の温度を取得したもの。いずれリサイクル記事を投稿する予定です。
グラフを見るとHDDの内部温度は、部屋の+10度で安定しているのがわかりますね。
9.HDDのS.M.A.R.T.監視設定完了
ということでS.M.A.R.T.監視設定が完了しました。ハードウェアRAID可能なRAIDカードを搭載したサーバでは利用できませんが、PCサーバでは役に立つのではないでしょうか。