我经常使用btrfs send
并将btrfs receive
只读快照从我的实时系统复制到备份驱动器。备份驱动器上已经有多个快照。今天我想知道:我可以从多个旧快照中复制多个今天的快照作为增量更新吗立刻?
最近我做了
btrfs send -p home_old home_today | btrfs receive /mnt/backup/
btrfs send -p share_old share_today | btrfs receive /mnt/backup/
这可以统一为1个命令吗?
所以我调查了man btrfs-send
并阅读:
在增量模式(选项 -p 和 -c)中,发送端和接收端均可用的先前发送的快照可用于减少在不同文件系统上重建已发送快照所需发送的信息量。
这就是我想要的。
-p <父级>
将增量流从父卷发送到子卷
-c <克隆源>
使用此快照作为增量发送的克隆源(允许多个)
似乎只有其中之一-p
支持-c
多个现有快照,但我不明白它们之间的区别。有什么不同?
答案1
这里它说与-pbtrfs-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
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
Parent.diff 的大小为 6418364996 字节
所以,就我而言,几乎没有区别。
我不认为 btrfs-send 可以在一个命令中为多个子卷生成流。
答案2
我刚刚写了一个长答案它还讨论了相关部分的选项、复制和粘贴-p
:-c
只能有一个父母
这手册页和(旧)维基常见问题解答不幸的是相当混乱。作者是btrfs-clone
断言btrfs发送和接收最多只能考虑一增量传输的父级。父级可以通过-p
一个或多个-c
选项直接指定或间接指定:
btrfs-send
来自 btrfs-tools 4.13 选择子卷 S 的父卷和给定克隆源集 C_i像这样:
- 如果
-p
指定了选项,则使用它- 如果S没有
parent_uuid
set,或者找不到这个uuid,则放弃- 如果存在
C_i
withC_i->uuid == S->parent_uuid
(S 是子卷(快照)的子卷,我们称其为“妈妈”),则使用它- 如果没有C_i与S相同
parent_uuid
,则放弃- 从所有“妈妈”的孩子 C_i 中,选择与“妈妈”最接近的一代(实际上,
ctransid
,与“一代”到底有什么区别?)。注意维基百科有点误导,因为它表明
-c
without与withp
不同,尽管上面的算法通常暗示了这一点。唯一相关的例外是发送没有父卷的子卷。-c
-p
-p
总之,我建议始终明确指定一个父项 via-p
并忽略-c
,btrfs receive
根本没有“两个父项”这样的概念。