修剪 BTRFS 增量快照

修剪 BTRFS 增量快照

我对 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/barbar;删除foo/;更新bar以下内容;...

btrfs receive通过 UUID 识别要从中拍摄快照的正确子卷。您可以使用以下命令查看子卷的 UUIDbtrfs subvolume show

  • 每个子卷都有一个唯一的唯一唯一标识符
  • 如果它是另一个子卷的快照,它将通过其父 UUID
  • btrfs receive如果它是由它创建的收到的 UUID原始子卷

因此,您只需要增量发送要发送的子卷和接收端已存在的“父”子卷即可。BTRFS 不关心任何连续的“链”或其他东西,删除子卷不会更改另一个子卷的 ID。

上班可靠地但您应尊重以下几点:

  • 之后不要修改子卷btrfs send- 无论是在发送方还是接收方 - 但保留它们ro每时每刻。
  • 仅使用适当的子卷作为发送父级,即它们应该是彼此的快照或具有共同的父级

相关内容