我有以下 ZFS 数据集:
pool/dataset
pool/dataset@snap1
pool/dataset@snap2
pool/dataset@snap3
已使用 ZFS send/recv 将其复制到备份池
backupPool/dataset
backupPool/dataset@snap1
backupPool/dataset@snap2
之后,我删除了dataset@snap1
和dataset@snap2
from ,并且我处于无法增量pool
发送到 的情况。dataset@snap3
backupPool
有办法解决这种情况吗?例如,在pool/dataset@snap3
和之间生成 ZFS 增量快照backupPool/dataset@snap2
并将其发送到backupPool
?还是转回backupPool/dataset@snap2
?pool
我可以转移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
。我无法找到更好的解决方案来解决这个问题。
丹的建议非常有帮助。此外,为了避免将来删除快照,最好的做法是捉住它。