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


9

我决定尝试btrfs突袭功能。我建立了一个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

做到:cp -a尽可能多地增量复制到存储中,然后用于bedup对文件进行重复数据删除并循环。

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


第一个问题完全是不可能的。无论partclone.btrfs是多么棒的工具,它显然都不支持多设备文件系统。:-(

Answers:


7

2年前问过类似的问题

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

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

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

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

然后挂载该COW's FS,而不是原始的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与其他fsuid相同,btrfs可能仍会弄乱它。

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

btrfs balance start -d convert=raid10 /mnt

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

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

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


好答案,谢谢。我会测试。现在,我正在尝试发送/接收。
亚当·里奇科夫斯基

@StéphaneChazelas gmane链接已死(可能永远存在)。您可以调整答案吗?
乔纳斯·斯坦

4

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


1

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

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

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


1
切勿btrfs replace start用于备份目的!!它会损坏您的设备树并使驱动器无法挂载!我无法从错误中恢复,因此我使用dd -tool 从另一个块设备恢复了映像副本。仅btrfs replace用于最终驱动器迁移。
Karmus

0

选项1-数据复制然后更改UUID

确保源分区已卸载且不会自动安装。

使用dd(慢,哑)或partclone.btrfs -b -s /dev/src -o /dev/target

用于btrfstune -u在复制之后和安装之前更改UUID。

数据丢失警告待办事项尝试(自动)安装或者原件或复制,直到UUID已经改变


选项2- btrfs-clone

我没有亲自尝试过btrfs-clone,但是它旨在将现有的BTRFS文件系统克隆到一个新的文件系统,从而依次克隆每个子卷。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.