对于 btrfs 子卷,我从两个阶段创建了一个简单的增量备份:
btrfs send old/@ > base.btrfs
btrfs send new/@ -p old/@ > update.btrfs
这两个源子卷是在不同时间从同一个主动挂载的子卷中捕获的快照。
在目标上,我尝试恢复:
btrfs receive ./ < base.btrfs
btrfs receive ./ < update.btrfs
期望前面的命令将创建初始备份阶段的恢复快照,而后者将应用进一步的增量阶段。
前面的命令成功,但后面的命令失败:
ERROR: creating snapshot ./@ -> @ failed: File exists
由于很明显我无法将后一个阶段有效地应用于不存在的目标,因此我对进程执行此检查的原因以及预期应用更新成功的原因感到困惑。
如何将更新阶段应用于通过恢复初始阶段生成的目标?
您不能拥有(如在发送方)具有相同名称的多个子卷。
您可以
mv
在目标系统上创建基本快照/子卷:自发布以来,我已经学会了足够的知识来回答这个问题。
答案分为两部分。
首先,
receive
子命令总是在目标目录中创建一个与原始子卷同名的新条目,无论新子卷是从子流还是父流创建的。因此,目标目录必须为空,至少任何名称与原始子卷相同。一种简单的技术是为父子卷和每个子卷创建一个新的空目录。其次,虽然子命令对子命令的调用没有引用父节点,但只要父节点已恢复到同一分区的子卷,它就可以利用父节点的必要数据。也就是说,
receive
子命令将对子流具有所需的效果,只要它先前已在父级的同一分区上调用过。一旦父母和孩子被恢复,任何父母都可以被删除而不会伤害孩子。
因此,以下将是原始目标的有效命令序列:
然后子流的全部内容将通过
./@
.当然,如果要保存的子流有多个祖先(例如
base.btrfs
,有自己的父),则需要进一步的命令。