“父”和“克隆源”与“btrfs 发送”有什么区别?

Dan*_*mer 5 linux backup btrfs synchronization

我经常使用btrfs sendbtrfs receive只读快照从我的直播系统复制到备份驱动器。在备份驱动器上已经有多个快照。今天我想知道:我可以一次从多个旧快照复制多个今天的快照作为增量更新吗?

最近我做了

btrfs send -p  home_old  home_today | btrfs receive /mnt/backup/
btrfs send -p share_old share_today | btrfs receive /mnt/backup/
Run Code Online (Sandbox Code Playgroud)

这可以统一为1个命令吗?

所以我查看man btrfs-send并阅读:

在增量模式下(选项 -p 和 -c),可以使用在发送端和接收端都可用的先前发送的快照来减少必须发送的信息量,以在不同的文件系统上重建发送的快照。

这就是我想要的。

-p <父>

将增量流从父级发送到子级

-c <克隆源>

将此快照用作增量发送的克隆源(允许多个)

似乎只有其中一个-p-c支持多个现有快照,但我不明白它们之间的区别。有什么不同?

小智 3

这里说,使用-p btrfs-send 首先创建父子卷的快照,然后根据来自 btrfs-send 的数据流相应地修改该快照。使用-c选项 btrfs-receive 创建空白子卷并对其进行修改,为未更改的文件创建引用链接。区别在于 btrfs-send 需要传输的元数据的大小。如果使用-c选项,则传输所有元数据;如果使用-p选项,则传输一些元数据。

我使用子卷(250G,310k 文件)的快照对此进行了测试,结果如下:

# time btrfs send -p server-20181031-1746 server-20181225-1144 -f /mnt/parent.diff
At subvol server-20181225-1144

real    3m12,618s
Run Code Online (Sandbox Code Playgroud)

Parent.diff 的大小为 6418364996 字节

# time btrfs send -c server-20181031-1746 server-20181225-1144 -f /mnt/clone.diff
At subvol server-20181225-1144

real    3m17,435s
Run Code Online (Sandbox Code Playgroud)

Parent.diff 的大小为 6418364996 字节

所以,就我而言,几乎没有区别。

我不认为 btrfs-send 可以在一个命令中为多个子卷生成流。