Mac OS X背后的故事(十三)Mac OS X 文件系统的来龙去脉-下

发布于: 雪球转发:0回复:0喜欢:0
王越/文

由于各种缺点,干掉 HFS+ 势在必行,然而用什么取代 HFS+ 呢?苹果开始秘密研发下一代的文件系统——ZFS,然而在诸多因素的干扰下,Mac OS X 的 ZFS 支持却只是昙花一现,未来文件系统之路将走向何方?

文件系统的新时代——ZFS

为了代替 HFS+,苹果开始为研发下一代文件系统招兵买马,准备大干一场。但这时 Sun 公司的工作让苹果的员工们为之一振。

2004 年,Sun 公司发表了其杰出的文件系统ZFS。这是一个 128 位的文件系统,本为 Solaris 操作系统开发,于 2005 年 10 月 31 日并入了 Solaris开发的主干原始码。后成为一个使用 CDDL 协议条款授权的开源项目。

ZFS 是一个具有高存储容量、文件系统与卷管理概念整合、崭新的磁碟逻辑结构的轻量级文件系统,同时也是一个便捷的存储池管理系统。

ZFS 的一个重大特点就是拥有大容量。ZFS 是一个 128 位的文件系统,这意味着它能存储 1800 亿亿(18.4×1018)倍于当前 64 位文件系统的数据。ZFS 的设计如此超前以至于这个极限就当前现实而言可能永远无法遇到。项目领导 Bonwick 曾说:“要填满一个 128 位的文件系统,将耗尽地球上所有存储设备,除非你拥有煮沸整个海洋的能量。”假设每秒钟创建 1000 个新文件,达到 ZFS 文件数的极限需要约 9000 年。

此外,ZFS 的一个重要指导思想是不单单去做一个文件系统,而是实现一套完整的卷管理方案。不同于传统文件系统需要驻留于单独设备或者需要一个卷管理系统去使用一个以上的设备,ZFS 建立在虚拟的被称为“zpools”的存储池之上。每个存储池由若干虚拟设备组成。这些虚拟设备可以是原始磁碟,也可能是一 RAID1 镜像设备,或是非标准 RAID 等级的多磁碟组。于是 zpool 上的文件系统可以使用这些虚拟设备的总存储容量。

有了卷管理方案后,ZFS 走得更远,加入了快照和克隆等实用的文件系统功能。当 ZFS 写新数据时,包含旧数据的块被保留,磁盘只写入修改过的那部分数据块。所以快照的建立非常快,只存储两个快照间的数据差异,因此快照也是空间优化的。克隆指两个独立的文件系统共享一些列的块。当任何一个克隆版本的文件系统被改变时,只创建改动的数据块,因此非常快速,也占用少得多的空间。

而 ZFS 最大的贡献在于它是第一个支持写入时复制功能(COW,copy on write)的文件系统。所有文件系统中的块都包括 256 位的校验值。含有活动数据的块从来不被覆盖;而是分配一个新块,并把修改过的数据写在新块上。所有与该块相关的元数据块都被重新读、分配和重写。因此,当一个数据写入时发生了任何意外错误,原先的数据依然可以被访问,且文件系统知道哪个操作出了错误而没有完成。ZFS 的快照和克隆正是因此项技术而得以实现。

ZFS 对于用户而言,界面友好。先前 Unix的卷管理非常烦琐,FreeBSD 因此还建了一套宏伟的框架,给逻辑卷管理做深层次的抽象。而 ZFS 文件系统自带卷管理方案,几乎所有烦琐复杂的操作都能在一两条命令内完成,我用传统的卷管理工具已有近十个年头,第一次使用 ZFS 时,完全被其易用性震撼,所以我毫不犹豫地把手头所有的服务器迁移到了 ZFS。

