XFS一种高性能的日志文件系统,是IRIX 5.3版的默认文件系统。以GNU通用公共许可证发布这套系统的源代码,之后被移植到Linux 内核上。XFS 特别擅长处理大文件,同时提供平滑的数据传输。
XFS 一种高性能的日志文件系统,最早于 1993 年,由 Silicon Graphics 为他们的 IRIX 操作系统而开发,是 IRIX 5.3 版的默认文件系统。2000 年 5 月,Silicon Graphics 以 GNU 通用公共许可证发布这套系统的源代码,之后被移植到 Linux 内核上。XFS 特别擅长处理大文件,同时提供平滑的数据传输。
XFS 最初是由 Silicon Graphics,Inc. 于 90 年代初开发的。那时,SGI 发现他们的现有文件系统(existing filesystem,EFS)正在迅速变得不适应当时激烈的计算竞争。为解决这个问题,SGI 决定设计一种全新的高性能 64 位文件系统,而不是试图调整 EFS 在先天设计上的某些缺陷。因此,XFS 诞生了,并于 1994 年随 IRIX 5.3 的发布而应用于计算。
简介
XfS 文件系统是 SGI 开发的高级日志文件系统,XFS 极具伸缩性,非常健壮。所幸的是 SGI 将其移植到了 Linux 系统中。在 linux 环境下。目前版本可用的最新 XFS 文件系统的为 1.2 版本,可以很好地工作在 2.4 核心下。
XFS 是 Silicon Graphics,Inc. 于 90 年代初开发的。它至今仍作为 SGI 基于 IRIX 的产品(从工作站到超级计算机)的底层文件系统来使用。现在,XFS 也可以用于 Linux。XFS 的 Linux 版的到来是激动人心的,首先因为它为 Linux 社区提供了一种健壮的、优秀的以及功能丰富的文件系统,并且这种文件系统所具有的可伸缩性能够满足最苛刻的存储需求。
历史
XFS 的开发始于 1993 年,在 1994 年被首次部署在 IRIX 5.3 上。2000 年 5 月,XFS 在 GNU 通用公共许可证下发布,并被移植到 Linux 上。2001 年 XFS 首次被 Linux 发行版所支持,现在所有的 Linux 发行版上都可以使用 XFS。
XFS 最初被合并到 Linux 2.4 主线中,这使得 XFS 几乎可以被用在任何一个 Linux 系统上。Arch, Debian, Fedora, openSUSE, Gentoo, Kate OS, Mandriva,Slackware, Ubuntu, VectorLinux 和 Zenwalk 的安装程序中都可选择 XFS 作为文件系统,但由于默认的启动管理器 GRUB 中存在 bug,以上发行版中只有少数几个允许用户在 /boot 挂载点(引导目录)上使用 XFS 文件系统。
FreeBSD 在 2005 年 12 月获得了对 XFS 的只读支持,并在次年 6 月引入了试验性的写支持。不过这些只是为了方便用户从 Linux 上迁移到 FreeBSD 上,并不是为了把 XFS 作为主打文件系统使用。Red Hat Enterprise Linux 5.4 64 位版的内核完整支持 XFS,但未包含创建和使用 XFS 的命令行工具(CentOS 正在进行这方面的尝试),原因是这些软件包还不够稳定。
特性
主要特性包括以下几点:
数据完全性
采用 XFS 文件系统,当意想不到的宕机发生后,首先,由于文件系统开启了日志功能,所以你磁盘上的文件不再会意外宕机而遭到破坏了。不论目前文件系统上存储的文件与数据有多少,文件系统都可以根据所记录的日志在很短的时间内迅速恢复磁盘文件内容。
传输特性
XFS 文件系统采用优化算法,日志记录对整体文件操作影响非常小。XFS 查询与分配存储空间非常快。xfs 文件系统能连续提供快速的反应时间。笔者曾经对 XFS、JFS、Ext3、ReiserFS 文件系统进行过测试,XFS 文件文件系统的性能表现相当出众。
可扩展性
XFS 是一个全 64-bit 的文件系统,它可以支持上百万 T 字节的存储空间。对特大文件及小尺寸文件的支持都表现出众,支持特大数量的目录。最大可支持的文件大 小为 263 = 9 x 1018 = 9 exabytes,最大文件系统尺寸为 18 exabytes。
XFS 使用高的表结构(B+树),保证了文件系统可以快速搜索与快速空间分配。XFS 能够持续提供高速操作,文件系统的性能不受目录中目录及文件数量的限制。
传输带宽
XFS 能以接近裸设备 I/O 的性能存储数据。在单个文件系统的测试中,其吞吐量最高可达 7GB 每秒,对单个文件的读写操作,其吞吐量可达 4GB 每秒。
规范
容量
XFS 是一个 64 位文件系统,最大支持 8exbibytes 减 1 字节的单个文件系统,实际部署时取决于宿主操作系统的最大块限制。对于一个 32 位 Linux 系统,文件和文件系统的大小会被限制在 16tebibytes。
文件系统日志
日志文件系统是一种即使在断电或者是操作系统崩溃的情况下保证文件系统一致性的途径。XFS 对文件系统元数据提供了日志支持。当文件系统更新时,元数据会在实际的磁盘块被更新之前顺序写入日志。XFS 的日志被保存在磁盘块的循环缓冲区上,不会被正常的文件系统操作影响。XFS 日志大小的上限是 64k 个块和 128MB 中的较大值,下限取决于已存在的文件系统和目录的块的大小。在外置设备上部署日志会浪费超过最大日志大小的空间。XFS 日志也可以被存在文件系统的数据区(称为内置日志),或者一个额外的设备上(以减少磁盘操作)。
XFS 的日志保存的是在更高层次上描述已进行的操作的“逻辑”实体。相比之下,“物理”日志存储每次事务中被修改的块。为了保证性能,日志的更新是异步进行的。当系统崩溃时,崩溃的一瞬间之前所进行的所有操作可以利用日志中的数据重做,这使得 XFS 能保持文件系统的一致性。XFS 在挂载文件系统的同时进行恢复,恢复速度与文件系统的大小无关。对于最近被修改但未完全写入磁盘的数据,XFS 保证在重启时清零所有未被写入的数据块,以防止任何有可能的、由剩余数据导致的安全隐患(因为虽然从文件系统接口无法访问这些数据,但不排除裸设备或裸硬件被直接读取的可能性)。
分配组
XFS 文件系统内部被分为多个“分配组”,它们是文件系统中的等长线性存储区。每个分配组各自管理自己的 inode 和剩余空间。文件和文件夹可以跨越分配组。这一机制为 XFS 提供了可伸缩性和并行特性——多个线程和进程可以同时在同一个文件系统上执行 I/O 操作。这种由分配组带来的内部分区机制在一个文件系统跨越多个物理设备时特别有用,使得优化对下级存储部件的吞吐量利用率成为可能。
条带化分配
在条带化 RAID 阵列上创建 XFS 文件系统时,可以指定一个“条带化数据单元”。这可以保证数据分配、inode 分配、以及内部日志被对齐到该条带单元上,以此最大化吞吐量。
基于 Extent 的分配方式
XFS 文件系统中的文件用到的块由变长 Extent 管理,每一个 Extent 描述了一个或多个连续的块。相比将每个文件用到的所有的块存储为列表的文件系统,这种策略大幅缩短了列表的长度。有些文件系统用一个或多个面向块的栅格管理空间分配——在 XFS 中这种结构被由一对 B+树组成的、面向 Extent 的结构替代了;每个文件系统分配组(AG)包含这样的一个结构。其中,一个 B+树用于索引未被使用的 Extent 的长度,另一个索引这些 Extent 的起始块。这种双索引策略使得文件系统在定位剩余空间中的 Extent 时十分高效。
可变块尺寸
块是文件系统中的最小可分配单元。XFS 允许在创建文件系统时指定块的大小,从 512 字节到 64KB,以适应专门的用途。比如,对于有很多小文件的应用,较小的块尺寸可以最大化磁盘利用率;但对于一个主要处理大文件的系统,较大的块尺寸能提供更好的性能。
延迟分配
主条目:延迟分配
XFS 在文件分配上使用了惰性计算技术。当一个文件被写入缓存时,XFS 简单地在内存中对该文件保留合适数量的块,而不是立即对数据分配 Extent。实际的块分配仅在这段数据被冲刷到磁盘时才发生。这一机制提高了将这一文件写入一组连续的块中的机会,减少碎片的同时提升了性能。
稀疏文件
XFS 对每个文件提供了一个 64 位的稀疏地址空间,使得大文件中的“洞”(空白数据区)不被实际分配到磁盘上。因为文件系统对每个文件使用一个 Extent 表,文件分配表就可以保持一个较小的体积。对于太大以至于无法存储在 inode 中的分配表,这张表会被移动到 B+树中,继续保持对该目标文件在 64 位地址空间中任意位置的数据的高效访问。
扩展属性
XFS 通过实现扩展文件属性给文件提供了多个数据流,使文件可以被附加多个名/值对。文件名是一个最大长度为 256 字节的、以 NULL 字符结尾的可打印字符串,其它的关联值则可包含多达 64KB 的二进制数据。这些数据被进一步分入两个名字空间中,root 和 user。保存在 root 名字空间中的扩展属性只能被超级用户修改,user 名字空间中的可以被任何对该文件拥有写权限的用户修改。扩展属性可以被添加到任意一种 XFS inode 上,包括符号链接、设备节点、目录,等等。可以使用 attr 这个命令行程序操作这些扩展属性。xfsdump 和 xfsrestore 工具在进行备份和恢复时会一同操作扩展属性,而其它的大多数备份系统则会忽略扩展属性。
Direct I/O
对于要求高吞吐量的应用,XFS 给用户空间提供了直接的、非缓存 I/O 的实现。数据在应用程序的缓冲区和磁盘间利用 DMA 进行传输,以此提供下级磁盘设备全部的 I/O 带宽。
确定速率 I/O
XFS 确定速率 I/O 系统给应用程序提供了预留文件系统带宽的 API。XFS 会动态计算下级存储设备能提供的性能,并在给定的时间内预留足够的带宽以满足所要求的性能。此项特性是 XFS 所独有的。确定方式可以是硬性的或软性的,前者提供了更高性能,而后者相对更加可靠。不过只要下级存储设备支持硬性速率确定,XFS 就只允许硬性模式。这一机制最常被用在实时应用中,比如视频流。
DMAPI
XFS 实现了数据管理应用程序接口(DMAPI)以支持高阶存储管理(HSM)。到 2010 年 10 月为止,Linux 上的 XFS 实现已经支持 DMAPI 所要求的的磁盘元数据规范,但有报告称内核支持仍处于不稳定状态。此前 SGI 曾提供了一个包含 DMAPI 钩子的内核源码树,但这个支持未被合并进主代码树。不过现在内核开发者们已经注意到了它并对其做了更新。
快照
XFS 并不直接提供对文件系统快照的支持,因为 XFS 认为快照可在卷管理器中实现。对一个 XFS 文件系统做快照需要调用 xfs_freeze 工具冻结文件系统的 I/O,然后等待卷管理器完成实际的快照创建,再解冻 I/O,继续正常的操作。之后这个快照可以被当作备份,以只读方式挂载。在 IRIX 上发布的 XFS 包含了一个整合的卷管理器,叫 XLV。这个卷管理器无法被移植到 Linux 上,不过 XFS 可以和 Linux 上标准的 LVM 正常工作。在最近发布的 Linux 内核中,xfs_freeze 的功能被实现在了 VFS 层,当卷管理器的快照功能被唤醒时将自动启动 xfs_freeze。相对于无法挂起,卷管理器也无法对其创建“热”快照的 ext3 文件系统,XFS 的快照功能具有很大优势。幸运地是,现在这种情况已经改观。从 Linux 2.6.29 内核开始,ext3, ext4, gfs2 和 jfs 文件系统也获得了冻结文件系统的特性。
在线碎片整理
虽然 XFS 基于 Extent 的特征和延迟分配策略显著提高了文件系统对碎片问题的抵抗力,XFS 还是提供了一个文件系统碎片整理工具,xfs_fsr(XFS filesystem reorganizer 的简称)。这个工具可以对一个已被挂载、正在使用中的 XFS 文件系统进行碎片整理。
在线尺寸调整
XFS 提供了 xfs_growfs 工具,可以在线调整 XFS 文件系统的大小。XFS 文件系统可以向保存当前文件系统的设备上的未分配空间延伸。这个特性常与卷管理功能结合使用,因为后者可以把多个设备合并进一个逻辑卷组,而使用硬盘分区保存 XFS 文件系统时,每个分区需要分别扩容。到 2010 年 8 月为止,XFS 分区不可以原位收缩,不过有一些方法可以变相处理这个问题。
原生备份/恢复工具
XFS 提供了 xfsdump 和 xfsrestore 工具协助备份 XFS 文件系统中的数据。xfsdump 按 inode 顺序备份一个 XFS 文件系统。与传统的 UNIX 文件系统不同,XFS 不需要在 dump 前被卸载;对使用中的 XFS 文件系统做 dump 就可以保证镜像的一致性。这与 XFS 对快照的实现不同,XFS 的 dump 和 restore 的过程是可以被中断然后继续的,无须冻结文件系统。xfsdump 甚至提供了高性能的多线程备份操作——它把一次 dump 拆分成多个数据流,每个数据流可以被发往不同的目的地。不过到目前为止,Linux 尚未完成对多数据流 dump 功能的完整移植。
原子磁盘配额
XFS 的磁盘配额在文件系统被初次挂载时启用。这解决了一个在其它大多数文件系统中存在的一个竞争问题:要求先挂载文件系统,但直到调用 quotaon(8)之前配额不会生效。
性能考虑
写入屏障
XFS 文件系统默认在挂载时启用“写入屏障”的支持。该特性会一个合适的时间冲刷下级存储设备的写回缓存,特别是在 XFS 做日志写入操作的时候。这个特性的初衷是保证文件系统的一致性,具体实现却因设备而异——不是所有的下级硬件都支持缓存冲刷请求。在带有电池供电缓存的硬件 RAID 控制器提供的逻辑设备上部署 XFS 文件系统时,这项特性可能导致明显的性能退化,因为文件系统的代码无法得知这种缓存是非易失性的。如果该控制器又实现了冲刷请求,数据将被不必要地频繁写入物理磁盘。为了防止这种问题,对于能够在断电或发生其它主机故障时保护缓存中数据的设备,应该以 nobarrier 选项挂载 XFS 文件系统。
日志的放置
XFS 文件系统创建时默认使用内置日志,把日志和文件系统数据放置在同一个块设备上。由于在所有的文件系统写入发生前都要更新日志中的元数据,内置日志可能导致磁盘竞争。在大多数负载下,这种等级的竞争非常低以至于对性能没有影响。但对于沉重的随机写入负载,比如在忙碌的数据块服务器上,XFS 可能因为这种 I/O 竞争无法获得最佳性能。另一个可能提高这个问题的严重性的因素是,日志写入被要求以同步方式提交——它们必须被完全写入,之后对应实际数据的写入操作才能开始。
如果确实需要最佳的文件系统性能,XFS 提供了一个选项,允许把日志放置在一个分离的物理设备上。这只需要很小的物理空间。分离的设备有自己的 I/O 路径,如果该设备能对同步写入提供低延迟的路径,那么它将给整个文件系统的操作带来显著的性能提升。SSD,或带有写回缓存的 RAID 系统是日志设备的合适候选,它们能满足这种性能要求。不过后者在遭遇断电时可能降低数据的安全性。要启用外部日志,只须以 logdev 选项挂载文件系统,并指定一个合适的日志设备即可。
缺点
XFS 文件系统无法被收缩。
历史上 XFS 上的元数据操作曾比其它文件系统都慢,表现为在删除大量小文件时性能糟糕。该性能问题是被 Red Hat 的 XFS 开发者 Dave Chinner 在代码中定位到的。使用一个叫“延迟记录”的挂载选项可以成数量级地提升元数据操作的性能。该选项几乎把日志整个存在内存中。Linux 内核主线版本 2.6.35 中作为一个试验性特性引入了这个补丁,在 2.6.37 中使它成为了一个稳定的特性,并计划在 2.6.39 中把它作为默认的日志记录方法。早期测试显示在有少量线程的环境中其性能接近 EXT4,在大量线程的环境下超过了 EXT4。