ZFS 增量快照发送/接收,无需第一个快照

ZFS 增量快照发送/接收,无需第一个快照

我有以下 ZFS 数据集:

pool/dataset
pool/dataset@snap1
pool/dataset@snap2
pool/dataset@snap3

已使用 ZFS send/recv 将其复制到备份池

backupPool/dataset
backupPool/dataset@snap1
backupPool/dataset@snap2

之后,我删除了dataset@snap1dataset@snap2from ,并且我处于无法增量pool发送到 的情况。dataset@snap3backupPool

有办法解决这种情况吗?例如,在pool/dataset@snap3和之间生成 ZFS 增量快照backupPool/dataset@snap2并将其发送到backupPool?还是转回backupPool/dataset@snap2pool

我可以转移pool/dataset@snap3到 中的新数据集backupPool,但我确实需要保留快照的“历史记录”。

答案1

根据 OpenZFS 维护者 Matthew Ahrens 的说法,您可以通过将接收主机上的先前快照指定为源来实现此目的[1]

今天这应该是可能的:

man zfs-receive
...
     zfs receive [-FhMnsuv] [-o origin=snapshot] [-o property=value]
         [-x property] filesystem|volume|snapshot
       -o origin=snapshot
           Forces the stream to be received as a clone of the given snapshot.
           If the stream is a full send stream, this will create the filesys‐
           tem described by the stream as a clone of the specified snapshot.

所以在你的例子中,你可以这样做zfs send apool@snapshot3 | zfs receive -o origin=bpol@snapshot0 bpool/recvd。理想情况下,您可以zfs promote bool/recvd将其重命名以替换原始文件系统,然后销毁旧文件系统。在您的示例中,这可能有点混乱,因为您正在谈论最顶层的文件系统。希望在实践中你能做到bpool/fs@snapshot0

答案2

感谢您的所有建议!

我最终pool/dataset@snap3与同步backupPool/dataset@snap2,删除了数据集backupPool/dataset,并从 重新创建了它backupPool/dataset。我无法找到更好的解决方案来解决这个问题。

丹的建议非常有帮助。此外,为了避免将来删除快照,最好的做法是捉住它

相关内容