FreeBSD 中文社区 2025 第二季度问卷调查
FreeBSD 中文社区(CFC)
VitePress 镜像站QQ 群 787969044视频教程Ⅰ视频教程Ⅱ
  • FreeBSD 从入门到追忆
  • 中文期刊
  • 状态报告
  • 发行说明
  • 手册
  • 网络文章集锦
  • 笔记本支持报告
  • Port 开发者手册
  • 架构手册
  • 开发者手册
  • 中文 man 手册
  • 文章
  • 书籍
  • FreeBSD 中文期刊
  • 编辑日志
  • 2025-123 下游项目
    • FreeBSD 发布工程:新主管上任
    • GhostBSD:从易用到挣扎与重生
    • BSD Now 与将来
    • 字符设备驱动教程(第三部分)
    • 学会走路——连接 GPIO 系统
    • FreeBSD 中对 SYN 段的处理
    • FreeBSD 2024 年秋季峰会
  • 2024-1112 虚拟化
    • 字符设备驱动程序教程(第二部分)
    • 面向 Linux 和 Windows 用户的 bhyve
    • Xen 与 FreeBSD
    • Wifibox:一种嵌入式虚拟化无线路由器
    • 嵌入式 FreeBSD:Fabric——起步阶段
    • DGP:一种新的数据包控制方法
    • 会议报告:我在都柏林的 EuroBSDCon 体验
  • 2024-0910 内核开发
    • 字符设备驱动程序教程
    • VPP 移植到了 FreeBSD:基础用法
    • 利用 Kyua 的 Jail 功能提升 FreeBSD 测试套件的并行效率
    • FreeBSD 上的 Valgrind
    • 嵌入式 FreeBSD:探索 bhyve
    • TCP/IP 历险记:FreeBSD TCP 协议栈中的 Pacing
    • 实用软件:实现无纸化(Paperless)
  • 2024-0708 存储与文件系统
    • FreeBSD 中的 NVMe-oF
    • FreeBSD iSCSI 入门
    • 使用 ZFS 原生加密保护数据
    • 嵌入式 FreeBSD:打造自己的镜像
    • TCP LRO 简介
    • 基于 Samba 的时间机器备份
  • 2024-0506 配置管理对决
    • 基本系统中的 mfsBSD
    • rdist
    • Hashicorp Vault
    • 在 GitHub 上向 FreeBSD 提交 PR
    • 悼念 Mike Karels
    • 2024 年 5-6 月来信
    • 嵌入式 FreeBSD 面包板
    • TCP/IP 历险记:TCP BBLog
    • 实用软件:开发定制 Ansible 模块
  • 2024-0304 开发工作流与集成
    • FreeBSD 内核开发工作流程
    • FreeBSD 与 KDE 持续集成(CI)
    • 更现代的内核调试工具
    • 从零开始的 ZFS 镜像及 makefs -t zfs
    • 提升 Git 使用体验
  • 2024-0102 网络(十周年)
    • FreeBSD 中的 RACK 栈和替代 TCP 栈
    • FreeBSD 14 中有关 TCP 的更新
    • if_ovpn 还是 OpenVPN
    • SR-IOV 已成为 FreeBSD 的重要功能
    • FreeBSD 接口 API(IfAPI)
    • BATMAN:更优的可移动热点网络方式
    • 配置自己的 VPN——基于 FreeBSD、Wireguard、IPv6 和广告拦截
    • 实用软件:使用 Zabbix 监控主机
  • 2023-1112 FreeBSD 14.0
    • LinuxBoot:从 Linux 启动 FreeBSD
    • FreeBSD 容器镜像
    • 现在用 Webhook 触发我
    • 新的 Ports 提交者:oel Bodenmann (jbo@freebsd.org)
  • 2023-0910 Port 与软件包
    • 回忆录:与 Warner Losh(@imp)的访谈
    • 在你自己的仓库中定制 Poudriere 源
    • Wazuh 和 MITRE Caldera 在 FreeBSD Jail 中的使用
    • PEP 517
    • CCCamp 2023 旅行报告
  • 2023-0708 容器与云
    • 在 Firecracker 上的 FreeBSD
    • 使用 pot 和 nomad 管理 Jail
    • 会议报告:C 与 BSD 正如拉丁语与我们——一位神学家的旅程
    • 抒怀之旅:与 Doug Rabson 的访谈
    • 基于 Jail 的广告拦截教程
    • 我们收到的来信
  • 2023-0506 FreeBSD 三十周年纪念特刊
    • CheriBSD 近十多年的历程
    • AArch64:成为 FreeBSD 新的一级架构
    • 岁月如梭:我个人的时间线
    • 安装 FreeBSD 1.0:回顾 30 年前
    • ZFS 是如何进入 FreeBSD 的呢?
    • 我不是来自约克郡的,我保证!
    • 回忆录:采访 David Greenman Lawrence
    • FreeBSD 和早期的 Unix 社区
    • 早期的 FreeBSD 移植
    • FreeBSD 30 周年:成功的秘诀
    • FreeBSD 在日本:回忆之旅与今日之实
  • 2023-0304 嵌入式
    • CheriBSD port 和软件包
    • 让我们来试试 ChatGPT
    • GPU 直通
  • 2023-0102 构建 FreEBSD Web 服务器
    • ZFS 的原子 I/O 与 PostgreSQL
    • 虚拟实验室——BSD 编程研讨会
    • ZFS 简介
    • 会议报告:落基山庆祝女性计算机科学家
    • 进行中的工作/征求反馈:数据包批处理
    • 基金会与 FreeBSD 桌面
  • 2022-1112 可观测性和衡量标准
    • 在 FreeBSD 的 DDB 内核调试器中编写自定义命令
    • DTrace:老式跟踪系统的新扩展
    • 基于证书的 Icinga 监控
    • 活动监控脚本(activitymonitor.sh)
    • 实用 IPv6(第四部分)
    • EuroBSDCon 会议报道
    • 实用 Port:Prometheus 的安装与配置
    • 书评:《用火解决问题:管理老化的计算机系统(并为现代系统保驾护航)》Kill It with Fire: Manage Aging Computer Systems (and Future Proof Modern Ones)
  • 2022-0910 安全性
    • CARP 简介
    • 重构内核加密服务框架
    • PAM 小窍门
    • SSH 小窍门
    • 实用 IPv6(第三部分)
    • 书评:Understanding Software Dynamics(深入理解软件性能——一种动态视角)—— Richard L. Sites 著
    • 访谈:保障 FreeBSD 安全性
    • MCH 2022 会议报告
  • 2022-0708 科研、系统与 FreeBSD
    • 在 FreeBSD 上构建 Loom 框架
    • 教授本科生 Unix 课程
    • FreeBSD 入门研讨会
    • 实用 IPv6(第二部分)
    • 在 2022 年及以后推广 FreeBSD
    • 进行中的工作/征求反馈:Socket 缓冲区
    • FreeBSD 开发者峰会报告
    • 支持 Electromagnetic Field 2022
  • 2022-0506 灾难恢复
    • 使用 FreeBSD 构建高弹性的私有云
    • LLDB 14 —— FreeBSD 新调试器
    • 实用 IPv6(第一部分)
    • 利用 netdump(4) 进行事后内核调试
    • 进行中的工作/征求反馈:FreeBSD 启动性能
    • 实用 Port:在 OpenZFS 上设置 NFSv4 文件服务器
  • 2022-0304 ARM64 是一级架构
    • FreeBSD/ARM64 上的数据科学
    • Pinebook Pro 上的 FreeBSD
    • 嵌入式控制器的 ACPI 支持
    • 进行中的工作/征求反馈:Lumina 桌面征集开发人员
    • 实用 Port:如何设置 Apple 时间机器
  • 2022-0102 软件与系统管理
    • 为 FreeBSD Ports 做贡献
    • 使用 Git 贡献到 FreeBSD Ports
    • CBSD:第一部分——生产环境
    • 将 OpenBSD 的 pf syncookie 代码移植到 FreeBSD 的 pf
    • 进行中的工作/征求反馈:mkjail
    • 《编程智慧:编程鬼才的经验和思考》(The Kollected Kode Vicious)书评
    • 会议报告:EuroBSDCon 2021 我的第一次 EuroBSDCon:一位新组织者的视角
  • 2021-1112 存储
    • 开放通道 SSD
    • 构建 FreeBSD 社区
    • 与完美操作系统同行 27 年
    • 进行中的工作/征求反馈:OccamBSD
    • 通过 iSCSI 导入 ZFS ZIL——不要在工作中这样做——就像我做的那样
  • 2021-0910 FreeBSD 开发
    • FreeBSD 代码审查与 git-arc
    • 如何为 FreeBSD 实现简单的 USB 驱动程序
    • 内核开发技巧
    • 程序员编程杂谈
  • 2021-0708 桌面/无线网
    • 通往 FreeBSD 桌面的直线路径
    • FreeBSD 13 中的人机接口设备 (HID) 支持
    • Panfrost 驱动程序
    • 用 Git 更新 FreeBSD
    • FreeBSD 的新面孔
    • 想给你的桌面加点佐料?
  • 2021-0506 安全
    • 七种提升新安装 FreeBSD 安全性的方法
    • copyinout 框架
    • 使用 TLS 改善 NFS 安全性
    • Capsicum 案例研究:Got
    • 对 Jail 进行安全扫描
  • 2021-0304 FreeBSD 13.0
    • 展望未来
    • FreeBSD 13.0 工具链
    • FreeBSD 13.0 中有新加载器吗?
    • TCP Cubic 准备起飞
    • OpenZFS 中的 Zstandard 压缩
    • 会议报告:FreeBSD 供应商峰会
    • Git 不够吗?
  • 2021-0102 案例研究
    • Tarsnap 的 FreeBSD 集群
    • BALLY WULFF
    • Netflix Open Connect
    • FreeBSD 的新面孔
    • 写作学者的 FreeBSD
    • 在世界之巅
  • 2020-1112 工作流/持续集成(CI)
    • FreeBSD Git 快速入门
    • 使用 syzkaller 进行内核 Fuzzing
    • Mastering Vim Quickly 书评
    • 线上会议实用技巧
    • 在控制台上进行网络监控
  • 2020-0910 贡献与入门
    • 采访:Warner Losh,第 2 部分
    • 代码审查
    • 撰写良好的提交消息
    • 如何在不是程序员的情况下做出贡献——成为 FreeBSD 译者
    • 如何成为文档提交者
    • 谷歌编程之夏
    • 为 FreeBSD 期刊撰写文章
    • 你为什么使用 FreeBSD
    • FreeBSD 的新面孔
  • 2020-0708 基准测试/调优
    • FreeBSD Friday
    • 采访:Warner Losh,第 1 部分
    • 构建和运行开源社区
    • 在 FreeBSD 上轻松搭建我的世界(Minecraft)服务器
    • FreeBSD 的新面孔
  • 2020-0506 网络性能
    • 内核中的 TLS 卸载
    • 访谈:Michael W Lucas
    • FreeBSD 桌面发行版
    • 使用 Poudriere 进行 Port 批量管理
    • FreeBSD 的新面孔
