2014年11月3日月曜日

物理セクタサイズが 4K bytes のディスクで不良セクタが発生した事例と処置

CentOS 6 + ZFS on Linux で利用している AFT の SATA HDD で、不良セクタが生じました。備忘録として、症状と処置内容を書いておきたいと思います。

当該 ZFS pool は、mirror 構成で運用しており、1ヵ月に1回のペースで scrub を実行しているのですが、ここ半年間ほど、毎度同じ HDD で ATA bus error が発生し、ZFS mirror のおかげで修復しながら(zpool status の表示が An attempt was made to correct the error. Applications are unaffected. だったので、修復されたものと判断)動いていました。
また、smartctl -A で数値変化を見ていたのですが、Raw_Read_Error_Rate が、scrub のたびに発生する ATA bus error の数だけカウントアップしており、Reallocated_Sector_Ct と Current_Pending_Sector はゼロという推移でした。

このエラーが HDD の不良なのか、はたまた、ケーブル不良や接続不良なのか、まずは切り分け試みようと、別の HDD を接続しているケーブルと交換してみたり、SATA ポートを変更してみたりしました。しかし、やはり当該 HDD のみ scrub で ATA bus error になることが分かりました。

ということから、本当に HDD 不良で間違いないようであり、このまま運用続けた場合、mirror の正常側の HDD が故障すると、データロストに至ると認知しました。

当然、処置としては別の HDD に交換するのが正しいわけで、まずは、用立てた HDD に zpool replace しました。機能は知っていたものの、本当に実行したのは初めての経験でしたが、何事もなく無事完了しました。

さて、エラーが出ていた HDD は、容量 2TB であり、結構もったいない。SecureErase したら、不良部分がリフレッシュするのではという憶測がありましたが、今回は正攻法で、smartctl でテストを行ってみることにしました。
# smartctl -t short /dev/sdXX
そうしたところ、LBA_of_first_error が表示され、不良セクタの存在が示されました。本当に、そのセクタにアクセスできないのか確かめるため、次のコマンドを実行してみたら、I/O error になりました。
# dd if=/dev/sdXX of=/dev/null bs=512 skip=<LBA_of_first_errorの値> count=1
それならば、当該セクタにゼロ書き込みすれば、修復するかもとやってみました。
# dd if=/dev/zero of=/dev/sdXX bs=512 seek=<LBA_of_first_errorの値> count=1
しかし、この書き込みは I/O error で失敗しました。それで思ったのが、この HDD は AFT だし、不良セクタも 4096 バイト単位であるはずなのではということです。確認のため、LBA_of_first_error-1 のセクタを dd で読み出したら、そこは成功。次に、LBA_of_first_error+1〜+7 の範囲のセクタを dd で読み出し試みたところ、全て失敗。さらに LBA_of_first_error+8 のセクタを読み出したら成功しました。推測通りのようであり、512 バイト単位で書き込もうとしても、Read-modify-write 動作となるために失敗するものと考えられました。そこで、次のようにして 4096 バイトを1回で書き込んだところ、サクっと成功しました。
# dd if=/dev/zero of=/dev/sdXX bs=4096 seek=$((3005239984/8)) count=1    ※値はsmartctlが示した本当の値
そして、再び smartctl -t short を実行。。。しかし、また別の LBA が表示されました。そのセクタも同様にして 4096 バイト書き込みクリア。。。さらにさらに smartctl -t short を実行。。。また別の LBA が。。。ってなことを繰り返した結果。最終的に、エラーが無くなりました。実際の smartctl の出力は次の通りです。
# smartctl -a /dev/sdXX
...
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       -       1127
  3 Spin_Up_Time            0x0027   238   236   021    Pre-fail  Always       -       3066
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       69
  5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x002e   100   253   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   080   080   000    Old_age   Always       -       14706
 10 Spin_Retry_Count        0x0032   100   253   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   253   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       68
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       20
193 Load_Cycle_Count        0x0032   153   153   000    Old_age   Always       -       141013
194 Temperature_Celsius     0x0022   111   108   000    Old_age   Always       -       41
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   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

