13.2. Linux 中的主要文件系统

与两三年前不同,为 Linux 系统选择文件系统不再是花几秒钟就能完成的操作(选择 Ext2 或 ReiserFS)。从版本 2.4 开始,内核提供了多种供选择的文件系统。下面概述了这些文件系统的基本工作原理以及它们的优点。

您一定要记住一点,即没有任何一个文件系统能适合所有应用环境。每个文件系统都有各自的特定优点和缺点,必须将这些因素考虑在内。但是,即使是最复杂的文件系统也不能替代合理的备份策略。

本章中使用的术语数据完整性数据一致性并不是指用户空间数据(您的应用程序写入其文件的数据)的一致性。此数据是否一致必须由应用程序本身控制。

[Important]设置文件系统

除非本章另行声明,否则可以使用 YaST 执行设置或更改分区和文件系统所需的所有步骤。

13.2.1. ReiserFS

作为 2.4 内核版本的正式关键功能之一,ReiserFS 早在 SUSE Linux 版本 6.4 后就作为 2.2.x SUSE 内核的内核增补程序提供。ReiserFS 是由 Hans Reiser 和 Namesys 开发小组设计的。ReiserFS 已证明它自己是 Ext2 功能强大的替代系统。ReiserFS 的主要优点是更高的磁盘空间利用率、更高的磁盘访问性能以及更快的崩溃恢复速度。

以下内容是对 ReiserFS 优点的详细说明:

更高的磁盘空间利用率

在 ReiserFS 中,采用一种名为 B*-Tree(平衡树)的结构组织所有数据。这种树结构有助于提高磁盘空间的利用率,这是因为可以将小文件直接储存在平衡树的页节点而不是其它位置,并且只维护一个指向实际磁盘位置的指针。此外,不按照 1 kB 或 4 kB 的大块来分配储存区,而是根据所需的准确大小进行。另一个优点是 inode 的动态分配。这使得此文件系统比传统的文件系统(例如 Ext2)更灵活,而传统文件系统中的 inode 密度必须在创建文件系统时指定。

更高的磁盘访问性能

对于小文件,文件数据和 “stat_data” (inode) 信息经常被储存在相邻的位置。这样通过一个磁盘 I/O 操作就可以访问它们,这意味着只需访问磁盘一次就可以检索到所有需要的信息。

更快的崩溃恢复速度

使用日记来跟踪最近的元数据更改使对文件系统的检查可以很快完成,即使对大型文件系统也是如此。

通过数据日记确保可靠性

ReiserFS 还支持与 Ext3 一节 第 13.2.3 节 “Ext3” 中介绍过的概念类似的数据日记和有序数据方式。默认方式是 data=ordered,它确保了数据和元数据的完整性,但只对元数据使用日记。

13.2.2. Ext2

Ext2 的起源可以追溯到 Linux 历史的早期。1992 年 4 月推出了 Ext2 的前身 Extended File System(扩展文件系统),并将其集成到 Linux 0.96c 中。扩展文件系统经过多次修改,并(像 Ext2 一样)成为多年来最流行的 Linux 文件系统。但随着日记文件系统的创建以及其恢复时间的大大缩短,Ext2 的重要性逐渐降低。

简要总结 Ext2 的优点有助于您了解为什么它以前是(在某些领域现在仍是)许多 Linux 用户最喜欢使用的 Linux 文件系统。

可靠性

Ext2 确实是一个“老古董”,它经历了许多改进和频繁的测试。这可能是人们将其称之为坚如磐石的文件系统的原因。在系统中断后,如果无法彻底卸装文件系统,则 e2fsck 将开始分析文件系统数据。系统使元数据恢复一致的状态,并将挂起的文件或数据块写入指定的目录(名为 lost+found)。与日记文件系统相比,e2fsck 会分析整个文件系统,而不仅仅是最近修改的元数据位。这种操作所花的时间要远远超过检查日记文件系统的日志数据所花的时间。根据文件系统的大小,此过程可能需要半小时或更长时间。因此,对于任何要求高可用性的服务器,不要选择 Ext2。但是,因为 Ext2 不维护日记且使用的内存也少得多,所以其速度常常超过其它文件系统。

