如何替换 BTRFS RAID-1 文件系统中的设备?

max*_*zig 7 btrfs

我有一个有两条腿的 BTRFS RAID-1 文件系统。由于再次出现读取错误,需要更换一张磁盘。

因此,计划是:

  1. 添加第 3 条腿 -> 结果应为:3 路镜像
  2. 移除故障磁盘 -> 结果应该是:2 way mirror

因此,我做了以下步骤:

btrfs dev add /dev/new_device /mnt/foo
btrfs balance /mnt/foo
Run Code Online (Sandbox Code Playgroud)

我假设 btrfs 做正确的事情,即创建一个 3 路镜像。

我猜,另一种方法是使用平衡过滤器。但是既然文件系统已经是 RAID-1 了,那应该没有必要了吧?

我有点担心,因为 abtrfs fi show打印了这个:

平衡开始前:

    Total devices 3 FS bytes used 2.15TiB
    devid    1 size 2.73TiB used 2.16TiB path /dev/left
    devid    2 size 2.73TiB used 2.16TiB path /dev/right
    devid    3 size 2.73TiB used 0.00B path /dev/new_device
Run Code Online (Sandbox Code Playgroud)

平衡时:

    Total devices 3 FS bytes used 2.15TiB
    devid    1 size 2.73TiB used 1.93TiB path /dev/left
    devid    2 size 2.73TiB used 1.93TiB path /dev/right
    devid    3 size 2.73TiB used 458.03GiB path /dev/new_device
Run Code Online (Sandbox Code Playgroud)

我的意思是,这看起来像 btrfs 将现有 RAID-1 组的一半平衡到单个磁盘......对吗?

因此,我的问题是,我是否需要指定平衡过滤器才能获得三向镜?

PS: btrfs 甚至支持 n-way 镜像吗?一个在BTRFS注意到维基说,它不会-但也许它已经过时?哦,男孩,cks 最近有一篇关于 2-way limit 的文章

max*_*zig 10

目前,btrfs支持n-way mirrors

Btrfs 确实有一个特殊的替换子命令:

btrfs replace start /dev/left /dev/new_device /mnt/foo
Run Code Online (Sandbox Code Playgroud)

btrfs-replace手册页的两行之间阅读,此命令应该能够使用现有的两条腿 - 例如,对于两条腿都有读取错误的情况 - 但两个错误集是不相交的。

btrfs 替换命令在后台执行 - 您可以通过status子命令检查其状态,例如:

btrfs replace status /mnt/foo
45.4% done, 0 write errs, 0 uncorr. read errs
Run Code Online (Sandbox Code Playgroud)

或者,也可以将设备添加到 raid-1 文件系统,然后删除现有的分支:

btrfs dev add /dev/mapper/new_device /mnt/foo
btrfs dev delete /dev/mapper/right  /mnt/foo
Run Code Online (Sandbox Code Playgroud)

add应返回快,因为它甫一增加了设备(问题上btrfs fi show确认)。

以下delete应触发剩余设备之间的平衡,以便每个扩展在每个剩余设备上可用。因此,该命令可能会运行很长时间。这种方法也适用于处理问题中描述的情况。

btrfs replace添加/删除循环相比,系统日志会使用低级信息消息发送垃圾邮件。此外,完成需要更长的时间(例如,在我的带有 3 TB SATA 驱动器的测试系统中,FS 使用率为 80%)的时间要长 2-3 倍。

最后,在实际更换后,如果新设备比原始设备大,您将需要btrfs fi resize在每个设备上发出一个以利用整个可用磁盘空间。对于replace顶部的示例,这看起来像:

btrfs fi resize <devid>:max /mnt/foo
Run Code Online (Sandbox Code Playgroud)

wheredevid代表btrfs fi show返回的设备 ID 。

  • 我发现了一个“btrfs dev add ...”,然后是一个“btrfs dev delete ...”,对于一个相对较小的(100Gb 卷;400 个快照)需要 5 天的时间才能完成。我强烈建议使用“替换” - 相关链接:https://lwn.net/Articles/524589/ 和 https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-replace (2认同)