2013年6月1日

不良セクタのあるRAIDディスクの修復

この10年ほどの間に出荷されているHDDにはSMART(Self-Monitoring, Analysis and Reporting Technology)という機能が備わっていて、セクタエラーや温度などのドライブの状態をオンラインあるいはオフラインで監視できる。また、プラッタ上の全セクタが正常であることは期待せず、アクセスできないセクタは予め確保されている(ドライブの公称容量には含まれない)代替セクタにリマップすることもしばらく前から行われている。
 
このリマッピングはHDD内部のファームウェアで行われ、OSは一旦リマップされたセクタを意識することはないが、SMARTで報告されるのはセクタの読み込みエラーで、エラーを起こした不良セクタをリマップするためにはそのセクタに書き込む必要がある。エラーがOSのインストール時などに発生すれば自動的に書込み→読出しエラー→リマップとなるが、インストール後にデータ領域でないセクタで発生(検出)した場合は、そのセクタに書込みが行われるまで読出しエラーが継続して報告される。
 
読出しエラーが検出されたセクタに書き込めばそのセクタはリマップされるが、当然のことながらそのセクタに記録されていた情報を回復することはできない。したがって、一般的にはそのセクタを含むデータをバックアップから回復することになるが、セクタ番号からファイルを特定するのは非常に困難で、また不良セクタがファイルデータではないメタデータの場合はファイルシステムその物が損傷していることになり、お手上げである。

つまり、HDDのセクタレベルの冗長性を生かすためには上位レベルの冗長性が必要ということになり、だからRAIDが必要、という結論になる。

ここでは、Linux上でRAID1(ミラリング)の一台のHDDの不良セクタをリマップして正常に見せる手順を述べる。

まず、smartctlで過去のセルフテストの結果を表示する 。
h@spice:~$ sudo smartctl -l selftest /dev/sdb
smartctl 5.40 2010-10-16 r3189 [i386-redhat-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF READ SMART DATA SECTION ===
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       60%       145         262845373
# 2  Short offline       Completed: read failure       60%       136         262845373
# 3  Short offline       Completed: read failure       60%       130         262845373
# 4  Short offline       Completed: read failure       60%       129         262845373
# 5  Short offline       Completed: read failure       60%       129         262845373
# 6  Short offline       Completed: read failure       60%       129         262845373
# 7  Short offline       Completed: read failure       60%       129         262845373
# 8  Short offline       Completed: read failure       60%       129         262845373
(以下略)
テストの結果は過去21件まで保存され新しいものから順に表示されるらしいが、SSDの中には古いものから表示のものもあるので、「LifeTime」つまり通算通電時間で確認すること。「Remaining」はエラーが発見されたのでテストがやり残しのあるまま終了したということ(エラーがなければ00%になる)。セクタ262845373が不良の気配が濃厚である。

念のためsmartctlでセルフテストをもう一度実行する 。HDDはオンラインのままでよい。
h@spice:~$ sudo smartcl -t long /dev/sdb
smartctl 5.40 2010-10-16 r3189 [i386-redhat-linux-gnu] (local build)
Copyright (C) 2002-10 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 219 minutes for test to complete.
Test will complete after Fri May 31 10:43:36 2013

Use smartctl -X to abort test.

テストが終了すると結果に新しいエントリが追加されるので、「LifeTime」が更新されていることを確認する
h@spice:~$ sudo smartctl -l selftest /dev/sdb
smartctl 5.40 2010-10-16 r3189 [i386-redhat-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF READ SMART DATA SECTION ===
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       60%       155         262845373

# 2  Short offline       Completed: read failure       60%       145         262845373
# 3  Short offline       Completed: read failure       60%       136         262845373
# 4  Short offline       Completed: read failure       60%       130         262845373
# 5  Short offline       Completed: read failure       60%       129         262845373
# 6  Short offline       Completed: read failure       60%       129         262845373
# 7  Short offline       Completed: read failure       60%       129         262845373
# 8  Short offline       Completed: read failure       60%       129         262845373
(以下略)
やはりセクタ262845373が不良の気配が濃厚である。

修復のため、不良セクタのあるディスクをRAIDとスワップからはずす。hdparmはマウント中のドライブでも動作するようだが、一応念のため。
h@spice:~$ cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md1 : a
ctive raid1 sda2[0] sdb2[1]      38398908 blocks super 1.1 [2/2] [UU]
      bitmap: 1/1 pages [4KB], 65536KB chunk

md0 : active raid1 sda3[0] sdb3[1]
      204788 blocks super 1.0 [2/2] [UU]
    
unused devices: <none>

h@spice:~$ sudo mdadm /dev/md1 --fail /dev/sdb2

h@spice:~$ sudo mdadm /dev/md1 --remove /dev/sdb2
h@spice:~$ sudo mdadm /dev/md0 --fail /dev/sdb3
h@spice:~$ sudo mdadm /dev/md0 --remove /dev/sdb3
h@spice:~$ sudo swapoff /dev/sdb1

h@spice:~$ cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md1 : a
ctive raid1 sda2[0]      38398908 blocks super 1.1 [2/1] [U_]
      bitmap: 1/1 pages [4KB], 65536KB chunk

md0 : active raid1 sda3[0]
      204788 blocks super 1.0 [2/1] [U_]
    
unused devices: <none>
RAIDからはずすときは、fail、removeの2段階が必要。

さて、一番怖い瞬間を迎える。hdparmを使って直接当該セクタにゼロを書き込んで 強制的にリマップさせる。
h@spice:~$ sudo hdparm --write-sector 262845373 --yes-i-know-what-i-am-doing /dev/sdb

/dev/sdb:
re-writing sector 262845373: succeeded

hdparmはカーネルのキャッシュなどをバイパスして直接HDDの指定されたセクタにゼロを書き込む。

修復ができたら、再びsmartctlでセルフテスト(shortでよい)を実行してその結果を表示させ、すべての不良セクタがリマップされるまで繰り返す。

不良セクタが見えなくなったら、外してあったパーティションをRAIDとスワップに戻す。
h@spice:~$ sudo mdadm /dev/md0 --add /dev/sdb3
h@spice:~$ sudo mdadm /dev/md1 --add /dev/sdb2

h@spice:~$ sudo swapon -a
mdadm --addを使うときは、サイズの小さなパーティションを先に加えた方がリシンクが先に終わって気持ちがいい。

次回は、全くアクセスできなくなったRAID中の不良HDDを新品と交換する方法を…。

0 件のコメント:

コメントを投稿