我在 2年前问过类似的问题。
但是,就我而言,我只打算将单个设备复制到raid0上。
我最终找到了解决方案。当时您无法从raid0转换为raid10,但是从内核3.3开始,现在可以了。因此,该解决方案最终可能对您有用。
这种方法的问题是它复制了fsuid。这意味着您不能将FS及其副本安装在同一台计算机上。当时,没有工具可以更改fsuid
FS,但是现在可能已更改。
这个想法是在原始设备的顶部添加一个写时复制层,以便可以对其进行写入,但是可以在其他地方进行任何修改,以后可以将其丢弃。这意味着您需要额外的存储空间(例如在外部驱动器上)。
然后挂载该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的发送/接收。那可能是您的选择。