TAKT 之外
zfs
OpenZFS 的一个分支。其默认分支与上游 master 保持一致;项目自身的工作位于单独的分支中:原地重塑 RAIDZ 的原型,以及向上游提出该方案的材料。
- OpenZFS
- RAIDZ
- C
- 状态
- 用仓库自己的话说,这是一个经过验证的原型,而非完成的功能:尚不能用于生产,磁盘格式尚未定稿。已通过设备丢失矩阵、崩溃切点、KASAN 和长时间压力测试;大容量存储池的规模测试和完整的 ZTS 运行仍未完成。
- 许可证
- CDDL,与上游 OpenZFS 相同;例外情况在各源文件中注明。
- 平台
- Linux;在 Ubuntu QEMU/KVM 实验虚拟机中,基于 zfs-2.4.4 和当前 master 的构建上测试。
解决什么问题
对于承载运行中的虚拟机和容器的存储池,如今要更改 RAIDZ 冗余级别或移除一块磁盘,就需要一个维护窗口:迁移客户机、导出存储池、重建,再把一切恢复。OpenZFS 2.3 中的 RAIDZ 扩展只增加了在线扩宽。这项工作的目标是原地更改在线存储池的几何结构,只使用存储池自身的可用空间,并保留快照和克隆。
主要功能
zpool reparity原地提高或降低 RAIDZ 校验级别(raidz1 ↔ raidz2 ↔ raidz3);使用--online时数据集保持挂载,--async、--status和--cancel可在后台运行并管理该操作。- 每个 vdev 一张布局纪元(layout epoch)表,由一个新的特性标志控制(暂定名
com.openzfs:raidz_parity_epochs):每个块都按其写入时的几何结构读取和重建。 - 失败即关闭(fail-closed)的提交:只有在普查确认没有任何块仍处于旧校验级别后,新的校验级别才会生效;否则扫描会继续进行,崩溃后同样如此。
- 离线的
zhack工具:从 RAIDZ vdev 中移除一块磁盘(N → N−1)、在有快照和克隆的情况下重塑、对现有数据重新计算校验和并重新压缩;后两项为实验性功能。 - 新命令的 ZTS 功能测试和 man 手册页;一份 RFC 以及为上游评审准备的一组堆叠分支。
工作原理
每个顶层 RAIDZ vdev 都有一张仅追加的小表,记录 {start_txg, width, parity},其结构与现有的 RAIDZ 扩展记录相同。块的几何结构由其诞生 txg 决定,因此新旧块可以共存。一个有界、可在崩溃后恢复的扫描通过普通的写时复制重写现有块。RAIDZ 行编码、块指针格式和 ashift 都不变。
zpool reparity [--online | --async | --status | --cancel] [--target N] pool
要求
- 包含 RAIDZ vdev 的存储池。该特性标志为不兼容类型,在第一次重塑时激活。
- 与 OpenZFS 一样从源码构建。分支
ozfs-pr/1-parity-epochs-recon、ozfs-pr/2-reparity-command和ozfs-pr/3-reshape-toolkit基于 master,feat/raidz-*基于 zfs-2.4.4。 - 移除磁盘和离线
zhack工具需要先导出存储池。
本页概述了截至 2026 年 10 月该仓库的 README 和文档内容。以仓库本身为准。