可方便地升级

Ext2 的代码是 Ext3 成为广受欢迎的下一代文件系统的坚实基础。它的可靠性和稳定性与日记文件系统的优点完美地结合在一起。

13.2.3. Ext3

Ext3 是由 Stephen Tweedie 设计的。与所有其它下一代文件系统不同,Ext3 并没有采用全新的设计原则。它是在 Ext2 基础上设计的。这两个文件系统密切关联。可以方便地在 Ext2 文件系统上建立 Ext3 文件系统。Ext2 和 Ext3 最重要的区别是 Ext3 支持日记。总之,Ext3 有三个主要优点:

方便并高度可靠地从 Ext2 升级

因为 Ext3 以 Ext2 代码为基础并且共享 Ext2 的磁盘上格式和元数据格式,所以从 Ext2 升级到 Ext3 非常简单。与转换到其它日记文件系统(如 ReiserFS 或 XFS 不同),转换到 Ext3 只需要花几分钟,而转换到其它日记文件系统会相当繁琐(备份整个文件系统并从头开始重新创建文件系统)。升级到 Ext3 还很安全,因为从头重新创建整个文件系统可能会出现问题。考虑到等待升级到日记文件系统的现有 Ext2 系统的数量,就很容易明白为什么 Ext3 对许多系统管理员来说如此重要。从 Ext3 降级到 Ext2 与升级一样简单。只需彻底卸装 Ext3 文件系统并重新装入 Ext2 文件系统即可。

可靠性和性能

某些其它日记文件系统采用“仅元数据”的日记方法。这意味着元数据始终保持一致的状态,但无法自动保证文件系统数据本身一致。Ext3 的设计既可以照顾到元数据,又可以照顾到数据。“照顾”的程度可以自定义。在 data=journal 方式中启用 Ext3 可以提供最大的安全性(数据完整性),但因为要将元数据和数据都记入日记,所以可能降低系统的速度。一个相对较新的方法是采用 data=ordered 方式,这种方式确保了数据和元数据的完整性,但只对元数据使用日记。文件系统驱动程序收集与一次元数据更新对应的所有数据块。这些数据块在更新元数据之前被写入磁盘中。这样,在不牺牲性能的情况下,元数据和数据的一致性得以实现。第三个可以使用的选项是 data=writeback,它允许在将某些数据的元数据提交给日记后,将这些数据写入主文件系统。在性能方面,此选项常被认为是最佳选项。但它在维护内部文件系统完整性的同时,允许以前的数据在系统崩溃并恢复后再次出现在文件中。除非指定了其它选项,否则运行 Ext3 时,data=ordered 为默认设置。

13.2.4. 将 Ext2 文件系统转换为 Ext3

要将 Ext2 文件系统转换为 Ext3,请按如下所示继续:

  1. 通过作为根用户运行 tune2fs -j 来创建 Ext3 日记。此命令将用默认参数创建 Ext3 日记。

    要自己确定日记的大小和所在的设备,请改为运行 tune2fs -J,同时带所需的日记选项 size=device=。可以在 tune2fs 程序的 tune2fs 手册页中获得关于此程序的更多信息。

  2. 要确保正确地识别 Ext3 文件系统,请作为根用户编辑文件 /etc/fstab,将为对应的分区指定的文件系统类型从 ext2 更改为 ext3。此更改将在下次重引导后生效。

  3. 要引导设置为 Ext3 分区的根文件系统,请将模块 ext3jbd 包含在 initrd 中。要完成此操作,请作为根用户编辑 /etc/sysconfig/kernel,将 ext3jbd 添加到 INITRD_MODULES 变量。保存更改后,请运行 mkinitrd 命令。这将构建一个新的 initrd,并准备使用它。

