校验和及其在 ZFS 中的应用

端到端校验和是 ZFS 的一个关键特性,也是 ZFS 区别于其他 RAID 实现和文件系统的重要特点。端到端校验和的优势包括:

  • 在从介质读取数据时检测数据损坏

  • 如果可能,检测到损坏的块会自动修复,通过适当配置的池中的 RAID 保护或冗余副本(参见 zfs 的 copies 属性)

  • 定期擦洗可以检查数据,以检测和修复潜在的介质退化(位腐烂)和其他来源的损坏

  • ZFS 复制流(zfs sendzfs receive)上的校验和确保接收的数据不会被中间存储或传输机制损坏

校验和算法

ZFS 中的校验和算法可以针对数据集(文件系统或卷)进行更改。每个块使用的校验和算法存储在块指针(元数据)中。块的校验和在写入块时计算,因此更改算法仅影响更改后发生的写入操作。

可以通过设置 checksum 属性来更改数据集的校验和算法:

zfs set checksum=sha256 池名/数据集名

校验和

适用于去重 和 nopwrite?

与其他 ZFS 实现兼容?

备注

on

参见备注

onfletcher4 的简写 用于非去重数据集, 以及 sha256 用于 去重数据集

off

不要使用 off

fletcher2

已弃用的 Fletcher 校验和实现,请使用 fletcher4 代替

fletcher4

Fletcher 算法, 也用于 zfs send

sha256

去重数据集的 默认算法

noparity

不要使用 noparity

sha512

需要池特性 org.illumos:sha512

加盐的 sha512, 目前不支持任何 启动池上的文件系统

skein

需要池特性 org.illumos:skein

加盐的 skein, 目前不支持任何 启动池上的文件系统

edonr

参见备注

需要池特性 org.illumos:edonr

加盐的 edonr, 目前不支持任何 启动池上的文件系统

出于谨慎考虑,Edon-R 在与去重一起使用时需要 验证,因此它将自动使用 verify

blake3

需要池特性 org.openzfs:blake3

加盐的 blake3, 目前不支持任何 启动池上的文件系统

校验和加速器

ZFS 能够将校验和操作卸载到 Intel QuickAssist Technology (QAT) 适配器上。

校验和微基准测试

某些 ZFS 功能在加载 zfs.ko 内核模块时使用微基准测试来确定校验和的最佳算法。微基准测试的结果可以在 /proc/spl/kstat/zfs 目录中观察到。获胜的算法被报告为“最快的”,并成为默认算法。可以通过设置 zfs 模块参数来覆盖默认值。

校验和

结果文件名

zfs 模块参数

Fletcher4

/proc/spl/kstat/zfs/fletcher_4_bench

zfs_fletcher_4_impl

all-other

/proc/spl/kstat/zfs/chksum_bench

zfs_blake3_impl, zfs_sha256_impl, zfs_sha512_impl

禁用校验和

虽然禁用校验和可能会提高 CPU 性能,但 ZFS 社区普遍认为这是一个极其糟糕的想法。不要禁用校验和。