由 GitBook 提供支持
LogoLogo

FreeBSD 中文社区(CFC) 2025

在本页
在GitHub上编辑
导出为 PDF
  1. 2023-0506 FreeBSD 三十周年纪念特刊

ZFS 是如何进入 FreeBSD 的呢?

上一页安装 FreeBSD 1.0:回顾 30 年前下一页我不是来自约克郡的,我保证!

最后更新于1个月前

  • 原文:

  • 作者:PAWEL DAWIDEK

  • 译者:ykla【】为译者注

ZFS 文件系统进入 FreeBSD 操作系统的故事是一段对编程的热情、对技术的热爱,以及是一个引导我做出最有价值贡献于 FreeBSD 项目的旅程。那是在 2005 年的夏天。虽然我不太擅长记日期,但我还记得我第一次接触 ZFS 的情境:当时我和朋友们在波兰的马祖里地区,这里有 2000 多个美丽的湖泊。我的其中一位朋友当时在波兰的一个电信公司工作,他们使用了大量来自 Sun Microsystems 的硬件和 Solaris 操作系统。他带来了一份 Sun 发来的通知的打印副本,其中描述了一个新的文件系统,它经过了一段时间的开发,即将作为 OpenSolaris 的一部分发布。但在继续讲述这个故事之前,让我们回到过去,来了解一些背景信息...

