Mac OS X背后的故事(十一)Mac OS X文件系统的来龙去脉(下)
由于各种缺点,干掉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中对于文件这一概念的故意忽略,但苹果在底层文件系统上的动作越来越大,想必在将来,苹果定会让我们感到重大的惊喜。
作者王越,美国宾夕法尼亚大学计算机系研究生,中国著名TeX开发者,非著名OpenFOAM开发者。