2006年6月13日火曜日

smartmontoolsでハードディスクの致命的エラー発生を事前に察知

けっこう前から、ハードディスクには、SMARTS.M.A.R.T.)という自己診断機能が備わっていて、データを読み書きしたときにエラーが発生したりすると、ドライブ内に、そのエラー発生状況が記録されます。



BIOSメニューにも、SMART機能を有効にする/しないの設定があったりするので、SMARTという機能があることを知っている人はそれなりにいると思いますが、有効に使っている人ってのは、あまりいないかも・・・?



私も、実は、あまり有効利用できていません。



ここ数年、家や職場などで、合計20台くらいのパソコンを使ってきていますが、パソコンを再起動したときに、SMART機能によって、「この前、このディスクドライブで、エラーが発生したんだけど、どうすんのよ?」みたいなメッセージを、過去にたったの1度だけ、見たことがあります。でも、ディスクがぶっ壊れたこと(論理情報をとばすんではなく、データが読めなくなったり、お皿が回んなくなったりしたこと)、それは、2~3回くらいあって、SMARTでの報告はありませんでした。あう~



BIOSのときにでてくるSMARTのレポートって、再起動しない限り、見えないわけでして、24時間、動かしっぱなしのパソコンの場合は、だめなんですよね。



そういうときは、SMART機能を使うためのユーティリティ・ソフトを使えばいい!ってわけで、そういうソフトのなかで、私が使っているものに、smartmontoolsという、FreeBSDほか、いろんなプラットフォームでつかえるfree softwareがあります。



http://smartmontools.sourceforge.net/



■ smartmontoolsのインストール



FreeBSDではportsになっているので、いつもportsでインストールするのと同様に、

# cd /usr/ports/sysutils/smartmontools/
# make install clean

だけでインストールは完了。さっきみたら、バージョンは5.36でした。



■ smartmontoolsの設定



/usr/local/etc/smartd.conf.sample という設定ファイルがあるので、smartd.confというファイル名でコピーして、中身を書き換えます。

# cd /usr/local/etc/
# cp smartd.conf.sample smartd.conf
# ls -l smartd.conf
-r--r--r--  1 root  wheel  4890 Jun 12 22:59 smartd.conf
# chmod +w smartd.conf
# vi smartd.conf

smartd.confに、ぎっしりと、いろんな情報が書いてあるので、それを読めば、だいたい、どう設定すればいいのかわかります。また、「man smartd.conf」でマニュアルも見られます。



smartd.confで設定すべきポイントは、2つくらいかな。



● 「DEVICESCAN」という行をコメントアウトする



DEVICESCANという行以降に書いてある内容は、無視されるそうです。
これ・・・私、ず~っと知りませんでした。1年以上前からsmartmontoolsを使っていて、つい先日、気がつきました。ディスクドライブでエラーが発生したことを、メールで通知する機能がsmartmontoolsにはあるのですが、1度としてメールが来たことがなかったんです。でも、手でコマンドを実行して、SMARTのエラー記録を確認すると、知らないうちに、ポロポロとエラーが発生しているんです。



「なんでなんだろう?」・・・はっ!こんなことが書いてある・・・

# The word DEVICESCAN will cause any remaining lines in this
# configuration file to be ignored:

そうですか。私が悪かったんです。すみません。



● ディスクドライブごとにチェック項目を書いていく



実はよくわかってないのですが(無責任ですみません)、smartd.confの中にサンプルがたくさん書かれているので、それをまねして、以下のように書きました。



/dev/ad0 -a -o on -S on -s (S/../.././03|L/../../6/07) -H -m root
/dev/ad1 -a -o on -S on -s (S/../.././04|L/../../6/08) -H -m root
/dev/ad2 -a -o on -S on -s (S/../.././05|L/../../6/09) -H -m root
/dev/ad3 -a -o on -S on -s (S/../.././06|L/../../6/10) -H -m root