我对编程一见钟情。那时我 12 岁,我的表亲向我介绍了 C-64 上的 BASIC 编程语言。

爱情初见!

我对编程一见钟情。那时我 12 岁,我的表弟 Tomek 向我介绍了 C-64 上的 BASIC 编程语言。我被迷住了。我感觉自己像一个年轻的上帝:你拿起这个无生命的硬件,创建一个程序,然后看着它活了起来!这太酷了;我无法想象还有什么比这更棒的事情了。因此,我从未对电子游戏感兴趣。那时,我在波兰一个小镇长大,并不容易找到对编程感兴趣的人,所以我基本上是独自一人(除非是在测试 Tomek 的耐心极限)。

当我转向 Amiga 500【即 Amiga 家用电脑的第一款低端版本】后,我终于找到了一些来自演示场景的朋友,我们通过邮件用 3.5 英寸软盘交换我的作品。等待并不是一件好事,但我没有抱怨。当我的下一台计算机——Amiga 1200 开始显得老旧时,很明显是时候继续前进了。我知道微软的 Windows 不适合我。我尝试过 Linux,但还不是很满意。最后,一个朋友向我介绍了 FreeBSD。他的安装非常简单,我再也不能要求比这更好的体验了。哈!如果你对最后一句话没有感到不安,那么显然你还没有享受过使用 sysinstall【现在为 bsdinstall】的“乐趣”。不,安装并不是一件轻松的事情——我尝试了多次才终于享受到了我的第一个 FreeBSD 系统。我认为 sysinstall 一定就像海军海豹突击队的地狱周那样,让强者从弱者中分离出来,使真正的黑客在那里锻造!而我成功了!我设定了下一个目标和梦想,不仅要成为一个能够安装 FreeBSD 的黑客,还要成为一个内核黑客和 FreeBSD 的贡献者。

