nyacom.net

ほとんど自分向けの外部記憶装置。

不良セクタを叩いて潰す

      2015/08/10

うちで運用してるDebianなルータ兼VPNサーバから最近不穏なメールを受け取るようになってしまいました。

This email was generated by the smartd daemon running on:

   host name: xxxxx
  DNS domain: nyacom.net
  NIS domain: (none)

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

Device: /dev/sda [SAT], 1 Currently unreadable (pending) sectors


For details see host's SYSLOG.

You can also use the smartctl utility for further investigation.
The original email about this issue was sent at Tue Nov  5 16:42:25 2013 JST
Another email message will be sent in 24 hours if the problem persists.

 

smartdが読めないセクタを見つけたよってやつです。
まあ,要は不良セクタができたんですね。

とりあえず,HDDの状態が知りたいので smartctlでHDDの状況を確認します。

$ sudo smartctl -a /dev/sda

...

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     0x002f   200   200   051    Pre-fail  Always       -       0
  3 Spin_Up_Time            0x0027   166   163   021    Pre-fail  Always       -       6683
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       130
  5 Reallocated_Sector_Ct   0x0033   199   199   140    Pre-fail  Always       -       2
  7 Seek_Error_Rate         0x002e   200   200   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   065   065   000    Old_age   Always       -       26143
 10 Spin_Retry_Count        0x0032   100   100   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   100   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       114
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       49
193 Load_Cycle_Count        0x0032   001   001   000    Old_age   Always       -       2843520
194 Temperature_Celsius     0x0022   114   101   000    Old_age   Always       -       36
196 Reallocated_Event_Count 0x0032   199   199   000    Old_age   Always       -       1
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       1
198 Offline_Uncorrectable   0x0030   200   200   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   200   192   000    Old_age   Always       -       54
200 Multi_Zone_Error_Rate   0x0008   200   200   000    Old_age   Offline      -       9

あー,Current Pending Sector 出ちゃってますね。。
本来ならHDD換装すべき時期なんでしょうけど,今はちょっと懐が寒い
#ドラレコ燃やしたり,中華タブ瞬殺したり,Thinkpadを衝動買いしたりしたので。。
とりあえず今回は不良セクタをリライトして潰すことにします。

で,リライトするとどうなるのかというと,
HDDのファームで不良セクタを覚えて,代わりに正常な代替セクタを割り当てます。

なので勘違いしないでほしいのは,
別にこれをやってもHDDが物理的に修理されたりするわけではないことです。
あくまで論理的にメディアの不良セクタ参照しなくなるだけなので,
これが出始めたらそろそろHDDを交換することを考えましょう。

さて,リライトするのですが,他にも不良セクタがあったり,
不良セクタが使用中なのかそうじゃないのかを知る必要があります。
ひょっとしたらデータが知らないうちに破損してるかもしれません

そこで,まずはSMARTのテスト機能をつかって,HDDの不良セクタを洗い出してみます。

$ sudo smartctl -t short /dev/sda

smartctl 5.41 2011-06-09 r3365 [x86_64-linux-3.2.0-4-amd64] (local build)
Copyright (C) 2002-11 by Bruce Allen, 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 Thu Jul 16 23:23:54 2015

Use smartctl -X to abort test.

shotっていうのは要は手抜きテストです。ちゃんとやるならlongを指定してやります。
# ただし,longをやると数時間かかるので注意。

2分たったら結果を見てねと出てるので2分待ちましょう。

$ sudo smartctl -a /dev/sda

...

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed: read failure       90%     26144         123631985
# 2  Short offline       Completed: read failure       90%     26082         123631985
# 3  Extended offline    Completed without error       00%     15017         -
# 4  Extended offline    Completed: read failure       90%     15011         1443986379
1 of 3 failed self-tests are outdated by newer successful extended offline self-test # 3

smartctl -a で表示される下のほうにテスト結果が出てます。
Numが新しいほうが最新なので,今回のテストでは LBA 123631985 が読めないっぽいですね。
なので次はこのLBAが論理アドレス的に使われているのかをテストします。

そのためには,まず,読めないLBAがどのパーティションなのかを把握する必要があるので,
fdiskを使ってパーティションの開始ブロックと終了ブロックを確認します。

$ sudo fdisk -l

Disk /dev/sda: 2000.4 GB, 2000398934016 bytes
255 heads, 63 sectors/track, 243201 cylinders, total 3907029168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000007fc

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048   124999679    62498816   83  Linux
/dev/sda2       125001726  3907028991  1891013633    5  Extended
/dev/sda5      3891404800  3907028991     7812096   82  Linux swap / Solaris
/dev/sda6       125001728  3891404799  1883201536   83  Linux

問題のLBAは123631985なので,/dev/sda1にあるようですね。

次はLBAとファイルシステムの論理ブロックを算出します。
ファイルシステムでは領域を4KBとか8KBの単位で番号を振って管理しているので,
それを求める必要があります。そのため,まずは/dev/sda1の管理単位を知る必要があります。
今回 /dev/sda1はext4なので,dumpe2fsを使えばファイルシステムの情報を得られます。

