如何确定我的任何 ZFS 快照是否真正冗余并且可以安全删除而不会丢失数据?

Sti*_*lez 5 freebsd zfs

我正在使用 FreeBSD 11.1,并且输出zfs list -t snap -r poolname显示了我的大量快照,在“USED”下带有“0”。我已经阅读了 ZFS 如何计算空间,所以我了解了基础知识,他们向我建议

  1. “0”表示快照不使用磁盘空间,从某种意义上说,删除它不会恢复任何磁盘空间。
  2. 如果一个文件存在于 2 个快照中,这不会改善该文件的冗余,因为这意味着存在指向该文件的多个指针(引用)(或更确切地说,指向组成该文件的一系列块),而不是额外的副本存在。

所以逻辑表明,任何 USED=0 的快照都可能是 rhat 对象的前一个快照的相同副本,如果您不想保留与前一个快照没有任何变化的快照,并且没有冗余,则可以安全删除这样做是迷失了

如果会降低数据安全性,我非常重视不删除旧数据或减少冗余,并且我至少可以想到几个可能的原因,这可能不是那么简单:

  • Snapshot USED 值可以在其他快照被破坏时更改,但同样,零大小的存在应该在几乎任何正常使用中强烈表明,另一个快照存在与它相同的非零大小。但是“强烈建议”并不意味着“事实并非如此令人难以置信”,零意味着所有块都存在,而不是它们的组织方式相同且文件相同。是否存在“失控”删除所有零尺寸快照不一定安全的情况?

  • 举个例子,假设我们 (1) 创建一个 100MB 文件并对池进行快照,然后 (2) 创建另外两个 75MB 文件,分别包含 100MB 文件的第一个和最后一个 75%,并删除 100MB 文件,然后快照再次。第二个快照将显示已用空间为 0,因为所有块都存在于前一个快照中,但该快照中的文件实际上是唯一的。我想不出检测这种情况的方法,因为 ZFS 中的空间记帐是基于块的,而不是基于文件的。也许在使用重复数据删除以及某些类型的文件被附加或“拖尾”的情况下,这可能很常见,如果很少见,而不仅仅是病理边缘情况。

所以我不确定。也许快照大小是一个红鲱鱼,我需要检查其他属性。

是否有任何重要的情况可以安全快速地确定 ZFS 快照是否是多余的(在我使用该术语的意义上),并且删除它是安全的?

或者是否有另一种更好(快速+有效)的方法来判断,从其他属性或 ZFS 差异或其他什么,两个连续快照是否实际上指向池历史中的同一时间点/池写入序列号(这将明确确认它们引用相同的数据)?

Dan*_*Dan 1

USED=0是一个合理的指标,表明快照与其之前的快照是重复的。但是,您应该确保它\xe2\x80\x99 实际上为零,而不是某种四舍五入版本的零(如 0.1KB,四舍五入到最接近的 KB)。您可以使用-p(\xe2\x80\x9cparseable\xe2\x80\x9d) 标志来获取以字节为单位测量的确切数字。另请注意,创建快照后,可能需要几秒钟时间才能更新空间统计数字。

\n\n

正如您所建议的,您也可以用来zfs diff实现同样的目标。这样做的另一个好处是可以告诉您发生了什么变化。

\n\n

您给出的示例(其中块在文件之间共享)只有在启用了重复数据删除功能时才会发生。否则,ZFS 仍将存储块的多个副本并适当地占用该空间。即使使用重复数据删除,上述两种方法也会显示差异 \xe2\x80\x94 快照不会\xe2\x80\x99 占用零USED空间,因为\xe2\x80\x99d 需要两个文件的新元数据(两个 inode 加上指向已删除重复数据块的间接块;也许还有其他东西),并将zfs diff显示+<filename>两个新文件。

\n\n

编辑:我能想到的最后一个用户可见的检查方法是zfs send -nv在快照之间增量运行(空运行,详细)。这不会\xe2\x80\x99t 生成完整的发送流,但可能会告诉您将发送什么内容,如果两个快照相同,则应该什么也没有。

\n