在 2003 年,我正式加入 FreeBSD 项目,成为了 src 提交者,实现了自己的目标。是的,我为此举办了派对来庆祝。自从我加入以来,我在系统的许多领域工作过,但主要是与 GEOM 框架相关。在 FreeBSD 中,GEOM 框架位于磁盘驱动程序和文件系统之间,允许插件实现各种转换,比如镜像、RAID、块级加密等。我真的很喜欢 GEOM 的设计,并且喜欢与之一起工作,所以我在存储栈的至少这一部分有相当的经验。至于文件系统,我知道必须远离 VFS,因为它是内核中最复杂的部分之一。

可悲的是,UFS 自 FreeBSD 成立以来就一直是默认文件系统。实际上,UFS 比 FreeBSD 本身还要古老。UFS2 在 FreeBSD 5.0 中被引入,解决了 UFS1 的一些问题,但仍然存在一些重要的问题没有解决。主要问题是在系统崩溃或停电后进行 fsck 所需的时间。随着磁盘越来越大,fsck 可能需要花费几个小时才能完成。解决这个问题的方法显而易见——我们需要将日志记录添加到 UFS 中,或者将其他带有日志记录功能的文件系统移植到 FreeBSD。说起来容易做起来难。在 Linux 中,有很多文件系统可供选择,很多人试图将它们移植到 FreeBSD,但出于某种奇怪的原因,这些移植从未完成,因此我们最终得到了没有日志记录功能的 extfs,只读的 ReiserFS 和只读的 XFS。甚至还有一个来自 Mac OS X 的可读写的 HFS+ 移植,但是,当然,没有日志记录功能,并且我还记得至少有一次试图给 UFS 添加日志记录的失败尝试。这是怎么回事?UNIX 之神是否背弃了我们?

