ZFS具有强健可靠、可伸缩、易于管理的特点。FreeNAS使用OpenZFS作为其默认的文件系统,FreeNAS的每个版本都包含OpenZFS最新版的“功能标志”和漏洞补丁,而且FreeNAS绝大多数功能都与ZFS文件系统有着各种各样的的关联。要使用FreeNAS,就必须先了解ZFS文件系统。

简介

ZFS是一种先进的现代文件系统,是一个革命性的文件系统,它专门设计用于提供传统UNIX文件系统中不具备的功能,从根本上改变了文件系统的管理方式,具有目前市面上的其他任何文件系统所没有的功能和优点。ZFS最初是由Sun公司为Solaris 10操作系统开发的文件系统,被Sun称为是终极文件系统。为了便于将其移植到其他操作系统,ZFS作为OpenSolaris开源计划的一部分,于2005年11月发布,经历了10年的活跃开发。Oracle收购Sun之后,为了能够继续提供开源版本,原来负责开发ZFS文件系统的几个工程师建立了OpenZFS开源项目以提供开源版本的持续协作开发。

ZFS池存储

ZFS使用存储池的概念来管理物理存储。以前,文件系统是在单个物理设备的基础上构造的。为了利用多个设备并提供数据冗余,ZFS引入了卷管理器的概念,以便于在不修改文件系统的情况下即可利用多个设备。ZFS将存储设备聚集到存储池中,而不是强制要求创建虚拟卷。文件系统不再仅限于单个存储设备,从而可与存储池中的所有文件系统共享磁盘空间。与传统的类Unix文件系统不同,在创建ZFS文件系统时无需指定分区的大小,而是一次将特定数量的磁盘(称为vdev)提供给ZFS池,并根据需要从池中创建文件系统,ZFS会根据需要自动的使用存储设备上的可用空间。添加新存储器后,无需执行其他操作,存储池中的所有文件系统可立即使用所增加的磁盘空间。在FreeNAS中,卷管理器用于创建或扩展ZFS池。一旦创建了池,就可以根据需要将它分为动态大小的数据集或固定大小的zvols。数据集可用于优化存储的数据类型的存储,可以设置权限和属性(例如配额和压缩可以在每个数据集级别上设置)。zvol本质上是一个原始的虚拟块设备,可用于需要诸如iSCSI设备扩展盘区等原始设备语义的应用程序。

校验和与自我修复数据

ZFS 文件系统上的所有数据和元数据,均按用户指定的校验和算法进行验证。传统的文件系统,某些故障可能导致数据不正确但却没有校验和错误,比如,会向错误位置写入完整的数据块。ZFS 校验和的存储方式可确保检测到这些故障并可以正常地从其中进行恢复。当ZFS写入数据时,它会为其写入的每个磁盘块创建一个校验和。当ZFS读取数据时,它会验证它读取的每个磁盘块的校验和。此外,ZFS 还提供自我修复数据。如果ZFS在镜像池或使用RAIDZ的池上标识磁盘块校验和错误,ZFS将使用正确的数据修复损坏的数据。ZFS 支持存储池具有各种级别的数据冗余性。检测到坏的数据块时,ZFS 会从另一个冗余副本中提取正确的数据,而且会用正确的数据替换错误的数据。所有校验和验证与数据恢复都是在文件系统层执行的,并且对应用程序是透明的。由于某些磁盘块很少被读取,因此应该安排定期擦除,以便ZFS可以读取所有数据块以验证其校验和并纠正任何损坏的块。FreeNAS会为每个ZFS池自动安排一次每月清理,并显示清理结果。清理结果可以提供可能的磁盘故障指示。

支持实时数据压缩

在数据块写入磁盘时会进行压缩。当访问一个被压缩的数据块时,它会被自动解压。因为压缩发生在数据块层面,而不是文件层面,因此所有应用程序都可以透明的访问被压缩的数据。默认情况下,使用FreeNAS9.2.1或更高版本制作的ZFS池将使用推荐的LZ4压缩算法。关于数据压缩和重复数据删除的对比可以阅读《为FreeNAS节约存储空间,是压缩还是重复数据删除?》。

ZFS 快照

ZFS 提供了低开销的瞬时快照,可以快速而轻松地为存储池、数据集或虚拟磁盘创建快照。得益于Copy-on-Write(即写即拷)技术,创建的第一个快照不会占用存储池中的空间。当数据集或虚拟磁盘中的数据发生变化时,快照通过继续引用旧数据来占用磁盘空间。因此,快照可防止将数据释放回池中。当文件被删除时,其磁盘块被添加到空闲列表中; 但是,在删除所有引用快照之前,任何现有快照中该文件的块都不会添加到空闲列表中。这意味着如果需要恢复文件的旧版本或已删除文件,快照提供了一种保存文件历史记录的巧妙方法。快照存储在本地,也可以复制到远程ZFS池。在复制期间,ZFS不会执行逐字节复制,而是将快照转换为数据流。这种设计意味着接收端的ZFS池不需要相同,并且可以使用不同的RAIDZ级别,卷大小,压缩设置等。关于ZFS快照的详细介绍请阅读《ZFS快照介绍:Snapshot》和《在FreeNAS中管理与创建Snapshot》。

多重引导环境

从FreeNAS 9.3开始,在系统更新或升级前,会自动为操作系统数据集创建一个快照,如果更新或导入配置文件时操作失败,可以重启系统,在Grub菜单中选择之前的引导环境,即可将系统恢复到发生失败操作之前的状态。还可以根据需要在System-Boot中创建自己的引导环境,例如在进行配置更改之前。这样,可以将系统重新引导到系统的不包含新配置更改的快照中。关于多重引导环境的详细介绍请阅读《升级FreeNAS,了解ZFS的多重引导环境》。

RAIDZ冗余

见另一篇文章《ZFS存储池介绍:Stripe、Mirror、RAIDZ和高速缓存》。

高速读写缓存

见另一篇文章《ZFS高速缓存介绍:ZIL和L2ARC》。