2010年1月18日

HDDの異常を検知する「SMART」と不良セクタの修復

HDD(ハードディスク)はすぐに故障する。と、普段から思っていた方が良いです。不良セクタがあると書き込みが遅くなったり、そのセクタが原因でHDD(ハードディスク)が読み込み不能になったりと、放っておくと良い事は無いです。

本日、不良セクタのリペアをしたので備忘録として。



SMARTはHDD(ハードディスク)異常の検知をしてくれます。
異常を検知すると「SMART error (CurrentPendingSector) detected on host:xxxx」という件名のメールが送られて来ます。

This email was generated by the smartd daemon running on:

host name: www.xxxx.com
DNS domain: xxxx.com
NIS domain: (none)

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

Device: /dev/hda, 1 Currently unreadable (pending) sectors

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.


1. まずはセルフテストを実施します。1時間程度待ちます。
[root@www ~]# smartctl -t long /dev/hda
smartctl version 5.38 [i686-redhat-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Extended self-test routine immediately in off-line mode".
Drive command "Execute SMART Extended self-test routine immediately in off-line mode" successful.
Testing has begun.
Please wait 61 minutes for test to complete.
Test will complete after Mon Jan 18 16:23:24 2010

Use smartctl -X to abort test.

2. 1時間後、結果を確認します。
[root@www ~]# smartctl -A -l selftest /dev/hda
smartctl version 5.38 [i686-redhat-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is 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     0x000f   200   200   051    Pre-fail  Always       -       169
  3 Spin_Up_Time            0x0003   167   163   021    Pre-fail  Always       -       2625
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       9
  5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000e   200   200   051    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   079   079   000    Old_age   Always       -       15484
 10 Spin_Retry_Count        0x0012   100   253   051    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0012   100   253   051    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       9
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       5
193 Load_Cycle_Count        0x0032   200   200   000    Old_age   Always       -       9
194 Temperature_Celsius     0x0022   118   102   000    Old_age   Always       -       25
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0012   200   200   000    Old_age   Always       -       1
198 Offline_Uncorrectable   0x0010   100   253   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0008   100   253   051    Old_age   Offline      -       0

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed: read failure       90%     15484         33769597
上記の「197 Current_Pending_Sector」は、不安定なセクタ数。代替セクタに再配置されるのを待っているセクタの総数です。
また「LBA_of_first_error」の部分が不良ブロックのLBA番号です。

3. 不良セクタがどのパーティション内にあるかを調べます。
[root@www ~]# fdisk -lu /dev/hda

Disk /dev/hda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders, total 312581808 sectors
Units = セクタ数 of 1 * 512 = 512 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/hda1   *          63      208844      104391   fd  Linux raid 自動検出
/dev/hda2          208845    33768629    16779892+  fd  Linux raid 自動検出
/dev/hda3        33768630   310472189   138351780   fd  Linux raid 自動検出
/dev/hda4       310472190   312576704     1052257+  fd  Linux raid 自動検出
不良ブロックのLBA番号は「33769597」なので、パティション「/dev/hda3」に含まれる事が判明します。

4. ブロックサイズを調査する。
[root@www ~]# tune2fs -l /dev/hda3 | grep Block
Block count:              34587920
Block size:               4096
Blocks per group:         32768
ブロックサイズは「4096」です。

5. LBAがどのブロックに含まれているかを計算で求めます。
b = (int)((L-S)*512/B)
where:
b = File System block number
B = File system block size in bytes
L = LBA of bad sector
S = Starting sector of partition as shown by fdisk -lu
and (int) denotes the integer part.

B = 「4096」、L = 「33769597」、S = 「33768630」を代入すると、
b = (int)((33769597 - 33768630) * 512 / 4096) = 120
ブロック番号は「120」である事が判明しました。

6. 該当ブロックのinode情報を調べます。
[root@www ~]# debugfs
debugfs 1.39 (29-May-2006)
debugfs:  open /dev/hda3
debugfs:  icheck 120
Block   Inode number
120     <block not found>
debugfs:  quit
未使用のようです。もし、使用されている場合は、「ncheck ブロック番号」でどのファイルが使用しているか確認する事が出来ます。

7. 該当ブロックを再配置します。
[root@www ~]# dd if=/dev/zero of=/dev/hda3 bs=4096 count=1 seek=120
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 6.4496e-05 seconds, 63.5 MB/s

[root@www ~]# sync

8. 再度セルフテストを実行します。1時間程度待ちます。
[root@www ~]# smartctl -t long /dev/hda
smartctl version 5.38 [i686-redhat-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Extended self-test routine immediately in off-line mode".
Drive command "Execute SMART Extended self-test routine immediately in off-line mode" successful.
Testing has begun.
Please wait 61 minutes for test to complete.
Test will complete after Mon Jan 18 17:23:24 2010

Use smartctl -X to abort test.

9. 結果を確認します。
[root@www ~]# smartctl -A -l selftest /dev/hda
smartctl version 5.38 [i686-redhat-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is 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     0x000f   200   200   051    Pre-fail  Always       -       176
  3 Spin_Up_Time            0x0003   167   163   021    Pre-fail  Always       -       2625
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       9
  5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000e   200   200   051    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   079   079   000    Old_age   Always       -       15489
 10 Spin_Retry_Count        0x0012   100   253   051    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0012   100   253   051    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       9
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       5
193 Load_Cycle_Count        0x0032   200   200   000    Old_age   Always       -       9
194 Temperature_Celsius     0x0022   118   102   000    Old_age   Always       -       25
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0012   200   200   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   253   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0008   200   200   051    Old_age   Offline      -       4

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed without error       00%     15485         -
# 2  Extended offline    Completed: read failure       90%     15484         33769597
上記の「197 Current_Pending_Sector」が「0」になっています。
またセルフテスト結果も「Completed without error」となります。

10. 念の為、サーバを再起動します。
[root@www ~]# reboot
起動直後にSMARTからメールが送信されない事を確認します。


Bad block HOWTO for smartmontools

0 件のコメント:

コメントを投稿