SW RAID1を使用していますが、古いHDDに障害が発生したため、/ dev/sdaを新しいHDDに交換しました。
RAIDアレイを再作成しようとすると、「良好な」HDD(/ dev/sdb)に不良ブロックがあり、mdadmがアレイを再同期できないことがわかりました。
バックアップを作成し、/ dev/sdbも置き換えてサーバーを完全に再インストールすることはできますが、mdadmを「だまして」RAIDアレイを再同期させてから、/ dev/sdbを新しいHDDに置き換える方法があるかどうか疑問に思いました。 。
私が推測できることから、badblocksは/ dev/sdbの未使用領域にあり、RAIDアレイを再作成しようとするときにのみ使用されます。
影響を受けるブロックとディスク上の基になる不良セクタが「スペアセクタ」領域に再割り当てされているかどうかを確認できますか?書き込み操作が失敗した場合は、不良セクタを再割り当てする必要があります。 smartctlで確認してください。
smartctl -a /dev/sdb | grep -i reallocated
最後の列には、再割り当てされたセクターの総数が含まれている必要があります。ゼロがある場合は、不良セクタを読み取ってみてください。
hdparm –-read-sector XXXXXXXX /dev/sdb
I/Oエラーを返す必要があります。それ以外の場合は次のセクションをスキップをお勧めします。
エラーは、セクターがまだ再割り当てされていないことを意味します。だから、書くことで無理やり再割り当てを試みることができます。 このセクターに保存されているデータは、この手順の後で失われることに注意してください!!!:
hdparm –-write-sector XXXXXXXX --yes-i-know-what-i-am-doing /dev/sdb
ちなみに、セクター番号[〜#〜] xxxxxxxx [〜#〜]は、カーネルメッセージ(dmesgコマンドまたは/ var/log/messages)から取得できるはずです。再同期中に不良ブロックが発生したため、次のような関連メッセージが表示されるはずです。
... end_request: I/O error, dev sdb, sector 1261071601
次に、smartctlでもう一度確認してみてください。カウンターは増えましたか?もしそうなら、hdparmでそれを読んでみてください。これで、再割り当てされるはずなので、エラーなしで読み取ることができます。完了。
最後に、mdadmを続行し、劣化したミラーにディスクを追加します。
より良い戦略は、ddrescueを使用して不良ドライブを良好にコピーすることです。このツールは、ドライブ全体を読み込もうとし、読み取り不可能なブロックを再読み取りして「トリミング」します。また、進行状況を保存するために使用されるログも生成しますが、最終的には不良ブロックのリストが含まれます。次に、このリストを解析し、すべての不良ブロックに書き込んで、ドライブがそれらすべてを再マッピングしても存続するかどうかを確認できます。必要に応じて、mdadm --zero-superblockを実行し、それを新しいドライブとして劣化したraid1に追加することができます。ところで、今日の大容量ドライブでは、「ソフト」な不良ブロックが時々生成されるのはごく普通のことです。毎週レイドチェックを行うだけで、2つのドライブで同じブロックが読み取れなくなる場合を除いて、問題はありません。これはほとんどありません。