最近のほとんどのハードディスクは,障害の早期発見や故障の予測を目的として, Self-Monitoring, Analysis and Reporting Technology (SMART, スマート) という自己診断機能を備えています。 この機能を利用すれば,さまざまな項目について ハードディスクの過去の履歴と現在の状況を知ることができます。
その主な項目には,これまでハードディスクがのべ何(千)時間動作してきたか, 何回セクタの代替処理をしてきたか, これまでに経験した最低温度と最高温度は何度だったか, 現在の温度は何度なのか,などがあります。 これらの情報はハードディスクの装置自身に不揮発的に記録されていますから, ハードディスクを再フォーマットしたり, オペレーティングシステムを替えても維持されます *1。
SMART では単に情報を得るだけでなく, ハードディスクに内蔵された自己診断テストを開始させることもできます。 テストの結果も履歴としてハードディスク装置に記録され, 他の情報と同じように読み取ることができます。
去年,Cygwin の標準パッケージに, SMART によるハードディスク診断を行うフリー・ソフトウェア smartmontools (http://smartmontools.sf.net) が加わりました。 本章ではこのパッケージを紹介します。
Cygwin の setup.exe で Utils カテゴリの smartmontools パッケージをインストールします。 実行プログラムとして
の二つがインストールされます。 前者は普通,シェルから実行され,結果を標準出力に表示する通常のコマンドです。 後者はハードディスクの異常を自動監視するためのデーモンです。
使い方は下記でほとんどの場合に十分です。
01:~$ /usr/sbin/smartctl -a /dev/hda
-a (または --all) オプションはすべての情報を取得します。 /dev/hda は最初の物理ドライブを表します。 正確には /dev/hd[a-j] が IDE/ATA デバイス "\\.\PhysicalDrive[0-9]" に相当します。/dev/ は省略可能です。 物理ドライブにアクセスするため,実行には管理者権限が必要です。
結果は標準出力に表示されます。 下記はノート PC (東芝 Tecra M2) で先日取った例です。 MK6026GAX という容量 60GB の 2.5インチハードディスクを対象にしています。
異常があるかどうかの総合判断は, 出力の 「=== START OF READ SMART DATA SECTION ===」 の直後にある 「 SMART overall-health self-assessment test result: PASSED 」 に示されています。 「PASSED」つまり「合格」,問題なしです。
smartctl version 5.34 [i686-cygwin-xp-sp2] Copyright (C) 2002-5 Bruce Allen
Home page is http://smartmontools.sourceforge.net/
=== START OF INFORMATION SECTION ===
Device Model: TOSHIBA MK6026GAX
Serial Number: 55KX0691T
Firmware Version: PA200U
User Capacity: 60,011,642,880 bytes
Device is: Not in smartctl database [for details use: -P showall]
ATA Version is: 6
ATA Standard is: Exact ATA specification draft version not indicated
Local Time is: Tue Jan 24 01:35:12 2006 JST
SMART support is: Available - device has SMART capability.
Enabled status cached by OS, trying SMART RETURN STATUS cmd.
SMART support is: Enabled
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
General SMART Values:
Offline data collection status: (0x00) Offline data collection activity
was never started.
Auto Offline Data Collection: Disabled.
Self-test execution status: ( 0) The previous self-test routine completed
without error or no self-test has ever
been run.
Total time to complete Offline
data collection: ( 239) seconds.
Offline data collection
capabilities: (0x1b) SMART execute Offline immediate.
Auto Offline data collection on/off support.
Suspend Offline collection upon new
command.
Offline surface scan supported.
Self-test supported.
No Conveyance Self-test supported.
No Selective Self-test supported.
SMART capabilities: (0x0003) Saves SMART data before entering
power-saving mode.
Supports SMART auto save timer.
Error logging capability: (0x01) Error logging supported.
No General Purpose Logging support.
Short self-test routine
recommended polling time: ( 2) minutes.
Extended self-test routine
recommended polling time: ( 47) minutes.
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 - 1360
4 Start_Stop_Count 0x0032 100 100 000 Old_age Always - 344
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 100 100 000 Old_age Always - 225
10 Spin_Retry_Count 0x0033 106 100 030 Pre-fail Always - 0
12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 202
192 Power-Off_Retract_Count 0x0032 100 100 000 Old_age Always - 2
193 Load_Cycle_Count 0x0032 100 100 000 Old_age Always - 3942
194 Temperature_Celsius 0x0022 100 100 000 Old_age Always - 28 (Lifetime Min/Max 7/53)
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 - 12495
222 Loaded_Hours 0x0032 100 100 000 Old_age Always - 112
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 - 235
240 Head_Flying_Hours 0x0001 100 100 001 Pre-fail Offline - 0
SMART Error Log Version: 1
No Errors Logged
SMART Self-test log structure revision number 1
No self-tests have been logged. [To run self-tests, use: smartctl -t]
Device does not support Selective Self Tests/Logging
これを見ると,#9 Power_On_Hours が 225 になっています。 のべ通電時間が 225 時間,一日 8 時間として約 28 日です。 約1年使ってきた東芝 Portege R100 の 1.8 インチディスク MK4004GAH では, これが 2571 でした。 8 で割って約 321 日です。概ね妥当な数値が得られています (Maxtor 6Y080M0 のようにディスクの機種によっては, この項目が分単位だったり,一定周期でゼロに戻ったりします。 ゼロに戻るものは, smartctl の出力の中で 「It "wraps" after 49.710 days. 」 のように表示されているはずです。 この例ではのべ 49 日強たつとゼロに戻ります)。
#194 Temperature_Celsius (セ氏温度) をみると, 過去最低が 7 度,最高が 53 度,測定時現在が 28 度のようです。
#5 Reallocated_Sector_Ct (代替されたセクタ数) と #196 Reallocated_Event_Count (セクタ代替処理回数) がともに 0 ですから,まだディスク表面は傷んでなさそうです。 ("Not in smartctl database" なディスクですから, この機種独自の別の意味の項目を読んでいる可能性もあるわけですが...)。
#192 Power-Off_Retract_Count (電源断によるヘッドの退避回数) が既に 2 回もありますから,強制電源断など, これまでの扱いが少々乱暴だったといえるかもしれません (実際,このマシンは他 OS のインストールで試行錯誤してきました)。 (プレインストールの Windows XP をそのまま平常どおり使ってきた) 前述の約1年もののディスク MK4004GAH では,この項目の値は 3 でした。
SMART の他の情報については http://smartmontools.sourceforge.net/#references 等にある文献を参照してください。 とりわけ, Wikipedia articles about SMART: Japanese が日本語で読みやすいでしょう。
smartctl を使って自己診断テストを行うこともできます。 数分程度で終わる短期テストを行うには次のようにします。
01:~$ /usr/sbin/smartctl -t short /dev/hda
すぐ下記のように出力されます。
smartctl version 5.34 [i686-cygwin-xp-sp2] Copyright (C) 2002-5 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 mode" successful. Testing has begun. Please wait 2 minutes for test to complete. Test will complete after Tue Jan 24 01:40:50 2006 Use smartctl -X to abort test.
この後,いつもどおりにマシンを使用できますが,ハードディスク内部では, 通常の処理をこなしながら自己診断テストが2分間をめどに実施されています。
2分以上たってから,再び
01:~$ /usr/sbin/smartctl -a /dev/hda
とします。スペース節約のため,先ほどの結果との diff をとったものを示します。
12c12 < Local Time is: Tue Jan 24 01:35:12 2006 JST --- > Local Time is: Tue Jan 24 01:41:10 2006 JST 62,63c62,63 < 193 Load_Cycle_Count 0x0032 100 100 000 Old_age Always - 3942 < 194 Temperature_Celsius 0x0022 100 100 000 Old_age Always - 28 (Lifetime Min/Max 7/53) --- > 193 Load_Cycle_Count 0x0032 100 100 000 Old_age Always - 3947 > 194 Temperature_Celsius 0x0022 100 100 000 Old_age Always - 31 (Lifetime Min/Max 7/53) 72c72 < 226 Load-in_Time 0x0026 100 100 000 Old_age Always - 235 --- > 226 Load-in_Time 0x0026 100 100 000 Old_age Always - 258 79,80c79,80 < No self-tests have been logged. [To run self-tests, use: smartctl -t] < --- > Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error > # 1 Short offline Completed without error 00% 225 -
テスト履歴 # 1 として, いましがたの short テストが "Completed without error" (エラーなく完了) したことが記録されています。
詳細については man smartctl を参照してください。 比較的長大な内容ですから, §16.3 で述べたように Meadow から M-x man RET smartctl RET と打鍵して閲覧するのがよいでしょう。
/usr/sbin/smartd.exe はハードディスクの異常を監視するためのデーモン・プログラムです。 これを実行すると,自らはすぐに終了しますが, それと同時に自らのクローンである子プロセスをデーモンとして起動します。 これは制御端末を捨てていますから, シェルを終了してコマンドプロンプトを閉じても死にません。 これが定期的に SMART 診断をし,異常があれば syslog 経由でログ出力します。
より正確には次のとおりです。
/usr/sbin/smartd を実行すると, syslog 経由で起動メッセージをログに記録します。 子プロセスをデーモンとして起動し,それが周期的にハードディスクを診断します。 もしも異常があれば syslog 経由でログに記録します。
どのディスクのどの項目を診断するかは, 設定ファイル /etc/smartd.conf で指定します。 初期設定では全ディスクの全項目を診断します。 診断の周期は起動時に -i オプションで指定できます。 最小値は 10 です。 /usr/sbin/smartd -i 10 を実行すると,10 秒ごとにハードディスクのアクセスランプが光るようになります。 省略時値は 1800 秒,つまり30 分ごとです。 (全項目のチェックといっても ハードディスクの装置内部に維持されている SMART 用の情報を採取するだけですから, 人間の感覚では一瞬で終わります。 ただし,負荷の高い作業に対しては 10 秒は十分邪魔になる頻度でしょう)。
前述のように /usr/sbin/smartd は制御端末を捨てて動作していますから, 実行したシェルを終わらせても生き残ります。 ps コマンド等でプロセス番号を得て kill で終了させます。
01:~$ ps | grep smartd 3708 1 1624 3708 ? 1017 15:27:31 /usr/sbin/smartd 01:~$ kill 3708 01:~$
この方法はいささか原始的ですから,管理用のスクリプトが用意されています。
01:~$ /etc/rc.d/init.d/smartd Usage: /etc/rc.d/init.d/smartd {start|stop|restart|reload|report|status} /etc/rc.d/init.d/smartd {install [options]|remove} 11:~$
ここで
サービスについては §17.3 を御覧ください。
smartd は,異常が起きないときは結果を記録しませんから, アクセスランプの周期的な点滅以外, 実際に働いているかどうか,すぐに分かる兆候はありません。 実際に異常が起きた場合の振舞を筆者はまだ確認していません。 これがこの節を「参考」に留めた主な理由です。 またこのことから分かるように, 例えばハードディスクの温度を常時記録する目的に smartd は使えません。 そうするためには, smartctl コマンドを周期的に起動してその結果を記録するスクリプトを書きます。 ハードディスクの温度は次のようなコマンド行で得られます。
01:~$ /usr/sbin/smartctl -A /dev/hda | awk '$1=="194" {print $10}' 28 01:~$
周期的にこのようなコマンド行を実行して結果をファイルに追記したり, プロット描画プログラムに入力したりするスクリプトを書き, それを cygrunsrv (§17.3) でサービスとして登録したり,あるいは単純にシェルからバックグラウンド プロセスとして走らせたりすればよいわけです。
*1 たとえば古いマシンをもらい受けたとき, そのマシンがこれまで実際にどれだけ過酷な, あるいは安穏な状態で使われてきたかを SMART によりうかがい知ることができます。