CentOS7 smartctlの見方と不良セクタの修復方法

・smartの見方

# smartctl -A /dev/sda

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	-		173
  3 Spin_Up_Time		0x0027	227	180	021	Pre-fail	Always	-		3641
  4 Start_Stop_Count		0x0032	100	100	000	Old_age		Always	-		121
  5 Reallocated_Sector_Ct	0x0033	184	184	140	Pre-fail	Always	-		486
  7 Seek_Error_Rate		0x002e	100	253	000	Old_age		Always	-		0
  9 Power_On_Hours		0x0032	053	053	000	Old_age		Always	-		34589
 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	-		121
192 Power-Off_Retract_Count	0x0032	200	200	000	Old_age		Always	-		51
193 Load_Cycle_Count		0x0032	200	200	000	Old_age		Always	-		69
194 Temperature_Celsius		0x0022	124	109	000	Old_age		Always	-		26
196 Reallocated_Event_Count	0x0032	191	191	000	Old_age		Always	-		9
197 Current_Pending_Sector	0x0032	200	200	000	Old_age		Always	-		1
198 Offline_Uncorrectable	0x030	100	253	000	Old_age		Offline	-		0
199 UDMA_CRC_Error_Count	0x0032	200	200	000	Old_age		Always	-		0
200 Multi_Zone_Error_Rate	0x0008	100	253	000	Old_age		Offline	-		0

注目すべき値は下記項目

1 Raw_Read_Error_Rate	読み取りエラー発生率
5 Reallocated_Sector_Ct		代替処理済みセクタ数
197 Current_Pending_Sector	代替処理保留中セクタ数
198 Offline_Uncorrectable	代替不能セクタ数
※「RAW_VALUE」を見ること
※「VALUE」や「THRESH」は値が一定範囲に収まるように正規化されている

・1 Raw_Read_Error_Rate 読み取りエラー発生率

・危険水域は、この値が1以上になった時で、0の時に比べ、60日後の故障確率は39倍になると言われている
・SG製HDDは正常なHDDでも大きな値になるので、参考にはならない

・5 Reallocated_Sector_Ct 代替処理済みセクタ数

・危険水域は、この値が1以上になった時で、0の時に比べ、60日後の故障確率は14倍になると言われている
・HDDの代替セクタ(※)を上回らなければ使用は可能(メーカーやHDDによって数が違う。非公開情報だが、2TBで1000程度はある模様)
・短期間で増えるようであれば早急にバックアップを取って交換する
・増えないのであれば使用は可能だが信頼性は落ちるので、交換した方が無難

・197 Current_Pending_Sector 代替処理保留中セクタ数
・198 Offline_Uncorrectable 不良セクタ

・危険水域は、この値が1以上になった時で、0の時に比べ、60日後の故障確率は14〜16倍になると言われている
・たまたまデータの読み書きができなかった場合でも増えるため、手動で修復(※後述)すれば解消する場合がある
 ギリギリ動作しているHDDに対して実施するとトドメとなる場合があるため、手動でやる場合は事前にバックアップを取ること
・修復しても数が0にならない場合は交換した方が無難
・修復して数が0になっても、その後、短期間で増えるようであれば交換する。

・手動修復方法1

・不良論理ブロックアドレスの特定
# smartctl -t short /dev/sdc
# smartctl -a /dev/sdc
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%     39257         347602

・不良セクタの計算で使う値の確認
# fdisk -l
デバイス   開始位置   終了位置     セクタ サイズ タイプ
/dev/sdc1      2048 5860532223 5860530176   2.7T Microsoft 基本データ

セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト

・不良セクタの計算
(347602 - 2048) * 512 / 4096 = 43194

※347602 はsmartctlで調べたLBA_of_first_errorの値
※2048、512、4096 はfdiskで調べた値

・不良セクタを使用しているinodeの特定
# sudo debugfs -R "icheck 43194" /dev/sdc1
debugfs 1.44.3 (10-July-2018)
Block	Inode number
43194	83099729

※Inode numberが表示されない場合はinodeが使用されていない

・inodeに対応するファイルパスの特定
# sudo debugfs -R "ncheck 83099729" /dev/sdc1
debugfs 1.44.3 (10-July-2018)
Inode	Pathname
83099729	/application/MovieConvertor4PSP/jre-6u10-beta-windows-i586-p.exe

hdparmによる書き込みを実行するとファイルが壊れるので、バックアップからもどすなど適当に対応しておく

・特定した不良論理ブロックアドレスへの書き込み
# hdparm --yes-i-know-what-i-am-doing --write-sector 347602 /dev/sdc

※セクター番号 smartctl で特定した値を指定する
※書き込み成功すればエラー件数が減るなどする

・Current_Pending_Sectorが減っていることの確認
# smartctl -a /dev/sdc

※減っていない場合は、減るまで不良論理ブロックアドレスの特定〜特定した不良論理ブロックアドレスへの書き込みを繰り返す

・手動修復方法2

・badblockの特定
# badblocks -vs -o badblocks.txt /dev/sdc1

・不良セクタの修復(マーキング)
# e2fsck -y -l badblocks.txt  /dev/sda1
※不良セクタを使用しないようにマーキングしているだけなので、不良セクタが本当に直るわけではない

・不良セクタの検出と修復をまとめて実施
# fsck -t -y -f -c /dev/sda1