我使用的是 FreeBSD 11.1,输出zfs list -t snap -r poolname
显示我的大量快照在“USED”下为“0”。我已经阅读了 ZFS 如何占用空间,所以我了解基础知识,他们建议我
- “0”表示快照不占用磁盘空间,也就是说删除它不会恢复任何磁盘空间。
- 如果一个文件出现在 2 个快照中,这不会改善该文件的冗余度,因为这只意味着存在指向该文件的多个指针(引用)(或者更准确地说,指向组成该文件的一系列块),而不是存在额外的副本。
因此逻辑表明,任何带有 USED=0 的快照都可能是 rhat 对象前一个快照的相同副本,并且如果您不想保留与前一个快照没有任何变化的快照,则可以安全删除,并且这样做不会丢失冗余。
如果删除旧数据或减少冗余会降低数据安全性,我会坚决不删除,而且我至少能想到几个可能的原因,事情可能没那么简单:
当其他快照被销毁时,快照的 USED 值可能会发生变化,但同样,在几乎任何正常使用中,大小为零的情况都应强烈暗示存在另一个大小非零且与其相同的快照。但“强烈暗示”并不意味着“不可能如此”,零意味着所有块都存在,而不是它们的组织方式相同且文件相同。是否存在“不加考虑”删除所有大小为零的快照不一定安全的情况?
举个例子,假设我们 (1) 创建一个 100MB 的文件并快照池,然后 (2) 创建另外两个 75MB 的文件,分别包含 100MB 文件的第一个和最后一个 75%,然后删除 100MB 文件,然后再次快照。第二个快照将显示 0 空间使用量,因为所有块都存在于上一个快照中,但文件该快照中的文件实际上是独一无二的。我想不出检测这种情况的方法,因为 ZFS 中的空间核算是基于块而不是基于文件的。也许在使用重复数据删除和某些类型的文件被附加或“尾随”的情况下,这种情况可能很常见,即使很少见,而不仅仅是病态的边缘情况。
所以我不确定。也许 snap size 只是个幌子,我需要检查其他属性。
在那儿任何在非平凡的情况下,人们可以安全快速地确定 ZFS 快照是否冗余(在我使用的意义上),以及是否可以安全地删除它?
或者是否有另一种更好的(快速+有效)方法来判断,从其他属性或 ZFS 差异或其他什么来看,两个连续的快照是否实际上指向池历史记录中的同一时间点/池写入序列号(这将明确证实它们引用相同的数据)?
答案1
USED=0
是快照与之前快照重复的合理指标。但是,您应该确保它实际上是零,而不是某个四舍五入的零(例如 0.1KB,四舍五入到最接近的 KB)。您可以使用-p
(“可解析”)标志来获取以字节为单位的准确数字。另请注意,创建快照后,空间会计数字可能需要几秒钟才能更新。
就像你建议的那样,你也可以使用它zfs diff
来实现同样的目的。这还有一个好处,就是告诉你什么已改变。
您给出的示例(块在文件之间共享)只有在启用了重复数据删除的情况下才会发生。否则,ZFS 仍会存储块的多个副本并适当地考虑该空间。即使使用重复数据删除,上述两种方法都会显示差异 - 快照不会占用零USED
空间,因为您需要两个文件的新元数据(两个 inode 加上指向重复数据删除块的间接块;可能还有其他内容),并且zfs diff
会显示+<filename>
两个新文件。
编辑:我能想到的最后一个用户可见的检查方法是在zfs send -nv
快照之间逐步运行(试运行,详细)。这不会生成完整的发送流,但可能会告诉您将发送什么,如果两个快照相同,则应该什么都没有。