Daniel Robbins
总裁兼 CEO, Gentoo Technologies, Inc.
2001 年 11 月
Linux 的 2.4 发行版带来了使用多种新文件系统的可能性,包括 Reiserfs、XFS、GFS 以及其它文件系统。这些文件系统听起来很酷,但是它们到底能做什么,它们擅长于什么,还有,您到底如何着手在 Linux 生产环境下安全地使用它们呢?Daniel Robbins 通过向您展示如何在 Linux 2.4 上设置这些新的高级文件系统来回答这些问题。在这一部分,Daniel 研究了 ext3,它是 ext2 的新改进版,具有日志记录能力。
在前面几部分中,我们花费了一些精力去研究非传统文件系统(譬如 tmpfs 和 devfs)。现在,是时候回到基于磁盘的文件系统上来了,我们将通过研究 ext3 来实现这个目的。ext3 文件系统(由 Stephen Tweedie 博士设计)构建在现有的 ext2 文件系统的框架上;实际上,除了一个微小(但重要)的区别 ― ext3 支持日志记录以外,ext3 和 ext2 非常相似。但正是因为具有了这个小小的增加,您会发现 ext3 具有几种令人惊讶和富有吸引力的能力。在本文中,我将让您充分了解与当前可用的其它日志记录文件系统相比,ext3 有哪些优缺点。在我的下一篇文章中,我们将设置和运行 ext3。
理解 Ext3
那么,与 ReiserFS 相比,ext3 到底如何呢?在以前的文章中,我解释了 ReiserFS 是如何充分适合处理小文件的(4K 以下),并且,在某些情况下,ReiserFS 处理小文件的能力比 ext2 和 ext3 强十到十五 倍。但尽管 ReiserFS 有许多长处,它还是有弱点。在当前的 ReiserFS(版本 3.6)实现中,与 ext2 和 ext3 相比,尤其是读取大的邮件目录时,特定文件访问模式实际上可能导致 特别糟糕的性能。还有,ReiserFS 没有好的 NFS 兼容性跟踪记录,同时稀疏文件性能也较差。 相反,ext3 是一个非常 全面的文件系统。ext3 很象 ext2;它不会为您提供象 ReiserFS 那样特别快的小文件性能,但是,它也不会给您带来意外的性能或功能性瓶颈。
ext3 最妙的特性之一是:因为 ext3 基于 ext2 的代码,所以它的磁盘格式和 ext2 的相同;这意味着,一个干净卸装的 ext3 文件系统可以作为 ext2 文件系统毫无问题地重新挂装。并且不仅如此。应该感谢 ext2 和 ext3 都使用相同的元数据,因而有可能执行 ext2 到 ext3 文件系统的现场升级。是的,您的理解是正确的。通过升级一些关键系统实用程序、安装新的 2.4 内核,并在每个文件系统上输入单条 tune2fs 命令,就可以把现有的 ext2 服务器转换成日志记录 ext3 系统。甚至可以在 ext2 文件系统 已挂装的情况下进行这些操作。转换是安全的、可逆的、并且令人难以置信地简单,和到 XFS、JFS 或 ReiserFS 的转换不同,您不必备份和从头创建文件系统。现在花一些时间思考一下,有数以千计的 ext2 生产服务器,只要几分钟时间就能升级到 ext3;那么,您就会充分理解 ext3 对于 Linux 社区的重要性了。
如果非要用一个词来描述 ext3,我会说“舒适”。在已有的 ext2 系统上安装启用 ext3 的过程轻松得令人难以置信,并且升级以后,也不会导致任何意外的性能急剧下降。并且,ext3 在舒适方面还有一个优点,那就是,ext3 恰巧又是 Linux 可用的最 可靠的日志记录文件系统之一,我将在下面解释这一点。
Ext3 可靠性
除了与 ext2 兼容之外,ext3 还通过共享 ext2 的元数据格式继承了 ext2 的其它优点。譬如,ext3 用户可以使用一个稳固的 fsck 工具。您会回想起使用日志记录文件系统的要点之一是首先避免对彻底的 fsck 的需求,但是如果您确实要从脆弱的内核、坏的硬盘或者别的什么地方获得毁坏的元数据,您将非常感激 ext3 从 ext2 继承了 fsck 这个事实。相反,ReiserFS 的 fsck 还很幼稚,当脆弱的元数据 真的出现时,对脆弱元数据的修复过程将是困难和危险的。
仅元数据日志记录
有趣的是,ext3 处理日志记录的方式与 ReiserFS 和其它日志记录文件系统所用的方式迥异。使用 ReiserFS、XFS 和 JFS 时,文件系统驱动程序记录 元数据,但不提供 数据日志记录。使用 仅元数据日志记录,您的文件系统元数据将会异常稳固,因而可能永远不需要执行彻底 fsck。然而,意外的重新引导和系统锁定可能会导致最近修改 数据的明显毁坏。Ext3 使用一些创新的解决方案来避免这些问题,我们将对此做稍微深入的研究。
但首先,重要的是确切理解仅元数据日志记录最终是如何危害您的。举例来说,假设您正在修改名为 /tmp/myfile.txt 的文件时,机器意外锁定,被迫需要重新引导。如果您使用的是仅元数据日志记录文件系统,譬如 ReiserFS、XFS 或者 JFS,文件系统元数据将容易地修复,这要感谢元数据日志,您不必耐着性子等待艰苦的 fsck 了。
但是,存在一种明显的可能性:在将 /tmp/myfile.txt 文件装入到文本编辑器时,文件不仅仅丢失最近的更改,而且还包含许多乱码甚至可能完全不可读的信息。这种情况并不总会发生,但它 可能并且经常发生。
下面解释原因。典型的日志记录文件系统(譬如 ReiserFS、XFS 和 JFS)对元数据有特别处理,但是对数据不够重视。在上述示例中,文件系统驱动程序处于修改一些文件系统块的过程中。文件系统驱动程序更新适当的元数据,但是没有时间将其缓存中的数据刷新到磁盘的新块中。因此,当您将 /tmp/myfile.txt 文件装入文本编辑器时,文件的部分或全部包含乱码 ― 在系统锁定之前来不及初始化的数据块。
ext3 方法
既然我们对这个问题已经有了一个总的很好的理解,让我们来看 ext3 是如何实现日志记录的。在 ext3 里,日志记录代码使用一个特殊的称为“日志记录块设备”层或 JBD 的 API。JBD 被设计成在任何块设备上实现日志的特殊目的。Ext3 通过“钩入(hooking in)”JBD API 来实现其日志记录。例如,ext3 文件系统代码将正在执行的修改告知 JBD,并且还会在修改磁盘上包含的特定数据之前请求 JBD 的许可。通过执行这些操作,给予了 JBD 代表 ext3 文件系统驱动程序管理日志的适当机会。这是很好的安排,因为 JBD 是作为一个单独的、一般实体而开发的,将来它可以用于向其它文件系统添加日志记录能力。
关于 JBD 管理的 ext3 日志有一些巧妙的特性。其中之一是,ext3 的日志存储在一个索引节点中 ― 基本上是个文件。能否看到这个位于 /.journal 的文件,取决于您是如何在文件系统上“启用 ext3”的。当然,通过将日志存储在索引节点中,ext3 可以向文件系统添加必要的日志,而不需要对 ext2 元数据进行不兼容扩展。 这是 ext3 文件系统保持对 ext2 元数据,以及 ext2 文件系统驱动程序的向后兼容性的关键方式之一。
不同的日志记录方法
不必惊讶,确实有许多方法用于实现日志。例如,文件系统开发者可能会设计出一种日志,该日志存储在主机文件系统上需要修改的 字节范围。这种方法的好处在于,日志能够以一种非常高效的方式存储许多对文件系统的微小修改,这是因为它只记录需要修改的个别字节,而不记录除此以外的任何信息。
JBD 使用另外一种(从某种意义来说是更好的)方法。JBD 存储完整的被修改的文件系统块本身,而不是记录必定会被更改的字节范围。ext3 文件系统驱动程序也使用这种方法,存储内存中被修改的块(大小为 1K、2K 或 4K)的完整副本,以跟踪暂挂的 IO 操作。开始,这看起来有点浪费。毕竟,包含已修改数据的完整块中还可能包含 未修改的(已经在磁盘上)数据。
JBD 所使用的方法称为 物理日志记录,这意味着 JBD 使用完整的物理块,作为实现日志的主要媒介。相反,只存储已修改的字节范围而非完整块的方法称为 逻辑日志记录,这是 XFS 所使用的方法。因为 ext3 使用物理日志记录,所以 ext3 日志 将具有比其它文件系统日志(例如,XFS 日志)更大的相对磁盘占用。但是,因为 ext3 在文件系统内部和日志中使用完整块,ext3 处理的复杂度比实现逻辑日志记录的要小。另外,完整块的使用允许 ext3 执行一些额外的优化,譬如,将多个暂挂的 IO 操作“压扁”到同一内存数据结构的单个块中。 接下来,这种优化允许 ext3 将这多个更改在一次写操作中写到磁盘上,而不需要多次写操作。此外,因为文字块数据存储在内存中,这些内存数据在写到磁盘之前,不必或只需作很少更改,大大减少了 CPU 开销。
Ext3,数据保护者
现在,我们最后来了解一下 ext3 文件系统是如何高效地提供元数据 和数据日志记录,以避免在本文前面部分所描述的数据毁坏问题的。实际上,ext3 有两种确保数据和元数据完整性的方法。
最初,ext3 被设计用来执行完整数据和元数据日志记录。在这种方式下(称之为“data=journal”方式),JBD 将所有对数据和元数据的更改都记录到文件系统中。因为数据和元数据都被记录,JBD 可以使用日志将元数据 和数据恢复到一致状态。完整数据日志记录的缺点是它可能会比较慢,但可以通过设置相对较大日志来减少性能损失。
最近,ext3 添加了一种新的日志记录方式,该方式提供完整日志记录的好处而不会带来严重的性能损失。这种新方式只对元数据进行日志记录。但是,ext3 文件系统驱动程序保持对与每个元数据更新对应的特殊 数据块的跟踪,将它们分组到一个称为事务的实体中。当事务应用于适当的文件系统时,数据块首先被写到磁盘。一旦写入数据块,元数据将随后写入日志。通过使用这种技术(称为“data=ordered”方式),即使只有元数据更改被记录到日志中,ext3 也能够提供数据和元数据的一致性。ext3 缺省使用这种方式。
结束语
最近,有许多人在尝试确定哪种 Linux 日志记录文件系统是“最好的”。实际上,没有一个针对每个应用程序都“合适的”文件系统,每个文件系统都有自身的长处。这是有这么多下一代 Linux 文件系统供选择的好处之一。所以,理解每种文件系统的长处和弱点,以便对使用哪种文件系统作出一个有根据的选择,远远优于选出一个绝对的“最好的”文件系统,并将它用于所有可能的应用程序。
Ext3 具有许多长处。它被设计得极易部署。它基于稳固的 ext2 文件系统代码,并继承了一个很好的 fsck 工具。还有,ext3 的日志记录能力经过特别设计,以确保元数据��数据的完整性。总之,ext3 确实是一个很棒的文件系统,并且是现在仍受到推崇的 ext2 文件系统的一个合格的继承者。请关注我的下一篇文章,那时我们将设置和运行 ext3。在那之前,您可能会需要查看下列参考资料。