系统极客一直在努力
专注操作系统及软件使用技能

OpenZFS 2.4.4 发布:全面支持 Linux 7.2 内核

OpenZFS

开源文件系统与卷管理器 OpenZFS 2.4.4 正式发布。新版本全面支持 Linux 7.2 内核,新增了多主机保护(MMP)异常场景下的存储池恢复工具,并修复了 DDT、L2ARC、数据接收、存储池导出和 Linux 文件 I/O 等多处问题。

OpenZFS 2.4.4 主要更新

平台兼容性扩展

  • Linux 平台兼容 4.18~7.2 版本内核,新增了对 Linux 7.2 内核的官方适配;
  • FreeBSD 平台的兼容范围保持不变,支持 FreeBSD 13.3+ 和 14.0+ 系列。

MMP 恢复工具与导入流程调整

  • 新增zhack mmp reclaim命令,用于恢复因 MMP 异常而无法继续处理的存储池;配套逻辑也有优化:区分失败的 uberblock 声明与远端主机活动,并在活动检查时跳过不可写 vdev,对存在缺失盘的降级镜像处理也更加稳妥。
  • 对于使用 systemd 的 Linux 环境,存储池导入单元对systemd-udev-settle的依赖改为可选,不再无条件等待 udev 完成设备处理再执行导入。

DDT、缓存与数据接收修复

  • 修复了 DDT(去重表)修剪时的负时间溢出和多修剪任务问题。补全了去重校验的锁保护,并更正了 DDT 日志里的引用计数标记。
  • L2ARC(二级读缓存)现在会在首次扫描时以写入指针为边界重建,块克隆后已释放块的读取问题也进行了修复。
  • 数据接收方面,修复了末尾短块的大块拆分接收异常、zfs receive -x参数行为问题,以及 DMU 接收代码中潜在的空指针解引用风险。

Linux 文件 I/O 与存储池管理改进

  • Linux 平台修复了zfs_write()处理无法故障映射缓冲区时,可能出现的无限循环;解决了通过mmap()读取超出文件末尾区域的问题;执行fallocate()扩展文件时,修改时间和状态变更时间现在会同步更新。
  • 收紧存储池导出逻辑。如果属于该存储池的 zvol 次设备仍在使用,zpool export会返回EBUSY错误,不再在无法干净导出的情况下继续操作;设备移除完成与导出之间的竞态条件也得到了修复。

权限控制与其他可靠性修复

  • 委派管理新增了send:encrypted权限,可以单独控制被委派用户是否能发送加密数据集。
  • 此外,OpenZFS 2.4.4 还修复了多处可靠性问题,包括回滚后的 POSIX ACL 缓存过期问题、恢复发送时关闭数据集句柄后的访问问题,以及分区磁盘容量变化后自动扩容的识别问题。

OpenZFS 2.4.3 主要更新

平台兼容性扩展

  • 对于 Linux 用户,OpenZFS 现在正式支持 4.18~7.0 版本内核;
  • FreeBSD 阵营完全兼容 13.3、14.0 及后续版本。

底层存储与调试工具优化

新版本对多项底层存储机制进行了修复,并增强了验证能力:

  • ZVOL 与克隆修复:针对 ZVOL 块克隆场景新增了加密密钥验证机制;修复了移除日志 vdev 时的故障;还解决了 DDT(重复数据删除表)修剪后,克隆块可能引发的「双重释放」问题。
  • 调试工具升级:优化了 ZFS 调试工具zdb,在遍历数据块时,可有效检测 BRT(块引用表)和 DDT 泄漏。

压缩与数据校验规则收紧

对数据压缩与校验的要求更加严格:

  • 压缩合法性验证:对 lz4、gzip、zstd 三种压缩算法强制增加解压长度校验,进一步提升压缩数据可靠性。
  • 字段边界检查:新增了对打包的nvlists中尺寸字段和字符串的校验逻辑,可拦截未闭合的字符串。

Linux 和 FreeBSD 专属优化

针对 Linux 系统的底层调用与锁机制,进行了以下改进:

  • 修复读写挂载选项以及直接处理source挂载选项时的逻辑异常;
  • 解决了传统fallocate调用中过期的 znode 验证问题,以及多处锁机制相关故障;
  • 优化了对 Linux 5.6 内核fs_parse API 的兼容性,并修复了 aarch64 架构下的编译错误。