ATAのハードディスクが4台つながっていて、ad0~ad3として認識されてるので、4行書いているのですが、1台だけなら/dev/ad0の行だけで十分です。



  • 「-s」で、自己診断テスト(self-test)を定期的に行うように指定する。short testとか、longテストとか、いろいろあるらしい。


  • 「-m root」で、エラーが発生したら、rootあてにメールを送る。


というような意味らしいです。





3ware社の、SATAドライブを4台つなげるRAIDカードを使っているのですが、その場合は、こんな風に書いています。



/dev/twe0 -d 3ware,0 -a -o on -S on -s (S/../.././03|L/../../6/07) -H -m root
/dev/twe0 -d 3ware,1 -a -o on -S on -s (S/../.././03|L/../../6/07) -H -m root
/dev/twe0 -d 3ware,2 -a -o on -S on -s (S/../.././03|L/../../6/07) -H -m root
/dev/twe0 -d 3ware,3 -a -o on -S on -s (S/../.././03|L/../../6/07) -H -m root



● smartdを実行するようにrc.confに書く



smartdというデーモンが、定期的に自己診断テストを行ってくれるので、smartdが実行されるように、/etc/rc.confに、以下の1行を追加します。

smartd_enable="YES"

● smartdを実行



rc.confに書いたので、OS起動時にsmartdが自動実行されるようになっていますが、今すぐsmartdを実行するには、いつもと同じで、こんなかんじ。

# /usr/local/etc/rc.d/smartd.sh start
Starting smartd.

smartd.confに設定ミスとかしていなければ、こんな感じで動いているはずです。

# ps axww | grep smartd
82808  ??  S      0:00.01 /usr/local/sbin/smartd -p /var/run/smartd.pid -c /usr/
local/etc/smartd.conf

■ smartctlコマンドで、ドライブの情報を読み出す

# smartctl -a /dev/ad0

とやると、いろんな情報がでてきます。どこを見ていいのか迷うのですが・・・



私がいつも注目するのは、こんなところ。



● Errorほにゃらら



ドライブでエラーが発生したと記録されている場合、こんなのが表示されます。



Error 1492 occurred at disk power-on lifetime: 914 hours (38 days + 2 hours)
  When the command that caused the error occurred, the device was in an unknown
state.



  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  04 51 01 00 00 00 a0  Error: ABRT



  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  00 00 01 00 00 00 a0 00      00:03:22.304  NOP [Abort queued commands]
  ec 00 01 00 00 00 a0 00      00:03:22.304  IDENTIFY DEVICE
  90 00 01 01 00 00 00 0c      00:03:22.288  EXECUTE DEVICE DIAGNOSTIC
  90 00 01 01 00 00 00 0c      00:03:22.256  EXECUTE DEVICE DIAGNOSTIC
  90 00 01 01 00 00 00 0c      00:03:22.240  EXECUTE DEVICE DIAGNOSTIC



深刻なエラーなのか、そうでないのか、よくわかんないのが玉にキズです。でへへ。



上記で、「914 hours (38 days + 2 hours)」のように、時間みたいなのが出ていますが、これが、いつエラーが発生したかのことなんですが、ドライブの中にある謎の時計で測っているらしく、いつのことだかよくわかんないです。



そういうときは、つぎを見ています。



● SMART Self-test log structureほにゃらら



SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA
_of_first_error
# 1  Short offline       Completed without error       00%      1016         -
# 2  Short offline       Interrupted (host reset)      70%        15         -
# 3  Short offline       Interrupted (host reset)      70%        15         -



ついさっきself testを実行したんですが、その結果が「Completed without error」と記録されています。「1016」が、ハードディスクドライブの“腹時計”の値ですね。だから、この値と、Error発生時の値の差から(値の単位は、1時間=60分です)、いつエラーが発生したのか、私は判断しています。もちっと、わかりやすく見る方法はあるのかな?





■ セルフテスト(自己診断機能)を実行する



規格上、ハードディスクの自己診断機能機能には、何種類かきめられているようですが、実際にどのテストが実行できるのかは、ドライブごとに異なるみたいです。



