我有两个独立的 btrfs 文件系统,我想合并它们。子卷结构如下所示:
/ filesystemA
|- subvolume1
|- subvolume2
|- ...
|- subvolumeN
/ filesystemB
|- subvolume1
|- subvolume2
|- ...
|- subvolumeM
Run Code Online (Sandbox Code Playgroud)
filesystemB
是目标。我想将子卷 1 到 N 移动到filesystemB
. N
超过 1000,因为它们是每日快照子卷 - 也正因为如此,它们之间的差异很小,即有很多共享数据。filesystemA
是 1TB,但一个天真du
的路径上的文件总数超过 300TB(驱动器上的实际空间使用量小于 500GB)。
因此我认为直接mv
或cp
从filesystemA
到filesystemB
是不可行的,因为它不会意识到 btrfs 子卷或数据的共享性质。
我读过的文档btrfs send
和btrfs receive
几次,它看起来像这可能工作,基本上是重建对整个子卷结构filesystemB
增量。但我希望有一种更简单的方法,因为我必须编写它的脚本(由于大量子卷),而且我觉得这可能容易出错。
(此外,发送/接收要求子卷为只读,Ubuntu 14.04 上的 btrfs-tools 版本似乎没有btrfs property
允许我将现有子卷设置为只读的命令。我可以安装一个更高版本,但为了在这台“生产”机器上进行配置管理而不想这样做。)
我很确定,您不会绕过 btrfs-send/btrfs-receive。另一种选择是复制子卷,然后在目标上对它们进行重复数据删除,但这需要很长时间。
对于只读问题:由于这些是每日快照,所以大多数卷不是只读的吗?
我会做一个
$btrfs subvolume create /subvolumeA/source
$for i in /filesystemA/subvolume*; do btrfs subvolume snapshot -r $i /filesystemA/source/$i; done
Run Code Online (Sandbox Code Playgroud)
现在您已拥有 /filesystemA/source/ readonly 下的所有子卷。
现在,您可以使用 btrfs-send 和父语句将它们在循环中增量发送到目的地。
如果某些快照应该再次可写,您可以使用 将这些快照的内容复制到新的可写子卷cp --reflink
。