FreeBSD 专属更新:

  • 支持通过 Sanitizers(动态代码检测工具)编译openzfs.ko内核模块,修复了部分会引发内核崩溃、缓存处理异常的问题。

缓存与快照修复

  • L2ARC 识别增强:现在即便是空的 L2ARC(二级自适应替换缓存)设备,zarcstat工具也能正确检测到挂载状态。
  • NFS 与快照管理:修复了卸载快照时,意外刷新无关 NFS 导出目录的问题;并修正了PREVIOUSLY_REDACTED处理程序中,可能丢弃最后一个数据块的 Bug。

OpenZFS 2.4.2 主要更新

核心系统与内核兼容性

新版本扩大了操作系统的支持范围,现已稳定兼容 Linux 4.18 到 7.0 内核,以及 FreeBSD 13.3 和 14.0+ 版本。

针对较新的 Linux 运行环境,开发团队优化了多项底层 API 和处理程序:

  • 优化基于fs_context的挂载 API 与挂载选项处理逻辑;
  • 改进租约处理程序(Lease handler);
  • 更新 ACL(访问控制列表)相关的内核机制与块队列 API。

存储可靠性与 dRAID 修复

修复了多项存储可靠性问题,特别针对 dRAID(分布式 RAID)架构进行了重点优化:

  • 校验和问题修复:解决了阵列重建后偶发的校验和错误,以及磁盘降级状态下 dRAID 的校验失败问题;
  • 数据防损坏:修复 dRAID 配置下清理磁盘后,可能引起的数据损坏隐患;
  • 死锁与导入失败:修复vdev_rebuild()函数中的死锁问题,解决 dRAID 存储池换盘后可能出现的导入失败故障。

快照、挂载与数据完整性改进

重新梳理快照与文件系统挂载的实现机制,修复了多项漏洞与内存泄漏问题:

  • 解决了执行块克隆(Block cloning)后再进行截断操作时,可能发生的读取损坏问题;
  • 修复并发执行zfs recv操作期间,引发的快照自动挂载死锁;
  • 清除zfsctl_snapshot_mount运行时的挂载选项内存泄漏;
  • 修复文件系统已被卸载时,zfsvfs_hold()函数中抛出的s_active泄漏异常。

其他关键更新与增强

除以上核心修复外,OpenZFS 2.4.2 还带来了以下功能补充与系统级优化:

  • 新增对POSIX_FADV_DONTNEED的支持,并优化该指令在单块文件(Single-block file)上的处理效率;
  • 清理并优化分配类(Allocation class)的选择机制;
  • 修复多处内存泄漏问题,增强整体构建系统;
  • 扩展 CI(持续集成)测试覆盖率,全面纳入更新版本的 Fedora 和 FreeBSD。

OpenZFS 2.4.1 主要更新

内核兼容性与构建修复

本次更新重点解决了 Linux 6.19 内核的一系列兼容性问题。现在,OpenZFS 对 Linux 内核的支持范围覆盖了「从 4.18 至 6.19」,同时还无缝兼容 FreeBSD 13.3 和 14.x 系列:

  • 修复了内核树内构建(in-tree builds)的问题;
  • 解决了 GCM 汇编函数的重复定义冲突;
  • 优化了索引节点(inode)的状态处理逻辑;
  • 针对--werror编译选项,实施了更严格的配置检查。

此外,开发团队还为 PowerPC 和 RISC-V 架构下运行 Linux 6.18 内核时出现的构建失败问题,提供了针对性补丁,增强了跨平台稳定性。

核心功能修复

在功能稳定性方面,有几个关键问题得到了修复:

  • 空间统计修正:修复了特殊虚拟设备(vdevs)和去重 vdevs 在可用空间计算上的偏差,存储容量显示更加准确。
  • 发送权限逻辑:修正了执行zfs send -w -I(原始增量发送)时的权限处理逻辑。
  • 接收处理优化:改进了数据接收过程中,大块(large block)特性激活的处理机制,并修复了large_microzap激活相关的隐患。
  • 日志记录:修正了zpool create -t命令的历史日志记录问题。

并行度与锁机制性能调优

