本文主要介绍高级文件系统 ZFS,将讨论它的来源、它是什么以及为什么它在技术人员和企业中如此受欢迎。
注意: 本文多次提到 ZFS ,当谈到 ZFS 功能和安装时,其实说的是 OpenZFS。自从 Oracle 停止对 OpenSolaris 更新代码之后[1],ZFS(由 Oracle 开发)和 OpenZFS 遵循了不同的路径。
ZFS 文件系统在 2001 年由 Matthew Ahrens 和 Jeff Bonwick[2] 创建。ZFS 旨在成为 Sun Microsystems Solaris 操作系统[3] 的下一代文件系统。2008 年,ZFS 被移植到 FreeBSD,同年开始将 ZFS 移植到 Linux[4] 中。但是,由于 ZFS 是根据 Common_Development_and_Distribution_License(CDDL)[5] 开发的,该许可证与 GNU General Public License (GPL)[6] 不兼容,因此它不能包含在 Linux 内核中。为了解决这个问题,大多数 Linux 发行版都提供了安装 ZFS 的方法。
在 Oracle 收购 Sun Microsystems 后不久,OpenSolaris 就成为了闭源。ZFS 的所有后续开发也变成了闭源。当时 ZFS 的许多开发人员对这一转变感到不满,于是大约三分之二的 ZFS 核心开发人员(包括 Ahrens 和 Bonwick)离开了 Oracle。他们于 2013 年 9 月加入其他公司并创建了 OpenZFS 项目[7],该项目引领了 ZFS 的开源。
让我们回到上面提到的许可证问题。由于 OpenZFS 项目与 Oracle 分开,有些人可能想知道为什么他们不将许可证更改为与 GPL 兼容的许可证,以便将其包含在 Linux 内核中。根据 OpenZFS 网站介绍[8],更改许可证将要联系所有为 OpenZFS 贡献过代码的人(包含 OpenSolaris 之前的初始通用 ZFS 代码)并获得他们对更改许可证的同意。由于这项工作几乎是不可能完成的(因为一些贡献者可能已经死亡或很难找到),他们决定保留原来的许可证。
正如我前面提到的,ZFS 是一种高级文件系统。因此,它具有一些有趣的功能[9]。如:
存储池
写时拷贝
快照
数据完整性验证和自动修复
RAID-Z
最大 16 EiB(2^64byte,即 16x1024x1024TB)的文件大小
最大 256 ZiB(2^78byte)存储
与大多数文件系统不同,ZFS 结合了文件系统和卷系统管理器的功能。这意味着与其他文件系统不同,ZFS 可以创建跨越一系列驱动器或池的文件系统。不仅如此,还可以通过添加另一个驱动器将存储添加到池中。ZFS 将处理分区和格式化[10]。
ZFS 中的存储池
写时拷贝[11] 是另一个有趣(而且很酷)的功能。在大多数文件系统上,当数据被覆盖时,它会永远丢失。在 ZFS 上,新信息被写入不同的块,写入完成后,文件系统元数据将更新以指向新信息。这确保如果在写入过程中系统崩溃(或发生其他事情),旧数据将被保留,这也意味着系统在崩溃后不需要运行文件系统检查 fsck (file system check)[12]。
写时拷贝导致另一个 ZFS 功能:快照。ZFS 使用快照来跟踪文件系统中的更改。“快照包含文件系统的原始版本,实时文件系统包含自快照以来所做的任何更改,不使用额外的空间。当新数据写入实时文件系统时,会分配新块来存储这些数据。” 如果文件被删除,快照引用也会被删除。因此,快照主要用于跟踪文件的更改,而不是文件的添加和创建。
快照能够以只读方式挂载以恢复文件的过去版本,还可以将实时系统回滚到以前的快照。一旦快照没了,所有更改都将丢失。
每当新数据写入 ZFS 时,它都会为该数据创建校验和(checksum)。当读取该数据时,校验和被验证。如果校验和不匹配,则 ZFS 知道已检测到错误。然后 ZFS 将自动尝试更正错误。
ZFS 无需任何额外的软件或硬件即可处理磁盘阵列 RAID (Redundant Arrays of Independent Disks)。ZFS 有自己的 RAID 实现:RAID-Z。RAID-Z 实际上是 RAID-5 的变体,为了克服 RAID-5 的 WriteHole 问题,即“意外重启后数据和奇偶校验信息变得不一致”。要使用基本的 RAID-Z (RAID-Z1)[13],至少需要 2 块磁盘用于存储,1 块磁盘用于奇偶校验[14]。RAID-Z2 至少需要 2 个存储驱动器和 2 个用于奇偶校验的驱动器。RAID-Z3 则至少需要 2 个存储驱动器和 3 个用于奇偶校验的驱动器。将驱动器添加到 RAID-Z 池时,它们必须以 2 的倍数添加。
ZFS 在创建之初,就被设计为最后一代文件系统[15]。在大多数文件系统都是 64 位的时候,ZFS 创建者决定直接跳到 128 位以备未来验证。这意味着 ZFS “提供了 32 位或 64 位系统容量的 160 亿倍”。事实上,Jeff Bonwick 表示,“要填满一个 128 位的文件系统,将耗尽地球上所有存储设备。除非你拥有煮沸整个海洋的能量,不然你不可能将其填满”[16]。“fully populating a 128-bit storage pool would, literally, require more energy than boiling the oceans.”
如果想开箱即用地使用 ZFS,则需要安装 FreeBSD[17] 或使用 illumos 内核的操作系统。illumos[18] 是 OpenSolaris 内核的一个分支。
事实上,对 ZFS 的支持是一些有经验的 Linux 用户选择 BSD [19] 的主要原因之一。
如果想在 Linux 上试用 ZFS,可以将其用作存储文件系统。最近,Ubuntu 19.10 引入了在根目录上开箱即用安装 ZFS 的功能。阅读有关在 Ubuntu 上使用 ZFS[20] 的更多信息。如果有兴趣在 Linux 上尝试 ZFS,Linux 项目上的 ZFS 有许多教程。