如何将 btrfs 文件系统克隆到不同的介质中保存快照的共享数据

Ada*_*ski 11 backup btrfs

我决定尝试一下 btrfs 突袭功能。我设置了一个 btrfs

sudo mkfs.btrfs -m raid10 -d raid10 /dev/sda9 /dev/sdb9 /dev/sdc9 /dev/sdd9
Run Code Online (Sandbox Code Playgroud)

现在我想克隆我现有的 btrfs 分区(它位于 linux-raid 之上)。不能使用简单的cp -a,因为有超过 40 个基于快照的备份(我希望保留这些备份),而且我只会多次填充我可以备用的所有存储。

到目前为止,我可以看到两个选项:

partclone.btrfs -s /path/to/original/fs -o /dev/sda9 -b
Run Code Online (Sandbox Code Playgroud)

我想我还需要 btrfs balance start /dev/sda9

do:增量复制,cp -a尽可能多地放入存储中,然后用于bedup去重文件,然后循环。

什么是首选(即最佳实践)方法?我更喜欢第一个;它应该花费更少的时间。或者也许在任何这些程序中都潜伏着一些邪恶的“陷阱”(当然,除了 btrfs 是实验性的这一事实)


第一个问题简直是无稽之谈;无论多么出色的工具partclone.btrfs,它显然都不支持多设备文件系统。:-(

Sté*_*las 7

2年前我问过一个类似的问题

但是,就我而言,我只打算将单个设备复制到 raid0 上。

我最终找到了解决方案。当时您无法从raid0 转换为raid10,但看起来从内核3.3 开始,您现在可以了。因此,该解决方案最终可能对您有用。

这种方法的一个问题是它复制了 fsuid。这意味着您不能在同一台机器上安装 FS 及其副本。当时,没有工具可以改变fsuidFS 的,但现在可能已经改变了。

这个想法是在原始设备的顶部添加一个写时复制层,以便它可以被写入,但任何修改都在其他地方完成,您可以稍后丢弃。这意味着您需要额外的存储空间(例如在外部驱动器上)。

然后挂载 COW 的 FS 而不是原始文件,为 FS 副本添加设备并删除 COW 的设备。

对于写时复制,您可以使用设备映射器。

对于写入区域的一次性副本,这里我使用循环设备。

假设你想克隆/dev/sda/dev/sd[bcde]

创建 COW 后台存储:

truncate -s 100G /media/STORE/snap-store
losetup /dev/loop0 /media/STORE/snap-store
Run Code Online (Sandbox Code Playgroud)

现在卸载原始 FS(如果已安装)并modprobe -r btrfs确保它不会干扰并使其忘记其设备扫描。

然后制作 COW 设备:

echo "echo 0 $(blockdev --getsize /dev/sda) snapshot /dev/sda /dev/loop0 N 8 | dmsetup create cowed
Run Code Online (Sandbox Code Playgroud)

现在/dev/mapper/cowed就像/dev/sda除了写入它的任何东西都会结束/dev/loop0并且/dev/sda不会被触及。

现在,您可以挂载它:

mount /dev/mapper/cowed /mnt
Run Code Online (Sandbox Code Playgroud)

添加其他设备:

btrfs dev add /dev/sd[bcde] /mnt
Run Code Online (Sandbox Code Playgroud)

并删除旧的:

btrfs dev del /dev/mapper/cowed /mnt
Run Code Online (Sandbox Code Playgroud)

当这一切结束时,您可能想要关闭并拔掉/dev/sda电源或使其成为只读,因为它与其他的 fsuid 具有相同的 fsuid,btrfs可能仍然会弄乱它。

现在,如果我理解正确,假设您最近使用了 btrfs-prog,您应该能够执行以下操作:

btrfs balance start -d convert=raid10 /mnt
Run Code Online (Sandbox Code Playgroud)

转换为raid10。理论上,这应该确保每个数据块都被复制到至少 2 个磁盘上。

我强烈建议您首先在循环设备上对虚拟 btrfs 进行测试,因为所有这些都来自记忆,我可能弄错了(例如,请参阅我编辑前的初始答案)。

请注意,从内核 3.6 开始,btrfs 实现了类似于 zfs 的发送/接收。这可能是你的一个选择。


ign*_*nis 6

Stephane 的想法可以通过 btrfs 内置工具来实现(这就是它很酷的原因):通过使旧的 btrfs 成为种子设备btrfstune -S 1 /dev/device,添加设备,删除种子设备,执行btrfs balance start。种子设备是只读设备,可以是读写文件系统的一部分。