RAID1 btrfs のディスクが故障し、書き込みは不安定ですが、読み取りはほぼ正常に動作します。どうすれば交換できますか?

RAID1 btrfs のディスクが故障し、書き込みは不安定ですが、読み取りはほぼ正常に動作します。どうすれば交換できますか?

私は 2 ディスクの btrfs ファイルシステムを使用しており、データとメタデータは両方とも RAID1 になっています (mdraid ではなく btrfs 機能を使用)。ディスクは USB3 ドライブで、その上に dm-crypt があります。ディスクの 1 つが故障しています (数千の不良セクタがあり、書き込みが頻繁にタイムアウトします)。故障した USB ドライブの代わりに 3 つ目の USB ドライブを入手しましたが、どのように交換すればよいでしょうか?

答え1

これは本当に面倒な作業であることが判明しました。まず、btrfs には現在適切な replace コマンドがあり、これは add new、remove が失敗するよりもはるかに優れていることに留意することが重要です。

まず、新しいディスクをパーティション分割し、そこに dm-crypt を設定します。次に、ロックを解除します。

ディスクの書き込みがタイムアウトになっていない場合は (どうやら 1 回あたり 360 秒かかります)、次のように簡単に実行できます。

btrfs replace start -r /dev/mapper/luks-BAD-disk-uuid              \
                       /dev/mapper/luks-NEW-disk-uuid /mount/path

ただし、これにより不良ディスクへの定期的な書き込みが実行され、それによってタイムアウトが発生すると、約 30 秒の高速コピーの後、タイムアウトを待つ 6 ~ 12 分のアイドル状態が発生します。

書き込みを避けるために、デバイス マッパーを使用してスナップショットを設定することができます。読み取りは基盤となる不良デバイスに送られます (読み取りについてはほとんどの場合問題ありません)。書き込みはコピー オン ライト (COW) ストレージに送られます。まず、COW ストレージ用に適切な大きさのブロック デバイスが必要です。私はこれ用に新しい論理ボリュームを作成しました ( Watt-sdj1_dmsnap)。どのブロック デバイスでも機能するはずです。ループ デバイスでも問題ありません。個人的には、何か問題が発生した場合に備えて永続的なデバイスをお勧めしますが、危険を冒して十分な RAM がある場合は、RAM ディスクでも機能します。

私の場合は、約 1.7 GB の COW スペースが必要になります (3 TB ドライブから 2.24 TiB を移動するため)。COW スペースは多めに確保することをお勧めします。スペースが足りなくなるのはおそらく良くないことですし、作業が終わったらすべてを解放できます。

次に、btrfs ファイルシステムがマウントされている場合はアンマウントし、dm-crypt デバイスをロック (停止) する必要があります。暗号化されていないデータをディスクに書き込まないようにするため、スナップショットを暗号化の下に配置しています。

私の場合、パーティションは です/dev/sdj1。まず、間違いを避けるために、読み取り専用に設定します。

blockdev --setro /dev/sdj1
blockdev --setro /dev/sdj

( で後で元に戻すことができます--setrw)。次に、実際にスナップショットを設定します。

dmsetup create sdj_divert --table "0 $(blockdev --getsz /dev/sdj1) snapshot /dev/sdj1 /dev/mapper/Watt-sdj1_dmsnap PO 8"

それが何を意味するのか簡単に説明すると、デバイスマッパー テーブルの形式は次のようになります。開始セクター セクター数 ターゲットタイプ ターゲット引数開始セクターは 0、セクター数は sdj1 のサイズと同じです (結局全体を実行したいため)、ターゲット タイプはスナップショットです。スナップショット ターゲットには、いくつかの引数があります。ソース開発 牛開発 モード チャンクサイズ. ソースデバイスとして を指定しています/dev/sdj1。COWデバイスは私が作成した論理ボリュームです。モードPOはp永続的(メタデータはディスクに書き込まれるため、再起動後に元に戻すことができます)overflow (スナップショットに書き込む量が多すぎる場合は、回復が可能です)。チャンク サイズは、スナップショットの粒度です。1 バイトでも書き込むと、そのバイトの周囲のチャンク全体がコピーされます (スナップショットのスペースを消費します)。8 は 4K なので、アラインメントの問題は発生しません。

最後に、デバイスのロックを再度解除します。ただし、 のロック解除ではなく/dev/sdj1、 のロック解除を行います/dev/mapper/sdj_divert。次に、btrfs ファイルシステムを再度マウントします。

;を使用すると、スナップショットの使用状況を確認できますdmsetup status sdj_divert。次のような結果が表示されます (ただし、スラッシュの前の数字ははるかに小さくなります)。

0 5860524928 snapshot 914216/545259520 3568

最初の 3 つは、開始セクター、セクター数、ターゲット タイプです。次の数字は、使用されているセクター数 (スラッシュの前)、そしてセクターの合計数 (スラッシュの後) です。つまり、これは使用されているスペースの一部です。最後の数字は、メタデータに使用されるセクター数で、これはすでに使用されている数に含まれています。

btrfs replace startさて、最後に、回答の先頭にある簡単なコマンドを使用できます。このコマンドはすぐに返されます。 を実行してステータスを確認しますbtrfs replace status /mount/path

置き換えが完了したら、不良デバイスがファイルシステムから削除されていることを確認し (例: btrfs fi show /mount/path)、障害のあるドライブをロック/クローズして、スナップショットを削除します ( dmsetup remove sdj_divert)。その後、COW 領域を解放します (心配な場合は、消去してから)。

最後に、技術的にはオプションのステップが1つあります。交換用デバイスは大きいのですが、btrfsはまだ追加スペースを使用していません。btrfsで使用できるようにするには、出力でdevidを見つけてbtrfs fi show、実行します。

btrfs fi resize DEVID:max /mount/path

それはほぼ瞬時に行われるはずです。

関連情報