「man smartctl」して、SMART RUN/ABORT OFFLINE TEST AND SELF-TEST OPTIONSの、「-t TEST」のところを見ると、テスト機能に関して、いろいろ詳しく書かれていることがわかります(ちょっと難しいかもね)。



これまで試したなかでは、shortテストとlongテストくらいは、どんなドライブでもできるようです(よくわかっていない・・・)。



longテストを、ドライブad0に対して実行するには、こんなかんじ。

# smartctl -t long /dev/ad0

shortテストを、ドライブad0に対して実行するには、こんなかんじ。

# smartctl -t short /dev/ad0

実際に実行してみたところ。



# smartctl -t short /dev/ad0
smartctl version 5.36 [i386-portbld-freebsd6.0] Copyright (C) 2002-6 Bruce Allen
Home page is http://smartmontools.sourceforge.net/



=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Short self-test routine immediately in off-line
mode".
Drive command "Execute SMART Short self-test routine immediately in off-line mod
e" successful.
Testing has begun.
Please wait 2 minutes for test to complete.
Test will complete after Mon Jun 12 23:37:17 2006



Use smartctl -X to abort test.



テストは2分後くらいに終わるよ、ってでているので、そのころに「smartctl -a /dev/ad0」を実行すれば、「SMART Self-test log structure ほにゃらら」のところに、診断結果が記録されているはずです。





■ エラーが発生するとどうなるのか?



つい、先日、待望のメールが届きました。いや、きてしまうのは困るか・・・

From: ほにゃらら
Subject: SMART error (FailedOpenDevice) detected on host: ほげ
To: ほにゃらら
Date: Sat, 10 Jun 2006 04:57:29 +0900



This email was generated by the smartd daemon running on:



   host name: ほげ
  DNS domain: ほげほげ
  NIS domain: ほげほげほげ



The following warning/error was logged by the smartd daemon:



Device: /dev/ad1, unable to open device



For details see host's SYSLOG (default: /var/log/messages).



You can also use the smartctl utility for further investigation.
No additional email messages about this problem will be sent.

/dev/ad1がopenできないって、どういうこと?
ということで、/var/log/messagesをみてみると、こんなのが残っていました。

Jun 10 04:38:19 ほげ kernel: ad1: TIMEOUT - WRITE_DMA retrying (2 retries left) LBA=68151384
Jun 10 04:38:50 ほげ kernel: ad1: WARNING - removed from configuration
Jun 10 04:38:50 ほげ kernel: GEOM_VINUM: subdisk raid.p0.s1 state change: up -> down
Jun 10 04:38:50 ほげ kernel: GEOM_VINUM: plex raid.p0 state change: up -> down
Jun 10 04:38:50 ほげ kernel: GEOM_VINUM: subdisk tmp.p0.s1 state change: up -> down
Jun 10 04:38:50 ほげ kernel: GEOM_VINUM: plex tmp.p0 state change: up -> down
Jun 10 04:38:50 ほげ kernel: ata0-slave: FAILURE - WRITE_DMA timed out
Jun 10 04:38:50 ほげ kernel: GEOM_VINUM: g_access failed on drive drive1, errno 6
Jun 10 04:38:50 ほげ kernel: GEOM_VINUM: lost drive 'drive1'

このマシンでは、gvinumによる、software RAID機能を使って、ミラーリング&ストライピングを行っていたのですが、そのうちのドライブ1台(ad1)にて、エラーが発生したので、そのドライブが切り離されてしまった、ということのようです。



ミラーリングしているので、1台壊れても、まだデータは大丈夫。データを失う、といった致命的事態を招く前に、エラーが発生したドライブ(ad1)を、さっさと交換しましょうね、ってことですね。



RAID5や、RAID1+0などで冗長性をもっていなくて、ドライブ1台だけを使っているシステムでも、壊れ始めのころは、きっと、SMARTでチョロチョロとエラーが出るんじゃないかなぁ~、ってことで、使ってみる価値は十分あるのではないかと。



0 件のコメント:

コメントを投稿