原因

原因

私の NAS には、BTRFS が入った 500GB のディスクがありました。最近 4TB のディスクを入手したので、ダウンタイムなしで新しいディスクだけを使用したいと思いました。そこで、btrfs replace start 1 /dev/sdb .を実行し、完了するまで待ってから 500GB ドライブを取り外しました。

4TB ディスクにアクセスできなくなったため、交換した 500GB ディスクからすべてのデータを回復したいのですが、そのディスク上の BTRFS パーティションは、そのように認識されなくなりました。 、 を使用して通常どおりマウントしようとしましたが-o degraded-o recovery,roや も試しましたbtrfs restorebtrfs check、すべて失敗しました。この場合の選択肢は何ですか?

答え1

過去の質問ですが、私も同じ状況に遭遇したので回答します。debian bullseye(5.10.0-13-amd64)でRAID1ファイルシステムを
実行し、以下の手順でManjaro(5.13.19-2)に復旧しました。btrfs replace

原因

少なくともカーネル バージョン 5.10 では、コマンドは最終的に次の場所にある関数btrfs replaceを呼び出します。btrfs_scratch_superblocksGitHub
この関数は、元のディスクのスーパーブロック上の「マジック ストリング」を削除します。

実際に私の環境では次のような結果が得られました。

# btrfs inspect-internal dump-super -F /dev/sdb1
superblock: bytenr=65536, device=/dev/sdb1
---------------------------------------------------------
csum_type       0 (crc32c)
csum_size       4
csum            0x7d4435b9 [DON'T MATCH]
bytenr          65536
flags           0x1
            ( WRITTEN )
magic           ........ [DON'T MATCH]

によるbtrfs ウィキ、"magic" (= "magic string") は でなければなりません_BHRfS_M

回復手順

を参照しWhat if I don't have wipefs at hand?btrfs ウィキシェルで以下を実行します。
交換したディスクが接続されている PC とは別の PC で実行する方が安全です。

お使いの環境に合わせてデバイスとマウントポイントの場所を書き換えてください。
(私の環境では /dev/sdb1 として成功しました!)

# # backup magic strings just in case
# dd bs=1 count=8 if=/dev/sdb skip=$((64*1024+64)) of=~/magic1
# dd bs=1 count=8 if=/dev/sdb skip=$((64*1024*1024+64)) of=~/magic2
# dd bs=1 count=8 if=/dev/sdb skip=$((256*1024*1024*1024+64)) of=~/magic3

# # write magic string
# echo "_BHRfS_M" | dd bs=1 count=8 of=/dev/sdb seek=$((64*1024+64))
# echo "_BHRfS_M" | dd bs=1 count=8 of=/dev/sdb seek=$((64*1024*1024+64))
# echo "_BHRfS_M" | dd bs=1 count=8 of=/dev/sdb seek=$((256*1024*1024*1024+64))

# btrfs device scan
# mkdir -p /mnt/before_replace
# mount -o degraded,ro /dev/sdb /mnt/before_replace

私は英語が得意ではないので、読みにくかったらごめんなさい。でも、同じ状況にある他の人たちの助けになれば幸いです。

関連情報