SMART Error Log Version: 1
No Errors Logged

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%     14674         -
# 2  Short offline       Completed: read failure       10%     14674         3005241696
# 3  Short offline       Completed: read failure       10%     14674         3005241144
# 4  Short offline       Completed: read failure       10%     14674         3005240096
# 5  Short offline       Completed: read failure       90%     14674         3005241064
# 6  Short offline       Completed: read failure       10%     14674         3005241064
# 7  Short offline       Completed: read failure       90%     14674         3005240104
# 8  Short offline       Completed: read failure       10%     14673         3005240104
# 9  Short offline       Completed: read failure       10%     14673         3005239984
#10  Short offline       Completed: read failure       10%     14672         3005241744
#11  Short offline       Completed: read failure       90%     14672         3005239984
#12  Short offline       Completed without error       00%      8469         -
...
このディスクを使い続けるのはリスクだろうとは思いますが、もったいないので、元の ZFS mirror に attach して、三重ミラー化しました。次のような具合です。
# zpool status
...
        NAME                                                  STATE     READ WRITE CKSUM
        tankX                                                 ONLINE       0     0     0
          mirror-0                                            ONLINE       0     0     0
            ata-Hitachi_HUA723020ALA640_xxxxxxxxxxxxxx-part3  ONLINE       0     0     0
            ata-WDC_WD20EFRX-68EUZN0_WD-yyyyyyyyyyyy-part3    ONLINE       0     0     0
            ata-WDC_WD20NPVT-00Z2TT0_WD-zzzzzzzzzzzz-part3    ONLINE       0     0     0
...
3番目のディスク(WD20NPVT)が不良が生じたディスクで、2番目が交換したディスク(WD20EFRX)です。resilver はエラー無く完了済みで、その後、scrub をかけているところです。scrub でエラーが出なければ、ひとまず不良が消え去ったことになりますが、それは後日、scrub 完了してから追記したいと思います。なにせ、scrub が 24時間 くらいかかるもので。

2014-11-05追記
昨日、三重ミラー状態での scrub が完了したのですが、やはり WD20NPVT で、ATA bus error が出ており、smartctl -t short を行ったら、またも、LBA_of_first_error が表示されました。最後の手段、だめもとで SecureErase をかけてリフレッシュを試みました。2TB もの大容量HDDに SecureErase をかけたのは初めてでしたが、やはり実行時間がかなり長く、約6時間40分ほど(84MB/s程度)で無事に完了しました。その直後の smartctl -t short でも、やはり LAB_of_first_error が出ました。これはどうにもダメそうですかね。Reallocated_Sector_Ct がゼロのままだし、何かコマンドで、強制的に代替セクタに切り替えることができれば、まだ延命できるのではと思ってしまいますが。

2014-11-06追記
ダメそう(不良セクタ番号を HDD に通知して、強制的に代替セクタに切り替えるような方法がわからず)なので、三重ミラーから detach して、別の zpool を作って、copies=2 設定で利用しようかと思います。これ、話しには聞くものの、やったことの無い設定なので、実験のためにデータを充填中(コピー中)。プールの使用率が 80% 程度になったら、scrub をかけてみて、ATA bus error になっても、修復動作が動くのかどうか実験してみるつもりです。。。ただ、copies=2 のプールへの書き込みはさすがに激オソ(10MB/sくらい)になるようです。シーケンシャル READ なら 90MB/s くらいは出るようなので、iso イメージ格納とかなら、使用に耐えるものと考えられます。

2014-11-11追記
copies=2 のプールへの実験的書き込みが終わった(使用率 78%)ので、今度は scrub を実行中ですが、その前に、別のメンテで、そのサーバをシャットダウンしたのですが、そうしたところ WD20NPVT にアクセスできなくなって(device error になって)焦りました。一瞬、ぶっ壊れたのかと思ったのですが、以前にも経験したことがあるのですが、SecureErase を行った副作用で、HDD がロック状態になってしまったようでした。
# hdparm -I /dev/sdXX
...
Security: 
...
                enabled
                locked
        not     frozen
...
上のような状態になってしまっていました。解除方法は、次の通りです。
# hdparm --user-master u --security-unlock password /dev/sdXX
# hdparm --user-master u --security-disable password /dev/sdXX
この処置で、再びディスクにアクセス可能になり、scrub 実行中です。それにしても、SecureErase を行ってもロックされない HDD もあり、製品により挙動はまちまちのようです。

2014-11-12追記
さらに続きのメモですが、scrub が完了し、やっぱり途中で ATA bus error が出ているものの、zpool status では repaired だったので、copies=2 で救われたものと判断しました。その後、書き込んだデータ(実験のため Fedora/CentOS などの iso イメージを書き込みました)の md5sum チェックを行いましたが、途中でやはり ATA bus error が出たものの、md5sum 値は全て OK でした。というわけで、iso イメージ格納庫にしようかなと思案中。

2014-11-15追記
その後、書き込んだ iso イメージの md5sum チェックを何回か行いましたが、結果は全て正常値でしたので、このまま iso イメージ倉庫にしようかと思います。
その他の延命利用方法としては、今のところ ATA bus error が出るセクタ番号範囲が狭い(サイズにすると 1MB くらいの領域)ので、その部分だけ小さいパーティションで区切り、その他の正常なパーティションを md の linear モードで連結して使うという方法が考えられると思います。あるいは、LVM の運用がイヤでなければ、正常なパーティションを1つの VG にして使う方法もありそうです。

■関連記事
中古 HDD の初期確認

0 件のコメント:

コメントを投稿

人気ブログランキングへ にほんブログ村 IT技術ブログへ