由于 ZFS 各种美好,加上其开源性质,所有的操作系统都想支持它。Solaris、OpenSolaris 项目一直作为标准实现供其他系统参考。Pawe Jakub Dawidek 把 ZFS 移到 FreeBSD,并在 2009 年进入了 FreeBSD 7,作为 FreeBSD 第七版最耀眼的三项功能之一(另一项功能是我们先前提到的 ULE,以及 Sun DTrace 的移植工作)。NetBSD 在 2009 年正式收纳 ZFS。Linux 则麻烦得多,因为 Linux 内核的协议 GPL 是个和很多协议都水火不容的奇葩协议,ZFS 分发所采用的 CDDL 和 GPL 会产生冲突,所以一方面 FUSE 提供了用户空间层面的支持;另一方面,由 Oracle 牵头,专为 Linux 开发 Btrfs,事实上就是一个 ZFS 的山寨版,可惜折腾了几年,Oracle 自己又把 Sun 收购了,且到我撰写此文时 Btrfs 依然没有正式的稳定版本发布。

昙花一现的 ZFS 梦

刚才提到,苹果在招兵买马,雇员工开发新一代的文件系统,而 Chris Emura(Apple CoreOS 的文件系统开发经理)及 Don Brady(先前提到,此人领导 HFS+ 的开发)两个富有经验的文件系统开发者却被衣服一样晾在了一边无所事事。2006 年,刚刚提到的 Pawe Jakub Dawidek 正在往 FreeBSD 迁移 Sun 的 ZFS,这项工作立刻引起了 Chris Emura 及 Don Brady 的高度兴趣。由于 ZFS 在 Unix 系统高度的可移植性,加上 Mac OS X 本就是 FreeBSD 的近亲,闲得发慌的两人立即打算往 Mac OS X 移植 ZFS。在 2007 年 4 月 6 日,FreeBSD 的移植宣告完成,等待合并进主干。一周后,两位苹果员工亦成功地完成了 Mac OS X 的移植。

苹果一看两人的 ZFS 的移植工作大有前途,立即跟进。2007 年的苹果全球开发者大会上,苹果让 Chris Emura 及 Don Brady 举办了一场小型讲话,介绍 Mac OS X 对 ZFS 的支持。这场讲话先前并没有在官方声明中告示,但讲话的报告厅依然挤满了听众。随后 ZFS 移植的源码在 Mac OS Forge 公布。在最终版的 Mac OS X 10.5 带有试验性的 ZFS 只读支持,以命令行方式提供。用户可以挂载 ZFS 的存储池,并对池中的文件系统进行读取操作。

苹果一直使移植并使用 Sun 的关键技术,除了 Java 以外,Mac OS X 10.5 的 Xcode 套件也加入了 DTrace 的支持,并提供了一个好用的图形界面 Instruments 让开发者更方便地调用 DTrace。ZFS 除了解决 HFS+ 的所有问题,提供安全可靠的文件系统基础外,还可以简化苹果许多软件的实现。例如前文提到的 Mac OS X 10.5 的 Time Machine,实现颇为烦琐,依赖于给 HFS+ 提供新功能,功能层也需要增加很多的和备份相关的代码。而 ZFS 默认就支持快照,将大大简化 Time Machine 的实现,并使该功能更稳定可靠。事实上在 2008 年 11 月 25 日,Sun 发布了 OpenSolaris 2008.11 版,其中给 GNOME 的 Nautilus 增加了一个使用 ZFS 的快照功能的图形界面插件名为 Time Slider,和苹果的 Time Machine 提供了非常相近的功能,我在使用后感觉不错。

因此在 WWDC 2008 上,Snow Leopard 被提出,其中一项很重要的卖点就是对 ZFS 的完整的读写支持。在 Mac OS X 的服务器版,苹果也将提供一套图形界面工具来方便维护人员管理 ZFS 存储池。在当时的 Snow Leopard Server 主页上,苹果声明 ZFS 将作为一项主推功能。

但好景不长,一年后的苹果开发者大会时,ZFS 相关的内容被悄悄从任何公开的文档、网站、发布会中撤下,没有给出任何的理由。Mac OS Forge 上的 ZFS 代码和页面也被苹果移除。外界有很多对此的猜测,但没有任何猜测得到苹果官方的或是哪怕离职员工的证实。

猜测之一是当时 Sun 刚被 Oracle 收购,而 Oracle 长期投资 ZFS 的竞争产品 Btrfs。因此苹果觉得 ZFS 的前途不甚明朗。

猜测之二是 ZFS 的关键技术 Copy On Write 有专利问题,NetApp 声称他们拥有 COW 的专利因此在起诉 Sun,苹果不想在当中冒风险。

