在zfs上强制更新校验和?


13

最近checksum,我将非重复zfs文件系统之一的属性sha256on(fletcher4)更改为(fletcher4),以更好地支持发送重复的复制流,如该命令所示zfs send -DR -I _starting-snaphot_ _ending-snapshot_

但是,zfs联机帮助页中的内容是send -D

无论数据集的dedup属性如何,都可以使用此标志,但是如果文件系统使用具有dedup功能的校验和(例如sha256),则性能会更好。

zfs联机帮助页还说明了有关该checksum属性的信息:

更改此属性仅影响新写入的数据。

我不想信任fletcher4。折衷之处在于,与SHA256不同,fletcher4不是伪随机哈希函数,因此不能被信任不会发生冲突。因此,仅当与“ verify”选项结合使用时才适用于dedup,该选项可检测并解决哈希冲突。

如何更新文件系统的校验和,最好不对系统进行脱机?

Answers:


11

要更改已写入数据的属性(压缩,重复数据删除或校验和),zfs方法是通过zfs send | zfs receive序列运行数据。显然,您不需要为此而使系统脱机,但是您需要

  1. 您的zpool /系统上有足够的资源来容纳相关数据集的两个重复数据删除副本
  2. 数据集的停机时间,因为您可能需要销毁数据集或在过程中将其重命名
  3. 足够的时间和耐心来完成手术

由于您已经在zpool中使用了重复数据删除功能,因此zfs send | zfs receive在目标服务器与源服务器相同的池中运行目标服务器时,仅会使用新写入的元数据块所需的空间。但是要准备好花一些时间进行复制-dedup可能会非常慢,尤其是如果您没有足够的RAM将整个dedup表保存在RAM中时。

显然,您将需要停止所有写操作以创建数据集的最终权威副本,但是可以通过首先复制快照,停止所有写操作并进行增量操作(zfs send -i | zfs receive作为最后一步)来最大程度地减少停机时间。


对我来说,zfs receive更新文件系统的元数据一点也不清楚。在我看来,如果仅按原样使用元数据,它将更快。但是,由于校验和的块级而不是文件级的性质,这样做可能是不可能的。在这种情况下,zfs send | zfs receive将为解决方案奠定可接受的基础。
4104年

1
zfs发送| zfs recv将有效地更改所有元数据(压缩选择,校验和选择,dedup选择)。zfs send正在创建一个对象,然后使用zfs recv对其进行摄取,该对象将其写入几乎就像所有新数据一样。但是-我认为您可能对zfs send | recv有关重复数据删除有误解。zfs send -D尝试对流本身中的数据进行重复数据删除,而不维护来自源数据集的数据的现有重复数据删除。这就是为什么不要求recv端也已在目标数据集上启用dedup的原因。
2013年

为了进一步说明,目前尚无办法以这样的方式zfs发送重复数据删除的数据,即所有经过的操作都是重复数据删除数据和相关的重复数据删除表条目的单个副本。即使源和目标是同步的,您发送的也只是增量快照而已。如果ZFS中的数据恰好在流本身的范围之内/是不可重复删除的,则ZFS仍将发送的数据放大到最大大小。您可能具有在POOL DDT中易于重复数据删除的数据,但是作为一个小的发送对象,它是完全不可重复数据删除的。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.