13.2.5. Reiser4

在发布了内核 2.6 之后,日记文件系统系列又加入了一个成员:Reiser4。Reiser4 与以前的 ReiserFS(版本 3.6)截然不同。它引入了插件概念,从而将文件系统功能和更严格的安全性概念结合起来。

严格的安全性概念

在设计 Reiser4 时,其开发者将重点放在与安全性有关功能的实施上。因此,Reiser4 附带有一组专用的安全性插件。最重要的一点是引入了文件“项目”概念。当前,文件访问控制是对每个文件定义的。如果一个大型文件包含与多个用户、组或应用程序有关的信息,则访问权限就无法很精确地包含所涉及的所有各方。在 Reiser4 中,您可以将这些文件分成较小的部分(“项目”)。然后,可以分别为每个项目和每个用户设置访问权限,从而进行更精确的文件安全性管理。一个很好的示例是 /etc/passwd。到此为止,只有 root 可读取和编辑此文件,而非 root 用户对这个文件只有读访问权限。采用 Reiser4 的项目概念,就可以将这个文件分成一组项目(每个用户一个项目),且允许用户或应用程序修改它们自己的数据,但不访问其它用户的数据。这一概念提高了安全性和灵活性。

通过插件增强扩展性

在 Reiser4 中,文件系统通常使用的许多文件系统功能和外部功能可以以插件的形式实施。这些插件可方便地添加到基础系统中。您不再需要重新编译内核或重新格式化硬盘就可将新功能添加到文件系统中。

通过延迟分配产生较好的文件系统布局

与 XFS 类似,Reiser4 也支持延迟分配。请参见 第 13.2.6 节 “XFS”。甚至可以对元数据使用延迟分配以产生较好的整体布局。

13.2.6. XFS

SGI 在 20 世纪 90 年代初开始开发 XFS,最初计划将 XFS 作为 IRIX OS 的文件系统。开发 XFS 的目的是创建一个高性能的 64 位日记文件系统来满足当今对计算能力的极高要求。XFS 适合操纵大型文件,在高端硬件上表现优异。但即使是 XFS 也有缺点。与 ReiserFS 类似,XFS 非常注重元数据的完整性,但不太注重数据的完整性。

快速回顾 XFS 的关键功能将解释为什么此文件系统被证明是在高端计算方面其它日记文件系统的强大竞争对手。

通过使用分配组实现高伸缩性

在创建 XFS 文件系统时,文件系统底层的块设备被分成 8 个或 8 个以上相同大小的线性区域。这些线性区域被称为分配组。每个分配组管理自己的 inode 和可用空间。实际上,可以将分配组看作文件系统中的文件系统。因为分配组相互独立,所以内核可同时对多个分配组进行寻址。此功能对 XFS 优异的可伸缩性非常关键。独立分配组的概念自然适合多处理器系统的需要。

通过有效管理磁盘空间获得高性能

可用空间和 inode 是由分配组内的 B+ 树处理的。使用 B+ 树将大大增强 XFS 的性能和可伸缩性。XFS 使用延迟分配。它通过将进程分成两部分来处理分配。将挂起事务储存在 RAM 中并保留适当数量的空间。XFS 仍不决定应储存数据的准确位置(指出文件系统块)。此决定将被延迟到最后的时刻。某些生存期很短的临时数据可能永远不会被储存到磁盘上,这是因为在 XFS 决定保存它们的实际位置时,这些数据可能已经过时了。这样,XFS 增强了写性能,并减少了文件系统碎片的数目。因为延迟分配引起写事件的频率比其它文件系统引起写事件的频率要低,所以如果写操作期间发生系统崩溃,则数据丢失可能会更加严重。

进行预分配以避免文件系统碎片

在将数据写入文件系统前,XFS 保留(预分配)文件所需的可用空间。这样会大大减少文件系统碎片的数目。因为文件的内容不会分散在整个文件系统中,所以性能得以提高。