Z 文件系统(ZFS,Z?File?System)由 Matthew Ahrens 和 Jeff Bonwick 于 2001 年创建,ZFS 旨在成为?Sun Microsystems?的?OpenSolaris 操作系统的下一代文件系统。2008 年,ZFS 被移植到了 FreeBSD,同年由一个项目将?ZFS 文件系统移植到了 Linux 平台。由于 ZFS 根据与「GNU 通用公共许可证」不兼容的「通用开发和分发许可证」进行许可,因此它不能被直接包含在 Linux 内核中。为了解决这一问题,大多数主流 Linux 发行版都提供了手动安装 ZFS 的方法。例如,您就可以在 Ubuntu 中安装使用 ZFS 文件系统。
Oracle 收购 Sun Microsystems 后不久 OpenSolaris 系统就宣布闭源了(Oracle 还真是开源杀手),从而 ZFS 的所有后续开发也就「顺理成章」成了闭源项目,这也引起相当多参与开发人员的不满。由于闭源决定,2/3 的核心 ZFS 开发者,包括 Matthew Ahrens 和 Jeff Bonwick 都离开了 Oracle,此后他们与其他公司一起于 2013 年 9 月创建了?OpenZFS 项目,该项目也率先开展了 ZFS 的开源开发。
既然 OpenZFS 项目与 Oracle 是分开的,有人就不解,为什么不将许可证更改为与 GPL 兼容,也好让其直被接纳入 Linux 内核。根据 OpenZFS 官网的说法:更改许可证涉及到联系涉及的代码贡献人,并获得他们对更改许可证的认可。这项工作几乎不可能完成,所以 OpenZFS 团队才决定保留原有许可证。
前文已提到过,ZFS 是一款高、大、上的高级文件系统,因此它有一些非常有趣的功能,如:
与大多数文件系统不同,ZFS 将「文件系统」和「卷管理器」功能组合在一起,它可以创建跨越一系列驱动器或池的文件系统。ZFS 池的概念与 RAID 非常类似,如果你了解?Windows 10 中的存储空间就不难理解它了。
「写入时复制」是一个有趣而且很酷的功能。在大多数文件系统上,当数据被覆盖时,它将永远丢失;而在 ZFS 文件系统上,新信息会被写入不同的块(block)中,写入完成后,文件系统元数据将更新指向为新信息。这一机制可以确保在写入过程中即便系统崩溃(或发生其它严重事件),旧数据也会被保留。这就意味着,系统崩溃后无需执行?fsck?操作。
「写入时复制」机制引入了另一项 ZFS 功能——快照。ZFS 使用「快照」来跟踪文件系统中的更改,「快照」包含文件系统的原始版本,并且「实时文件系统」包含自拍摄快照以来所做的任何更改。当新数据写入「实时文件系统」时,会分配新 block 来存储此数据。文件删除后,也会删除快照引用。因此,「快照」主要用于跟踪对文件的更改,但不包括文件的添加和创建。
快照可以以只读方式挂载,以恢复文件的过去版本。 当然,也可以将实时系统回滚到先前快照的状态。
每当将新数据写入 ZFS 时,它都会为该数据创建校验和。 读取该数据时,将验证校验和。 如果校验和不匹配,则 ZFS 知道已检测到错误,会自动尝试更正错误。
ZFS 文件系统可以在无需额外软件或硬件的情况下组 RAID,而且 ZFS 有自己的 RAID 实现——RAID-Z。RAID-Z 实际上是 RAID-5 的一种变体,旨在克服 RAID-5 写孔错误(在这种情况下,数据和奇偶校验信息在意外重新启动后变得不一致)。要使用基本级别的 RAID Z(RAID-Z1),至少需要有两块磁盘用于存储+ 一块用于奇偶校验。RAID-Z2 则至少需要两块磁盘用于存储 + 两块用于奇偶校验。 RAID-Z3 至少需要两块存储驱动器 + 三个用于奇偶校验的驱动器。
当驱动器添加到 RAID-Z 池时,必须以 2 的倍数添加。
在 64 位文件系统成为主流的时候,ZFS 的创建者直接跳到了 128 位。这意味着,ZFS 文件系统能够提供的存储容量是 32 位和 64 位系统的 16 亿亿倍。
Jeff Bonwick(其中一位创始人)表示:要填满 128 位存储池所需要的电能,比将海洋之水烧开所消耗的能量还要多。
对于 FreeBSD 或使用 illumos 内核的操作系统而言,ZFS 算是原生支持,可以「开箱即用」。
illumos 是 OpenSolaris 内核的一个分支。
……