针对性能敏感型用户,OpenZFS 2.4.1 带来了一系列改进:

  • ARC 缓存效率:提高了 ARC(自适应替换缓存)驱逐批处理的并行度,在高负载下能大幅减少内存回收延迟。
  • 预取增强:增强了 dbuf 的预取缓存机制,进一步提升读取性能。
  • 维护操作加速:缩短了数据擦除(Scrub)和数据重建(Resilver)所需的最小时间,同时优化了异步销毁(async destroy)的处理时序。

在去重方面,开发团队对 DDT(去重表)进行了细粒度优化:

  • 引入并应用了_by_dnode() ZAP 接口;
  • 改进了锁机制和接口调用;
  • 修复了压缩条目缓冲区的大小问题;
  • 将日志搜索操作移出了锁保护范围,有效降低了高并发下的锁争用。

运维工具箱升级

面向系统管理员,带来了命令行工具的细节改进:

  • zdb:新增-O选项(配合-r使用),允许用户指定对象 ID 进行调试。
  • zfs clone:引入-u参数,允许在克隆数据集时不自动挂载,为脚本化操作带来更多灵活性。
  • zhack:增加了action idle子命令,并为调试缓冲区转储添加了-G选项。

同时,ZFS 测试套件(ZTS)也进行了多项回归测试的更新与修正,确保了新特性的可靠性。

底层系统适配与代码清理

针对不同操作系统的底层特性,新版本进行了深度适配:

  • FreeBSD:修复了线程不安全的调试代码导致的「双重释放」内核恐慌(panic);移除了对过时的DEBUG_VFS_LOCKS的引用;恢复了 i386 架构的编译支持,并修正--enable-invariants构建选项。
  • Linux:在kmem模块中精细化了内存分配标志,并通过 SPL 清理工作移除了过时或不安全的代码路径。

最后,本次更新还对大量 Shell 脚本进行了规范化处理,包括:移除许多 Bash 特有语法、提升可移植性、改进 Shellcheck 合规性,以及增强变量作用域的安全性。初始化 ramdisk(initrd)配置和文件系统挂载的相关文档也得到了进一步澄清与完善。


OpenZFS 2.4 主要更新

核心亮点与内核支持

此次更新支持从 Linux 4.18 到最新的 Linux 6.18 LTS 内核,并引入了多项核心改进:

  • 配额管理升级:支持为用户(User)、组(Group)及项目(Project)设置默认配额,权限管理更加灵活细致。
  • IO 机制优化:当遇到非对齐写入时,Direct IO 会自动回退至轻量级的「非缓存 IO」(Uncached IO)模式,有效提升处理效率。
  • 碎片整理:引入了全新算法,旨在有效降低 vdev(虚拟设备)的碎片化程度。

性能调优与功能扩展

  • 为挖掘性能潜力,OpenZFS 2.4 利用了 AVX2 指令集加速 AES-GCM 算法,显著提升了加密性能。
  • 针对special_small_blocks功能也进行了扩展,现在不仅支持将 ZVOL 写入落地到 Special vdevs 上,还允许使用非 2 的幂次方数值,配置起来更加自由。
  • 此外,新增的zfs rewrite -P命令能够在重写数据时,尽可能保留逻辑创建时间 (Logical Birth Time),从而最小化增量数据流的大小——这对备份场景是一大利好。

更多实用特性

  • ZIL 增强:在条件允许的情况下,支持将 ZIL(ZFS Intent Log)放置在 Special vdevs 上,进一步优化写入路径。
  • 全量运维操作:新增-a|--all选项,支持一键对所有已导入的存储池(Pool)执行 Scrub(校验)、Trim(修剪)或初始化操作。
  • 精准校验:新增zpool scrub -S -E命令,允许运维人员针对特定时间范围进行数据校验,大幅提升维护效率。
  • 去重与拓扑:引入了新的去重(Dedup)优化与修复,并支持对 Special/Dedup vdevs 设置拓扑限制。

其他改进与系统生态

OpenZFS 2.4 还包含了多项针对 Gang blocks 的改进与修复。在 BSD 生态方面,支持 FreeBSD 13.3+ 及 14.0+ 版本。要了解完整的变更细节,可以到 GitHub 项目主页查看发布说明和下载源码。

赞(0)
分享到

评论 抢沙发