有没有一种简单的方法可以将 btrfs 子卷移动到不同的 btrfs 文件系统?

jl6*_*jl6 6 filesystems btrfs

我有两个独立的 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)。

因此我认为直接mvcpfilesystemAfilesystemB是不可行的,因为它不会意识到 btrfs 子卷或数据的共享性质。

我读过的文档btrfs sendbtrfs receive几次,它看起来像这可能工作,基本上是重建对整个子卷结构filesystemB增量。但我希望有一种更简单的方法,因为我必须编写它的脚本(由于大量子卷),而且我觉得这可能容易出错。

(此外,发送/接收要求子卷为只读,Ubuntu 14.04 上的 btrfs-tools 版本似乎没有btrfs property允许我将现有子卷设置为只读的命令。我可以安装一个更高版本,但为了在这台“生产”机器上进行配置管理而不想这样做。)

Jod*_*mon 3

我很确定,您不会绕过 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