强制更新zfs上的校验和?

我最近将一个非重复的zfs文件系统上的checksum属性从on (fletcher4)更改为sha256 ,以便更好地支持发送重复的复制stream,如本命令zfs send -DR -I _starting-snaphot_ _ending-snapshot_

但是,zfs手册页有关send -D说法:

无论数据集的重复数据删除属性如何,都可以使用此标志,但如果文件系统使用可执行重复数据删除的校验和(例如,sha256),则性能会更好。

zfs手册页也说明了关于checksum属性:

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

我不想相信fletcher4。 与SHA256不同的是,fletcher4不是一个伪随机散列函数,因此不会被信任而不会相互冲突。 因此,只有在与“validation”选项结合使用时才适用于重复数据删除,该选项可检测并解决散列冲突。

我怎么能更新文件系统的校验和,最好不离线系统?

要更改已写入数据的属性(无论是压缩,重复数据删除还是校验和),zfs方法是通过zfs send | zfs receive zfs send | zfs receive序列。 显然,你不需要离线系统,但你需要

  1. 足够的资源在您的zpool /系统上保存两个重复数据集的有问题的数据集
  2. 数据集的停机时间,因为您需要销毁它或在过程中重命名它
  3. 足够的时间和耐心的操作来完成

由于您已经在使用zpool的重复数据删除,运行zfs send | zfs receive zfs send | zfs receive与目标位于同一个池中的源只会使用新写入的元数据块所需的空间。 但要准备复制需要一段时间 – 重复数据删除可能非常缓慢,特别是如果您没有足够的RAM来将整个重复数据删除表保存在RAM中。

您将需要停止所有写入操作来创build数据集的最终权威副本,但是可以通过先复制快照,停止所有写入并执行增量zfs send -i | zfs receive停机时间降至最低zfs send -i | zfs receive zfs send -i | zfs receive作为最后一步。