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