我对 ZFS 并不陌生。我已经用了几年了,但才刚刚开始制作快照,并且创建了一个 cronjob 和脚本来每天对我的一些数据集进行快照,这些数据集都位于同一个池中。
我正在寻找一种快速方法,在另一个 cron 脚本中列出我的快照,以便我可以销毁最旧的快照。目标是拥有一组连续滚动的 7 个快照:这样我就可以回滚到过去 7 天中的任何一天。
我正在运行脚本,目前只有 1 组快照(今天)。我找到了一个很酷的答案,来自https://serverfault.com/users/15810/AaronLS用于查找最旧的快照并销毁它。我计划将其添加到我的 bash 脚本中,以便它每天拍摄快照,然后立即查找最旧的快照并将其销毁。
AaronLS 的答案在这个问题中:如何删除除最后 [n] 个 ZFS 快照之外的所有快照?
我的问题其实是无知的。我以为从任何给定数据集创建的第一个快照是该数据集的完整映像,任何其他快照都基于第一个快照,而任何较新的快照都只是自第一个快照以来更改的记录。
因此,如果我删除最旧的快照,那么 ZFS 是否必须更改第二旧的快照才能再次获得完整的“第一个快照”图像?
我解释得对吗?当然,如果您删除原始快照,那么下一个最旧的快照现在将成为“原始”快照,并且需要在其中进行一些数据处理,才能成为完整的数据集图像?
有人能用通俗易懂的语言向我解释一下为什么我的假设是错误的吗?我觉得我有点了解快照,但我只是缺乏信心。我打算今晚尝试在 10 分钟的 crontab 上运行我的脚本,这样我就可以在 70 分钟内模拟一周的快照,但在继续之前我不确定我是否理解了数学。
我也为格式不好而道歉。如果我知道如何正确引用用户名并链接到另一篇文章,我会编辑这篇文章,让它更整洁。我已经很久没有在这里发帖了。
谢谢。
答案1
如果我没记错的话,当你拍摄快照时,什么都不会发生,它只是一个时间戳。然后你的数据开始改变。每次改变之前,原始数据都会被复制到快照中。
答案2
每个快照都是表示文件系统在某一时间点所需数据的完整索引。除了共享数据空间外,快照之间完全独立。
您正在考虑增量,但 zfs 快照不是增量。它们不包含任何实际数据,因此这样做没有任何好处。