让我们回到我在马祖里亚的度假时刻。我的朋友开始阅读 ZFS 的公告,而我的眼睛和嘴巴越张越大:池化存储——你可以创建任意多的文件系统,它们将共享可用空间。无限快照,创建起来不费时间。无限克隆。内建压缩。端到端数据验证。自动修复受损数据。事务性写时复制模型——始终保持一致——永远不需要进行 fsck(文件系统检查)。这是怎么回事?这怎么可能?这不仅仅是改进,而是文件系统的彻底革命。我记得我曾梦想过这个完美的结合:最好的文件系统运行在最好的操作系统上……那将会是多么令人惊奇啊?

几个月后,ZFS 正式发布了,它不仅在开源社区中引起轰动,而且在整个存储行业都掀起了风暴。有些人讨厌它,大多数人喜欢它,还有一些人害怕它,但没有人忽视它。有人称它为文件系统的终极之选,有人称它为狂热的分层违规【"狂热的分层违规"是对 ZFS 的一种负面评价,意指在设计中使用了过多的分层或复杂的架构。通常情况下,过多的分层和复杂的设计会增加代码的复杂性和难以理解性,可能导致维护和调试变得困难。在软件开发中,应该尽量保持简洁和清晰的设计,避免过多的分层和复杂性,以提高代码的可维护性和可读性。】。然而,它从未被称为又一个普通的文件系统。几乎每个操作系统都想要 ZFS:Linux 用户空间 port 在 FUSE 下启动,DragonFlyBSD【该系统至今仍未支持 ZFS】宣布即将移植 ZFS,而苹果也开始将 ZFS 移植到 Mac OS X。ZFS 很快将无处不在,只是不在我们所钟爱的 FreeBSD 中...

为了撰写这篇文章,我不得不分析很多当时的 IRC 日志。让我印象最深的是关于 ZFS 本身有多少怀疑态度:太复杂了,层次太多了,只是个样子货,设计缺陷很快就会被发现,等着瞧第一个灾难故事的发生吧,它永远不会被移植到社区开发的操作系统,这只是炒作,太可笑了。我想人们习惯了一个道理,如果某事看起来太美好了,往往就是真的太美好了【即太好的东西常常是假的】。幸运的是,爱是盲目的,我当时并没有注意到这一点。

在 ZFS 发布后等待了 10 个月,我却没有看到有人开始工作,于是我想我不妨一试。虽然我对 VFS 层几乎一无所知,很可能很快就会失败,但谁能阻止我尝试呢?至少,我能学到一些新东西。我的移植工作始于 2006 年 8 月 12 日。为了不让人们抱太高的希望,我创建的 perforce【软件存储库】分支的描述是“This is not a ZFS port!”(这不是 ZFS 的移植!)。我最初的估计是用六个月的时间完成一个只读的原型。

我必须承认,虽然 ZFS 不是我创建的,但在 ZFS 上的工作是我职业生涯中最吸引人的项目。我喜欢努力工作,我喜欢工作到很晚。我喜欢全神贯注于项目,而且我有幸参与了许多令人惊叹的项目。多年来,我是 FreeBSD 中最有成效的提交者之一,同时还在发展自己的业务。但没有其他项目能让我连续工作 48 个小时,几乎没有休息,只在这 48 个小时之间短暂地打个盹。我现在告诉你的事情听起来可能对我来说都有些不可思议,但它确实发生过,我向你保证 :)

