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

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

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

sudo mkfs.btrfs -m raid10 -d raid10 /dev/sda9 /dev/sdb9 /dev/sdc9 /dev/sdd9

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

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

partclone.btrfs -s /path/to/original/fs -o /dev/sda9 -b

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

do:增量复制尽可能cp -a多的内容到存储中,然后使用bedup去重复文件并循环。

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


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

答案1

我问类似的问题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

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

然后制作 COW 设备:

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

现在/dev/mapper/cowed就像/dev/sda除了写入它的任何内容最终都会被保留/dev/loop0并且/dev/sda不会受到影响。

现在,您可以安装它:

mount /dev/mapper/cowed /mnt

添加其他设备:

btrfs dev add /dev/sd[bcde] /mnt

并删除旧的:

btrfs dev del /dev/mapper/cowed /mnt

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

现在,如果我理解正确的话,假设你有最近的 btrfs-prog,你应该能够执行以下操作:

btrfs balance start -d convert=raid10 /mnt

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

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

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

答案2

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

答案3

我尝试按照@ignis的建议使用播种,但遇到了问题;尝试删除种子设备时系统抛出错误,我无法克服这个问题。然后我发现有(现在 - btrfs-progs v3.19-64-g19a806f,也许不是更早的)命令:

  btrfs replace start [-Bfr] <srcdev>|<devid> <targetdev> <path>

这使得将我现有的 btrfs 文件系统(位于 LVM 逻辑卷中)克隆到新分区变得轻而易举。请注意,截至 2015 年 5 月,它不适用于 RAID5/6 配置文件 - 请查看手册页以获取完整信息。

答案4

只是在这里添加我的 0.02 美元。我意识到这是一个旧线程。我昨晚尝试了 btrfs-clone,因为我在使用 BTRFS 文件系统时遇到了无法恢复的错误。 btrfs-clone 使用 btrfs 快照和发送设施。如果文件系统出现错误,快照将不起作用。我还尝试了partclone.btrfs,它的工作方式有点像dd,因为它也很乐意克隆错误。由于这是我正在使用的虚拟机,因此我尝试将部分克隆到新卷,在原始卷上格式化有问题的分区,然后将其克隆回该分区,错误又回来了。据我所知,btrfs 有点脆弱并且恢复得不太好。一旦开始出现校验和错误,快照就会停止工作,并且校验和错误将无法恢复。我也无法对现在作为子卷附加的单独卷上的数据进行快照。我现在正在构建一个新的虚拟机。我可以将这些新的未受污染的卷附加到新的虚拟机上。

再次强调,这只是我的 0.02 美元,干杯

相关内容