目次へ戻る §17へ戻る §19へ進む

18. SMART によるハードディスク診断

2006/2/8 (鈴)

最近のほとんどのハードディスクは,障害の早期発見や故障の予測を目的として, Self-Monitoring, Analysis and Reporting Technology (SMART, スマート) という自己診断機能を備えています。 この機能を利用すれば,さまざまな項目について ハードディスクの過去の履歴と現在の状況を知ることができます。

その主な項目には,これまでハードディスクがのべ何(千)時間動作してきたか, 何回セクタの代替処理をしてきたか, これまでに経験した最低温度と最高温度は何度だったか, 現在の温度は何度なのか,などがあります。 これらの情報はハードディスクの装置自身に不揮発的に記録されていますから, ハードディスクを再フォーマットしたり, オペレーティングシステムを替えても維持されます *1

SMART では単に情報を得るだけでなく, ハードディスクに内蔵された自己診断テストを開始させることもできます。 テストの結果も履歴としてハードディスク装置に記録され, 他の情報と同じように読み取ることができます。

去年,Cygwin の標準パッケージに, SMART によるハードディスク診断を行うフリー・ソフトウェア smartmontools (http://smartmontools.sf.net) が加わりました。 本章ではこのパッケージを紹介します。

18.1 smartmontools の導入

Cygwin の setup.exe で Utils カテゴリの smartmontools パッケージをインストールします。 実行プログラムとして

の二つがインストールされます。 前者は普通,シェルから実行され,結果を標準出力に表示する通常のコマンドです。 後者はハードディスクの異常を自動監視するためのデーモンです。

18.2 smartctl コマンド

使い方は下記でほとんどの場合に十分です。

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 が日本語で読みやすいでしょう。

18.3 自己診断テスト

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 と打鍵して閲覧するのがよいでしょう。

18.4 smartd デーモンの設定 (参考)

/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 によりうかがい知ることができます。

目次へ戻る §17へ戻る §19へ進む

Copyright (c) 2006 Oki Software Co., Ltd.