我们刚刚上线。网站和服务仍在完善中,如有不准确或不完善之处,敬请谅解。发现了错误或有功能不正常? 请告诉我们,我们会尽快修复。

← 全部项目
ZH
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 和文档内容。以仓库本身为准。