原因

原因

我的 NAS 中有一个 500GB 的磁盘,上面装有 BTRFS。我最近买了一个 4TB 的磁盘,我想只使用新磁盘,而不停机。所以我运行btrfs replace start 1 /dev/sdb .,等待它完成,然后拔下 500GB 驱动器。

现在,由于我无法访问 4TB 磁盘,我想从更换的 500GB 磁盘中恢复所有数据,但其上的 BTRFS 分区不再被识别。我尝试正常安装它,使用-o degraded-o recovery,ro我甚至尝试了btrfs restorebtrfs check,但都失败了。我在这里有什么选择?

答案1

这是一个过去的问题,但我遇到了同样的情况,我会回答。
btrfs replace在 debian bullseye(5.10.0-13-amd64) 上运行了 RAID1 文件系统,并使用以下步骤在 Manjaro(5.13.19-2) 上恢复。

原因

至少对于内核版本 5.10,该btrfs replace命令最终调用btrfs_scratch_superblocks位于此位置的函数:GitHub
此功能删除原始磁盘超级块上的“魔术字符串”。

我在我的环境中实际上得到了以下结果:

# 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” (= “魔术字符串”) 必须是_BHRfS_M

恢复过程

参照What if I don't have wipefs at hand?btrfs 维基,在 shell 上执行以下操作。
在与更换磁盘所连接的 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

我的英语不太好,所以如果读起来有点困难,请见谅。但我希望这对处于同样境况的人有所帮助。

相关内容