
要約: RAID1 アレイ内の 1 つのディスク上の不良ブロックを修復するにはどうすればよいでしょうか?
しかし、私がすでに試したことや私の方法に起こりうる間違いについては、この文章全体を読んでください。私はできる限り詳細に記述しようと努めました。そして、フィードバックを本当に期待しています。
私の状況は次のとおりです。 によって管理される RAID1 アレイに 2 台の 2TB ディスク (同じモデル) が設定されていますmdadm
。約 6 か月前、SMART が報告した最初の不良ブロックに気付きました。今日、さらに多くのことに気付いたため、現在修正を試みています。
このHOWTOページSMART が報告する不良ブロックを修正するために、誰もがリンクしている唯一の記事のようです。これは素晴らしいページで、情報も満載ですが、かなり古く、私の特定の設定には対応していません。私の設定は次のように異なります。
- 1 つのディスクの代わりに、RAID1 アレイで 2 つのディスクを使用しています。1 つのディスクはエラーを報告していますが、もう 1 つのディスクは正常です。HOWTO は 1 つのディスクのみを念頭に置いて書かれているため、「このコマンドはディスク デバイスで使用するのか、それとも RAID デバイスで使用するのか」など、さまざまな疑問が生じます。
- 私はGPTを使用していますが、fdiskはこれをサポートしていません。代わりにgdiskを使用しており、必要な情報と同じ情報が得られることを期待しています。
では、本題に入りましょう。これは私がやったことですが、うまくいかないようです。計算と方法に間違いがないか、遠慮なく再確認してください。エラーを報告しているディスクは /dev/sda です。
# smartctl -l selftest /dev/sda
smartctl 5.42 2011-10-20 r3458 [x86_64-linux-3.4.4-2-ARCH] (local build)
Copyright (C) 2002-11 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 90% 12169 3212761936
これにより、エラーは LBA 3212761936 にあることがわかります。HOWTO に従って、gdisk を使用して、後でブロック番号を決定するときに使用する開始セクターを見つけます (fdisk は GPT をサポートしていないため使用できません)。
# gdisk -l /dev/sda
GPT fdisk (gdisk) version 0.8.5
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Disk /dev/sda: 3907029168 sectors, 1.8 TiB
Logical sector size: 512 bytes
Disk identifier (GUID): CFB87C67-1993-4517-8301-76E16BBEA901
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 3907029134
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)
Number Start (sector) End (sector) Size Code Name
1 2048 3907029134 1.8 TiB FD00 Linux RAID
を使用するとtunefs
、ブロックサイズは であることがわかります4096
。この情報と HOWTO の計算を使用すると、問題のブロックは であると結論付けられます((3212761936 - 2048) * 512) / 4096 = 401594986
。
次に、HOWTO では、debugfs
ブロックが使用中かどうかを確認するように指示されています (EXT ファイルシステムが必要なため RAID デバイスを使用していますが、これは私を混乱させたコマンドの 1 つで、最初は /dev/sda と /dev/md0 のどちらを使用すればよいか分からなかったためです)。
# debugfs
debugfs 1.42.4 (12-June-2012)
debugfs: open /dev/md0
debugfs: testb 401594986
Block 401594986 not in use
ブロック 401594986 は空き領域なので、問題なく上書きできるはずです。ただし、書き込む前に、実際に読み取れないことを確認します。
# dd if=/dev/sda1 of=/dev/null bs=4096 count=1 seek=401594986
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.000198887 s, 20.6 MB/s
ブロックが読み取れない場合、これが機能するとは期待していません。しかし、機能します。、、、、、/dev/sda
ブロック番号に +-5 を繰り返し使用して、不良ブロックの周囲を検索します。すべて機能します。肩をすくめて、書き込みをコミットして同期します (/dev/md0 を使用するのは、1 つのディスクを変更してもう 1 つを変更しないと問題が発生する可能性があると考えたためです。この方法では、両方のディスクが不良ブロックを上書きします)。/dev/sda1
/dev/sdb
/dev/sdb1
/dev/md0
# dd if=/dev/zero of=/dev/md0 bs=4096 count=1 seek=401594986
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.000142366 s, 28.8 MB/s
# sync
不良ブロックに書き込むと、ディスクがそのブロックを正常なブロックに再割り当てするはずですが、別の SMART テストを実行すると、異なる結果が表示されます。
# 1 Short offline Completed: read failure 90% 12170 3212761936
振り出しに戻ります。つまり、RAID1 アレイ内の 1 つのディスク上の不良ブロックを修復するにはどうすればいいのでしょうか? 何かを正しく行っていないのは確かです...
お時間を割いていただき、ありがとうございます。