$ sudo dumpe2fs -h /dev/sda1|grep Block
dumpe2fs 1.42.5 (29-Jul-2012)
Block count:              15624704
Block size:               4096
Blocks per group:         32768
evilmaster@betty:~$ sudo dumpe2fs -h /dev/sda1
dumpe2fs 1.42.5 (29-Jul-2012)
Filesystem volume name:   <none>
Last mounted on:          /
Filesystem UUID:          93a078c9-e70a-478b-bc06-3fade4b83bc7
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              3907584
Block count:              15624704
Reserved block count:     781235
Free blocks:              13052662
Free inodes:              3782442
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      1020
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Flex block group size:    16
Filesystem created:       Sun Nov  3 22:12:43 2013
Last mount time:          Sat Jun  6 11:18:59 2015
Last write time:          Sat Jun  6 11:18:59 2015
Mount count:              50
Maximum mount count:      -1
Last checked:             Sun Nov  3 22:12:43 2013
Check interval:           0 (<none>)
Lifetime writes:          96 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:              256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
First orphan inode:       1859161
Default directory hash:   half_md4
Directory Hash Seed:      55b2fb12-47fe-42cf-a638-f714355fbc2e
Journal backup:           inode blocks
Journal features:         journal_incompat_revoke
Journal size:             128M
Journal length:           32768
Journal sequence:         0x00350c34
Journal start:            31054

Block size の項目を見ると,1ブロック4KBだということがわかるので,
LBA 123631985は /dev/sda1上の論理ブロックでは

(123631985 - 2048) * 512 / 4096 = 15453742.125

になります。端数は要はアライメントが合ってないんですね。
15453742番目っていう意味になるはず。

次にファイルシステム上でこの論理ブロックが使われてるのかを調べるため,debugfsを使います。

$ sudo debugfs -R "icheck 15453742" /dev/sda1
debugfs 1.42.5 (29-Jul-2012)
Block    Inode number
15453742    <block not found>

お,使ってないっぽいですね。
使われてる場合はinode番号が出てくるので,
その番号を使ってdebugfsで ncheck <inode number> するとファイルが特定できます。

使ってないということは,とりあえず気にせずに潰して良いということなのでddで叩き潰します。

$ sudo dd if=/dev/zero of=/dev/sda1 bs=4096 count=1 seek=15453742
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 6.1849e-05 s, 66.2 MB/s

叩き潰したので,結果をsmartctlで確認します。

$ sudo smartctl -t short /dev/sda
smartctl 5.41 2011-06-09 r3365 [x86_64-linux-3.2.0-4-amd64] (local build)
Copyright (C) 2002-11 by Bruce Allen, 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 Fri Jul 17 00:06:08 2015

Use smartctl -X to abort test.

$ sudo smartctl -a /dev/sda
smartctl 5.41 2011-06-09 r3365 [x86_64-linux-3.2.0-4-amd64] (local build)
Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Model Family:     Western Digital Caviar Green (Adv. Format)
Device Model:     WDC WD20EARS-00MVWB0
Serial Number:    WD-WCAZA0366943
LU WWN Device Id: 5 0014ee 2af8e55ef
Firmware Version: 51.0AB51
User Capacity:    2,000,398,934,016 bytes [2.00 TB]
Sector Size:      512 bytes logical/physical
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   8
ATA Standard is:  Exact ATA specification draft version not indicated
Local Time is:    Fri Jul 17 00:05:00 2015 JST
SMART support is: Available - device has SMART capability.
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:  (0x85)    Offline data collection activity
                    was aborted by an interrupting command from host.
                    Auto Offline Data Collection: Enabled.
Self-test execution status:      ( 246)    Self-test routine in progress...
                    60% of test remaining.
Total time to complete Offline 
data collection:         (34860) seconds.
Offline data collection
capabilities:              (0x7b) SMART execute Offline immediate.
                    Auto Offline data collection on/off support.
                    Suspend Offline collection upon new
                    command.
                    Offline surface scan supported.
                    Self-test supported.
                    Conveyance Self-test supported.
                    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.
                    General Purpose Logging supported.
Short self-test routine 
recommended polling time:      (   2) minutes.
Extended self-test routine
recommended polling time:      ( 255) minutes.
Conveyance self-test routine
recommended polling time:      (   5) minutes.
SCT capabilities:            (0x3035)    SCT Status supported.
                    SCT Feature Control supported.
                    SCT Data Table supported.

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     0x002f   200   200   051    Pre-fail  Always       -       0
  3 Spin_Up_Time            0x0027   166   163   021    Pre-fail  Always       -       6683
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       130
  5 Reallocated_Sector_Ct   0x0033   199   199   140    Pre-fail  Always       -       2
  7 Seek_Error_Rate         0x002e   200   200   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   065   065   000    Old_age   Always       -       26144
 10 Spin_Retry_Count        0x0032   100   100   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   100   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       114
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       49
193 Load_Cycle_Count        0x0032   001   001   000    Old_age   Always       -       2843644
194 Temperature_Celsius     0x0022   113   101   000    Old_age   Always       -       37
196 Reallocated_Event_Count 0x0032   199   199   000    Old_age   Always       -       1
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   200   200   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   200   192   000    Old_age   Always       -       54
200 Multi_Zone_Error_Rate   0x0008   200   200   000    Old_age   Offline      -       9

...
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%     26144         -
# 2  Short offline       Completed: read failure       90%     26144         123631985
# 3  Short offline       Completed: read failure       90%     26082         123631985
# 4  Extended offline    Completed without error       00%     15017         -
# 5  Extended offline    Completed: read failure       90%     15011         1443986379

1 of 3 failed self-tests are outdated by newer successful extended offline self-test # 3

...

おお,消えましたね。

というわけで,覚書でした。
とりあえず,近々HDDをリプレースすることにします。

 - linux