如何使用两个相同的设备恢复 btrfs 文件系统

如何使用两个相同的设备恢复 btrfs 文件系统

TL;DR:由于一个很长的故事,我得到了一个由设备/dev/sde1/dev/sde1(ID 1 和 2)组成的 Btrfs RAID1 文件系统。 Btrfs 不会挂载 rw,表示缺少一个设备。如何确定这些设备中哪一个是工作的,以便我可以删除另一个,以及如何添加正确的第二个驱动器 ( /dev/sdb1)?目前,添加驱动器失败,因为我只能以只读方式安装。


我有两个外部硬盘驱动器,RAID1(镜像)中带有 Btrfs。驱动器 A 很好,但驱动器 B 在定期清理期间出现了数百万个错误。在测试时,设备 B 看起来不错,所以我猜它们只是不同步(主机是一台笔记本电脑,由于其电池可以在断电时幸存下来,但驱动器不能,所以我猜一个在另一个之前上线或其他什么) )。我想在设备 B 上重建设备 A 的镜像。

经过一番搜索,我认为replace应该使用子命令。我想用,是的,设备 B 替换设备 B。当然,我尝试了 btrfs 是否理解这个命令:

btrfs replace start /dev/deviceB /dev/deviceB /mountpoint

不幸的是,这不起作用。手册页显示:“在实时文件系统上,[开始]将数据复制到当前存储在源设备上的目标设备。”所以我只是传递了另一个可用的设备,因为它可以从那里复制:

btrfs replace start /dev/deviceA /dev/deviceB /mountpoint

我应该更好地阅读手册页,因为后来它说“操作完成后,源设备将从文件系统中删除。”所以现在我有一个只有/dev/deviceB它的文件系统。

但它从未删除原始(损坏的)设备 B。

所以现在我有这样的情况:

$ btrfs device usage /mountpoint
/dev/sde1, ID: 1
   Device size:             3.64TiB
   Device slack:              0.00B
   Data,single:             1.00GiB
   Data,RAID1:              2.00TiB
   Data,DUP:               40.91GiB
   Metadata,single:         1.00GiB
   Metadata,RAID1:          5.00GiB
   Metadata,DUP:            3.00GiB
   System,single:          32.00MiB
   System,RAID1:           32.00MiB
   System,DUP:            128.00MiB
   Unallocated:             1.59TiB

/dev/sde1, ID: 2
   Device size:             3.64TiB
   Device slack:              0.00B
   Data,RAID1:              2.00TiB
   Metadata,RAID1:          5.00GiB
   System,RAID1:           32.00MiB
   Unallocated:             1.63TiB

/dev/sde1设备 B 在哪里。我可以用 挂载它-o degraded,ro。)

我该如何解决这种情况?

我尝试添加设备 A ( sdb1) 但失败,并显示“错误:添加设备‘/dev/sdb1’时出错:只读文件系统”。我不知道如何继续,因为我无法分辨哪个设备 ID 是哪个,所以删除其中一个(以便让它挂载 rw)可能会是灾难性的。无论如何,我不确定删除设备是目前最好的做法。也许我应该(在弄清楚它是什么设备 ID 之后)使用replace设备 ID 作为参数?

设备 A 上的文件系统不再被识别为 Btrfs,当使用 hexdumper 检查它时,它确实看起来无效:它曾经在开头附近的某个位置(iirc 就在 0x10 000 之后)包含文字字符串 BTRFS,但现在不再包含了。数据似乎仍然存在,只是标头不正确(第一个非零数据现在位于 0x400 000)。

答案1

我将首先给出通常被忽视的警告(我也很内疚)......立即备份您的数据。当然,如果您有足够的可用空间来备份数据,您只需重新创建文件系统,对吧?请记住,这是一门艺术,很难做到正确,这就是为什么我建议与 irc.freenode.net 上的 btrfs IRC 频道上的人员交谈。

我尝试的第一件事是恢复设备 A。这可以通过btrfs rescue super-recover /dev/deviceA或来完成btrfsck --repair /dev/deviceA。如果其中任何一个成功,那么您可以擦除deviceB并将其添加为新设备(或者如果deviceA仍然认为其已被袭击,则可以更换)。

否则,在这种情况下,我喜欢首先dm-snapshot创建设备快照并在快照上工作,这样我就不会让事情变得更糟。有时我需要尝试几次才能获得正确的 btrfs 命令序列。您将需要大量可用空间来存储快照文件(根据上面的情况,我认为需要 10-100G)。

查看上面的输出,devid 1似乎是您想要保留的输出,因为它的已用空间比devid 2.运行btrfs filesystem show还可以提供有关缺少哪个驱动器的更多信息(查找未列出或旁边没有设备路径的设备)。确保您没有将 btrfs 安装为只读,否则您将无法执行任何写入来修复它。您可以先尝试使用 和 删除设备btrfs device delete missing /mountpoint,如果这不起作用btrfs device remove 2 /mountpoint。如果失败,请尝试将块从 转换RAID1singlewith btrfs balance -mconvert=single -sconvert=single -dconvert=single /mountpoint,然后再次尝试删除设备。如果一切成功,那么您可以添加deviceA为设备并将所有内容重新转换回RAID1.而且这些转换命令可能会花费很多时间,所以需要耐心。

相关内容