不良セクタを叩いて潰す
うちで運用してる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をリプレースすることにします。