猜测之三是 ZFS 和苹果的 XNU 内核有协议冲突。我虽然不学法律,但我认为这个说法不完全对,因为 ZFS 和 DTrace 一样,是以 CDDL 发布的开源软件,既然 DTrace 可以无后顾之忧地加入到 XNU 中,ZFS 也没有理由不可以。事实上,除了 Linux 这种少数使用 GPL 这类奇葩协议的内核,大多数系统的协议都不和 CDDL 冲突。FreeBSD 也好,Mac OS X 10.5 也罢,都把 ZFS 加入内核发布。

但事实上,如果把三种猜测并在一起,我们可以看到一个更全局的可能性:对于猜测之二,苹果可能并非想使用 CDDL,而是想从 Sun 买下一个私有的协议,这样一来,Sun 不但提供更好的技术支持,出了问题(比如猜测二中的专利问题)也可以让 Sun 为自己背黑锅。结果 Sun 可能和苹果价格谈不拢,加上猜测之一提到的 Sun 大势已去,让苹果觉得还不如自己造个轮子来得方便。Sun 公司开发 ZFS 的主力 Jeff Bonwick 虽不能提供详细的信息,但他基本证实了这种说法。

无论如何,Mac OS X的 ZFS 支持,如昙花一现般消失了。

未来文件系统之路走向何方

虽然 Mac OS X的 ZFS 支持被砍了,开源社区依然想继续开发 Mac OS Forge 先前版本的移植。如 MacZFS 项目不遗余力地给 Mac OS X 10.5~10.7 提供 ZFS 读写支持。Don Brady 在苹果将对 ZFS 的支持砍掉之后从工作了 20 多年的苹果离职,开了一家名为 Ten’s Complement 的公司,该公司提供 Z-410,较 MacZFS 提供更新更稳定的移植。

不过,砍了 ZFS 后的苹果目标也变得更清晰——和 Sun 的谈判让苹果觉得与其支付高额的协议费,还不如雇人自己做个新的,再说了,作为比 Sun 大得多的 IT 公司,苹果可以轻而易举地搞个更强大的东西灭了它,因为 ZFS 其实也不如传说中的那样好。

首先,时代在进步。ZFS 之后,又有很多新的和文件系统相关的研究,如 Ohad Rodeh 的论文,即成为后来 BtrFS 实现的基础,可能比 ZFS 做得更好。

其次,ZFS 是十年前开始设计的文件系统,但十年中,存储工具已发生了重大的变化。ZFS 为传统磁盘设计,但传统磁盘的市场空间已不断被 SSD、闪存的吞食。尤其是 MacBook Air 中使用的 Flash 存储器便宜好用又小巧,可能将来会在 MacBook Pro 甚至 iMac 中得到更大的推广。采用为传统磁盘优化的 ZFS 就不显得那么有吸引力。

最后,ZFS 和苹果有不同的用户群。ZFS 目标用户是大企业的工作站和服务器。在那里,大容量的存储空间、高级的卷管理显得非常重要,但苹果面对的基本都是个人用户——先前苹果还卖服务器,但后来 Xserve 都被苹果砍了。有几个个人用户需要使用到 ZFS 这些高级的功能呢?更重要的,苹果的主要利润将移到 iPhone、iPod、iPad、Apple TV 这些小设备上,ZFS 需要占用大量的内存来实现文件系统操作,在这些小设备上,内存很少,ZFS 根本跑不起来。

苹果非常清楚这些问题,工程师们现在一定在紧锣密鼓地开发下一代文件系统。在 10.7 及 10.8 中,这套文件系统并未浮出水面,但一些细节值得留意。在 10.7 中,苹果发布了 Core Storage,但并未声张。这是一套逻辑卷管理工具,类似于前文提到的 FreeBSD 的 GEOM。这个版本的 File Vault 2 亦使用 Core Storage 重写。可以看到虽然苹果在上层不断地淡化文件系统的概念,例如 iCloud 的发布和 iOS 中对于文件这一概念的故意忽略,但苹果在底层文件系统上的动作越来越大,想必在将来,苹果定会让我们感到重大的惊喜。

@今日话题

$苹果(AAPL)$                                 $微软(MSFT)$                                 $谷歌C(GOOG)$