我对 BTRFS 还很陌生。我设法对我的系统做了一个只读快照,并将其发送/接收到外部驱动器(再次将其作为 rw 快照,以便我甚至可以启动它):到目前为止一切顺利。我知道,为了做增量快照,我必须知道哪个是最后一个快照:btrfs 当然需要知道它应该将当前快照链接到哪个快照(以节省磁盘空间)。我还知道,如果我想增量备份到外部驱动器,上一个快照也必须存在于外部驱动器上(它们具有相同的 ID)。一目了然。整个故事在这里解释得非常好: https://fedoramagazine.org/btrfs-snapshots-backup-incremental/
我读到过,如果我删除链中的一个快照,所有后续快照都会被赋予新的 ID:这让我想到,如果我在内部驱动器上只保留最后一个先前的快照,我将无法再加入外部驱动器上的链。这是正确的吗?我如何才能将所有增量快照保留在外部驱动器上,而只保留最后一个在内部驱动器上?
答案1
为了正确回答你的问题,首先解释一下btrfs send/receive
工作原理是很重要的。从BTRFS 维基:
如果你看一下接收功能,就会很容易理解。接收功能接收一系列指令,创建一个新的子卷,并使用这些指令修改该子卷,直到它看起来像发送的那个子卷。
在初始发送的情况下,会产生一个数据流,其中包含在新磁盘上重新创建子卷btrfs send
的指令- 即基本上告诉它:btrfs receive
创建目录foo
;创建文件foo/bar
;将以下内容放入foo/bar
。
在增量发送的情况下,btrfs send
将比较您要发送的快照与指定的父级-p
,并生成仅包含这两个子卷之间差异的流。btrfs receive
然后,将首先从父子卷创建一个新的快照(因此必须存在于接收端),并根据指令流修改该快照 - 即移动foo/bar
到bar
;删除foo/
;更新bar
以下内容;...
btrfs receive
通过 UUID 识别要从中拍摄快照的正确子卷。您可以使用以下命令查看子卷的 UUIDbtrfs subvolume show
:
- 每个子卷都有一个唯一的唯一唯一标识符
- 如果它是另一个子卷的快照,它将通过其父 UUID
btrfs receive
如果它是由它创建的收到的 UUID原始子卷
因此,您只需要增量发送要发送的子卷和接收端已存在的“父”子卷即可。BTRFS 不关心任何连续的“链”或其他东西,删除子卷不会更改另一个子卷的 ID。
上班可靠地但您应尊重以下几点:
- 之后不要修改子卷
btrfs send
- 无论是在发送方还是接收方 - 但保留它们ro
每时每刻。 - 仅使用适当的子卷作为发送父级,即它们应该是彼此的快照或具有共同的父级