在处理大型项目时,我仍然希望尽快运行某些内容,然后逐步实现缺失的部分。第一步是移植用户空间组件,如 libzpool、ztest 和 zdb。这基本上还好。下一个挑战是编译和加载 ZFS 内核模块。当你尝试加载一个带有缺失符号的内核模块时,FreeBSD 内核链接器会报告第一个缺失的符号并返回错误。我有太多的缺失符号,以至于我不得不修改链接器以一次报告它们所有的错误。对它们的逐个修复花费了太多时间。五天后,我第一次加载了 zfs.ko。理论上,FreeBSD 内核和 ZFS 代码之间有四个主要的接触点:

  1. 在堆栈的底部,我们需要教会 ZFS 如何与 FreeBSD 的块设备通信,这意味着将 ZFS 连接到 GEOM(在 GEOM 术语中是创建一个仅消费的 GEOM 类)。由于我对 GEOM 有经验,这个部分很简单。

  2. 在堆栈的顶部,我们需要将 ZFS 连接到 FreeBSD 的 VFS,因此需要移植 ZPL 层。

  3. 同样,在堆栈的顶部,ZFS 存储可以通过 ZVOL 访问,因为 ZVOLs 是块设备,所以这还涉及到 GEOM,但这次是提供者 -only 的 GEOM 类。

  4. 最后一个组件是 /dev/zfs 设备,它由用户空间的 ZFS 工具(zfs(8) 和 zpool(8))与 ZFS 内核模块进行通信。

将 ZPL 层移植并将 ZFS 连接到 FreeBSD 的 VFS 当然是最困难的部分。在 FreeBSD 上的第一次内核挂载发生在 2006 年 8 月 19 日,也就是一个星期后。经过十昼夜的工作,我已经准备好了一个读写原型。我可以创建池、创建文件系统并挂载它们,创建行为非常稳定的 ZVOL,创建文件和目录,列出它们,以及更改权限和所有权。我最初估计的六个月的只读原型时间表明,“有点”偏离了。尽管还有大量工作要做,但来自社区的鼓励给了我继续和完成项目所需的动力。在 2007 年,ZFS 在 FreeBSD 7.0 中以实验状态正式发布,在 FreeBSD 8.0(2009 年)中宣布为生产就绪状态。

在我工作之前宣布的其他移植都没有实现,所以我猜要打破诅咒,你只需要努力工作足够就行 :)

老实说,如果不是 ZFS 的创建者在早期阶段做出的一个非常重要的决定,要在十天内实现一个工作的读写原型是不可能的。他们希望大部分代码能够在用户空间中编译,以便轻松进行测试和调试。这对我的移植工作是巨大的帮助,因为大部分代码已经非常易于移植。

当我参与大型项目时,我仍然喜欢尽快拥有可以运行的东西,然后逐步实现缺失的部分。

这是一段令人惊叹的旅程,我希望每位软件开发者都能有类似的经历。在撰写这篇文章时,我想要感谢一些人。首先,我想感谢 Jeff Bonwick、Matt Ahrens 以及 Sun 的整个 ZFS 团队,感谢他们创造了这一革命性的技术,并始终支持我的工作。还要感谢 Alexander Kabaev,在 VFS 方面给予我的所有耐心和帮助。感谢 Robert Watson,是他鼓励了我,并一直是我仰望的榜样。感谢 Kris Kennaway,作为无情的早期测试人员,我们不是无缘无故地称他为 BugMagnet。感谢 Martin Matuska,他在时机成熟时接手并负责 ZFS 的维护。最后但同样重要的是,我要感谢整个 FreeBSD 社区——没有什么比感受到自己的工作得到认可并提供真正价值的更令人满足的事情。

自 ZFS 最初发布以来的 20 年里发生了很多事情:NetApp 对 Sun 发起了法律战,Apple 终止了 ZFS 移植,许可证问题阻止了 ZFS 成为 Linux 内核的本地组件,Sun Microsystems 不再存在,新的管理者停止了 ZFS 的开发。然而,这一伟大的技术仍然存在,项目在 OpenZFS 旗帜下继续进行。愿 OpenZFS 永存!愿 FreeBSD 永存!


PAWEL DAWIDEK 是 Fudo Security 的联合创始人兼首席技术官,这是一家专注于构建安全远程访问产品的安全供应商。他还参与了 FreeBSD 操作系统的开发,在安全和存储相关的项目上工作,比如 GELI 磁盘加密、Capsicum 能力和沙箱框架、jail 容器、ZFS 和各种 GEOM 类。Pawel 在技术之余的爱好是练习巴西柔术。

How ZFS Made its Way into FreeBSD