Linux 日志文件系统
前小节介绍了早期的 Linux 文件系统,本小节介绍 Linux 日志文件系统,日志文件系统是给 Linux 操作系统增加了一些安全相关能力,日志文件系统和早期的文件系统相比,它并不是先把数据写到中间存储设备,然后再写到存储设备索引节点的,而是先把数据写道临时生成的文件中(称为日志),然后数据成功同步到存储设备和索引节点表,再删除对应的日志数据。本小节介绍 Linux 常见的日志文件系统。
1. ext3 文件系统介绍
ext3
文件系统是第三代扩展文件系统(Third extended filesystem,缩写为 ext3
),它是一个日志文件系统,经常被用于 Linux 操作系统中,它是很多 Linux 发行版的默认文件系统。Stephen Tweedie 在 1999 年 2 月将该文件系统从 2.4.15 版本的内核开始,合并到内核主线中,它是对 ext2
系统的扩展,并且它兼容 ext2
。
日志式文件系统的优越性在于:由于文件系统都有快取层参与运作,若不使用时必须将文件系统卸下,以便将快取层的资料写回磁盘中,因此每当系统要关机时,必须将其所有的文件系统全部 shutdown
后才能进行关机,若在文件系统尚未 shutdown
前就关机如(停电)时,下次重开机后会造成文件系统的资料不一致,故这时必须做文件系统的重整工作,将不一致与错误的地方修复。
然而,此一重整的工作是相当耗时的,特别是容量大的文件系统,而且也不能百分之百保证所有的资料都不会流失,此类文件系统最大的特色就是它会将整个磁盘的写入动作完整记录在磁盘的某个区域上,以便有需要时可以回溯追踪。当在某个过程中被中断时,系统可以根据这些记录直接回溯并重整被中断的部分,而不必花时间去检查其他的部分,故重整的工作速度相当快,几乎不需要花时间。
1.1 ext3 日志文件系统特点
- 高可用性:系统使用了
ext3
文件系统后,即使在非正常关机后,系统也不需要检查文件系统。宕机发生后,恢复ext3
文件系统的时间只要数十秒钟。 - 数据的完整性:
ext3
文件系统能够极大地提高文件系统的完整性,避免了意外宕机对文件系统的破坏。在保证数据完整性方面,ext3
文件系统有两种模式可供选择。其中之一就是同时保持文件系统及数据的一致性
模式。采用这种方式,你永远不再会看到由于非正常关机而存储在磁盘上的垃圾文件。 - 文件系统的速度:尽管使用
ext3
文件系统时,有时在存储数据时可能要多次写数据,但是,从总体上看来,ext3
比ext2
的性能还要好一些。这是因为ext3
的日志功能对磁盘的驱动器读写头进行了优化。所以,文件系统的读写性能较之ext2
文件系统并来说,性能并没有降低。 - 数据转换:由
ext2
文件系统转换成ext3
文件系统非常容易,只要简单地键入两条命令即可完成整个转换过程,用户不用花时间备份、恢复、格式化分区等。用一个ext3
文件系统提供的小工具tune2fs
,它可以将ext2
文件系统轻松转换为ext3
日志文件系统。另外,ext3
文件系统可以不经任何更改,而直接加载成为ext2
文件系统。 - 多种日志模式:
ext3
有多种日志模式,一种工作模式是对所有的文件数据及metadata
(定义文件系统中数据的数据,即数据的数据)进行日志记录(data=journal
模式);另一种工作模式则是只对metadata
记录日志,而不对数据进行日志记录,也即所谓data=ordered
或者data=writeback
模式。系统管理人员可以根据系统的实际工作要求,在系统的工作速度与文件数据的一致性之间作出选择。
2. ext4 文件系统介绍
ext4
是第四代扩展文件系统(Fourth extended filesystem,缩写为 ext4
),它是 Linux 系统下的日志文件系统,是 ext3
文件系统的后继版本。ext4
是由 ext3
的维护者 Theodore Tso
领导的开发团队实现的,并引入到 Linux2.6.19 内核中。ext4
产生原因是开发人员在 ext3
中加入了新的高级功能,但在实现的过程出现了一些重要问题:
- 一些新功能违背向后兼容性;
- 新功能使
ext3
代码变得更加复杂并难以维护; - 新加入的更改使原来十分可靠的
ext3
变得不可靠。
由于上述原因,从 2006 年 6 月份开始,开发人员决定把 ext4
从 ext3
中分离出来进行独立开发。ext4
的开发工作从那时起开始进行,但大部分 Linux 用户和管理员都没有太关注这件事情,直到 2.6.19 内核在 2006 年 11 月的发布。ext4
第一次出现在主流内核里,但是它当时还处于试验阶段,因此很多人都忽视了它。
2008 年 12 月 25 日,Linux Kernel 2.6.28
的正式版本发布。随着这一新内核的发布,ext4
文件系统也结束实验期,成为稳定版。
2.1 ext4 文件系统的特点
- 更大的文件系统和更大的文件:
ext3
文件系统最多只能支持32TB
的文件系统和2TB
的文件,根据使用的具体架构和系统设置,实际容量上限可能比这个数字还要低,即只能容纳2TB
的文件系统和16GB
的文件。而ext4
的文件系统容量达到1EB
,而文件容量则达到16TB
,这是一个非常大的数字了。对一般的台式机和服务器而言,这可能并不重要,但对于大型磁盘阵列的用户而言,这就非常重要了。 - 更多的子目录数量:
ext3
目前只支持32000
个子目录,而ext4
取消了这一限制,理论上支持无限数量的子目录。 - 更多的块和i-节点数量:
ext3
文件系统使用 32 位空间记录块数量和 i-节点数量,而ext4
文件系统将它们扩充到64
位。 - 多块分配:当数据写入到Ext3文件系统中时,Ext3的数据块分配器每次只能分配一个4KB的块,如果写一个
100MB
的文件就要调用25600
次数据块分配器,而Ext4的多块分配器Multiblock Allocator(MBAlloc)
支持一次调用分配多个数据块。 - 持久性预分配:如果一个应用程序需要在实际使用磁盘空间之前对它进行分配,大部分文件系统都是通过向未使用的磁盘空间写入
0
来实现分配,比如P2P
软件。为了保证下载文件有足够的空间存放,常常会预先创建一个与所下载文件大小相同的空文件,以免未来的数小时或数天之内磁盘空间不足导致下载失败。而ext4
在文件系统层面实现了持久预分配并提供相应的API
,比应用软件自己实现更有效率。 - 延迟分配:
ext3
的数据块分配策略是尽快分配,而ext4
的策略是尽可能地延迟分配,直到文件在缓冲中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,显著提升性能。 - 盘区结构:
ext3
文件系统采用间接映射地址,当操作大文件时,效率极其低下。例如,一个100MB
大小的文件,在ext3
中要建立25600
个数据块(以每个数据块大小为4KB
为例)的映射表,而ext4
引入了盘区概念,每个盘区为一组连续的数据块,上述文件可以通过盘区的方式表示为该文件数据保存在接下来的 25600 个数据块中
,提高了访问效率。 - 新的i-节点结构:
ext4
支持更大的i-节点
。之前的ext3
默认的i-节
点大小128
字节,ext4
为了在i-节点
中容纳更多的扩展属性,默认i-节点
大小为 256 字节。另外,ext4
还支持快速扩展属性和i-节点
保留。 - 日志校验功能:日志是文件系统最常用的结构,日志也很容易损坏,而从损坏的日志中恢复数据会导致更多的数据损坏。
ext4
给日志数据添加了校验功能,日志校验功能可以很方便地判断日志数据是否损坏。而且ext4
将ext3
的两阶段日志机制合并成一个阶段,在增加安全性的同时提高了性能。 - 支持无日志模式:日志总归会占用一些开销。
ext4
允许关闭日志,以便某些有特殊需求的用户可以借此提升性能。 - 默认启用Barrier:磁盘上配有内部缓存,以便重新调整批量数据的写操作顺序,优化写入性能,因此文件系统必须在日志数据写入磁盘之后才能写
Commit
记录。若Commit
记录写入在先,而日志有可能损坏,那么就会影响数据完整性。ext4
文件系统默认启用Barrier
,只有当Barrier
之前的数据全部写入磁盘,才能写Barrier
之后的数据。 - 在线碎片整理:尽管延迟分配、多块分配和盘区功能可以有效减少文件的碎片,但碎片还是不可避免会产生。
ext4
支持在线碎片整理,并将提供e4defrag
工具进行个别文件或整个文件系统的碎片整理。 - 支持快速fsck:以前的文件系统版本执行
fsck
时很慢,因为它要检查所有的i-节点
,而ext4
给每个块组的i-节点
表中都添加了一份未使用i-节点的列表,所以ext4
文件系统做一致性检查时就可以跳过它们而只去检查哪些在使用的i-节点
,从而提高了速度。 - 支持纳秒级时间戳:
ext4
之前的扩展文件系统的时间戳都是以秒为单位的,这已经能够应付大多数设置,但随着处理器的速度和集成程度(多核处理器)不断提升,以及Linux
开始向其他应用领域发展,它将时间戳的单位提升到纳秒。ext4
给时间范围增加了两个位,从而让时间寿命在延长500
年,ext4
的时间戳支持的日期到 2514 年 4 月 25 日,而ext3
只达到 2038 年 1 月 18 日。
3. ReiserFS 文件系统介绍
ReiserFS
是一种新型的文件系统,它通过一种与众不同的方式,完全平衡树结构来容纳数据,包括文件数据,文件名以及日志支持。ReiserFS
还以支持海量磁盘和磁盘阵列,并能在上面继续保持很快的搜索速度和很高的效率。与 ext2
相比,ReiserFS
有先进的日志 (Journaling/logging
) 功能 机制。日志机制保证了在每个实际数据修改之前,相应的日志已经写入硬盘。文件与数据的安全性有了很大提高。
3.1 ReiserFS 文件系统的特点
- 高效的磁盘空间利用:
ReiserFS
对一些小文件不分配inode
。而是将这些文件打包,存放在同一个磁盘分块中。而其它文件系统则为每个小文件分别放置到一个磁盘分块中。这意味着:如果有10000
个小文件,就要占用10000
个分块,有点浪费磁盘空间。 - 独特的搜寻方式:
ReiserFS
基于快速平衡树 (balanced tree
) 搜索,平衡树在性能上非常卓越,这是一种非常高效的算法。Reiser
搜索大量文件时,搜索速度要比ext2
快得多。ReiserFS
文件系统使用B*Tree
存储文件,而其它文件系统使用B+Tree
树。B*Tree
查询速度比B+Tree
要快很多。ReiserFS
在文件定位上速度非常快。
在实际运用中,ReiserFS
在处理小于 1k
的文件时,比 ext2
快 8 到 15 倍,ReiserFS
几乎在各个方面都优于 ext2
。
- 支持海量磁盘:
ReiserFS
是一个非常优秀的文件系统,可轻松管理上百G
的文件系统,ReiserFS
文件系统最大支持的文件系统尺寸为16TB
。这非常适合企业级应用中。 - 优异的性能:由于它的高效存储和快速小文件
I/O
特点,使用ReiserFS
文件系统的PC
,在启动X
窗口系统时,所花的时间要比在同一台机器上使用ext2
文件系统少1/3
。另外,ReiserFS
文件系统支持单个文件尺寸为4G
的文件,这为大型数据库系统在linux
上的应用提供了更好的选择。 - 搜寻方式:
ReiserFS
是基于平衡树 (STree
) 的文件系统结构,尤其对于大量文件的巨型文件系统,如服务器上的文件系统,搜索速度要比ext2
快,ext2
使用局部的二分查找法,综合性能比不上ReiserFS
。在Reiser4
中还运用了文件即是目录的设计来管理meta-data
,并且运用了Hans Reiser
自己发明的Dancing B-tree
,效率提升非常明显。 - 空间分配和利用情况:
ReiserFS
里的目录是完全动态分配的,因此不存在ext2
中常见的无法回收巨型目录占用的磁盘空间的情况。ReiserFS
里小文件(< 4K
)可以直接存储进树,小文件读取和写入的速度更快,树内节点是按字节对齐的,小的文件可共享同一个硬盘块,节约大量空间。ext2
使用固定大小的块分配策略,也就是说,不到4K
的小文件也要占据4K的空间,导致的空间浪费比较严重。 - 缺点:出现异常断电的时候,会出现大量的未写入完全的数据。
ReiserFS
会在恢复的时候进行rebuild-tree
。而这个过程是非常慢的。在ReiserFS
的升级版本Reiser4
中有所改观。
3.2 ReiserFS 与 ext3 的比较
从技术层面来讲两者文件系统有很大的不同,但对于很多人来说,关注其中几点即可:
- 第一,是你可以很方便地从
ext2
格式进行升级,因为到目前为止,很多Linux
发行套件仍然在使用这种文件系统。 - 第二,就是
ext3
不仅可以记录数据日志(这在ext2
中就已经具备),而且在此基础上还可以记录元数据 (Metadata
)日志。现在的ReiserFS
则只有日志元数据。 - 第三,就是文件系统的可扩展性。在介绍第三点以前,让我们先来看一看前两个不同点,因为第三点值得我们特别关注。就
ext3
来说,它可以方便地从ext2
文件系统进行升级转换是其一大优势。当然,对于一直使用ReiserFS
的人来说,这没有什么意义。但是,大多数用户并不愿意尝试使用ext3
以外的任何一种日志文件系统。原因很简单,把ext2
转换到ext3
要比转换成其它任何一种文件系统更简单、快捷。
4. JFS 文件系统介绍
JFS
( JOURNAL FILE SYSTEM
),一种字节级日志文件系统,借鉴了数据库保护系统的技术,以日志的形式记录文件的变化。JFS通过记录文件结构而不是数据本身的变化来保证数据的完整性。这种方式可以确保在任何时刻都能维护数据的可访问性。
4.1 JFS 体系结构和设计
- 体系结构和设计,
JFS
体系结构可从磁盘布局特性的角度进行说明。 - 逻辑,卷所有文件系统讨论的基础是某种类型的逻辑卷。
- 聚集和文件集,文件系统创建实用程序
mkfs
,创建了完全包含在分区内的聚集。聚集是包含一种特定格式的磁盘块阵列,其格式包括超级块和分配映射表。超级块将分区标识成JFS
聚集,而分配映射表描述聚集内每个数据块的分配状态。格式还包括描述它所必需的初始文件集和控制结构。文件集是可安装的实体。 - 文件、目录、inode 与寻址结构,文件集包含文件和目录。文件和目录由
inode
持续表示,每个inode
描述文件或目录的属性,并作为查找磁盘上文件或目录数据的起始点。JFS
还使用inode
来表示其它文件系统对象,如描述文件集中每个inode
的分配状态和磁盘位置的映射表。目录将用户特定的名称映射到为文件和目录所分配的inode
上,并且形成传统的命名层次。文件包含用户数据,用户数据中没有隐含任何限制或格式。也就是说,JFS
将用户数据看成是未解释的字节流。根植于inode
基于盘区的寻址结构用来将文件数据映射到磁盘。聚集超级块和磁盘分配映射表、文件描述符和inode
映射表、inode
、目录以及寻址结构一起表示了JFS
控制结构或元数据。 - 日志,在每个聚集中维护
JFS
日志,并且用来记录元数据的操作信息。日志有一种同样由文件系统创建实用程序设置的格式。聚集内多个安装的文件集可以同时使用一个日志。
5. XFS 文件系统介绍
XFS
一种高性能的日志文件系统,最早于 1993 年,由 Silicon Graphics
为他们的 IRIX
操作系统而开发,是 IRIX 5.3
版的默认文件系统。2000 年 5 月,Silicon Graphics
以 GNU
通用公共许可证发布这套系统的源代码,之后被移植到 Linux
内核上。XFS
特别擅长处理大文件,同时提供平滑的数据传输。SGI
发现他们的现有文件系统(existing filesystem,EFS
)正在迅速变得不适应当时激烈的计算竞争。为解决这个问题,SGI
决定设计一种全新的高性能 64 位文件系统,而不是试图调整 EFS
在先天设计上的某些缺陷。因此,XFS
诞生了,并于 1994 年随 IRIX 5.3
的发布而应用于计算。
5.1 XFS 文件系统的特点
- 数据完全性,采用
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
每秒。
5.2 XFS 文件系统的缺点
历史上 XFS
上的元数据操作曾比其它文件系统都慢,表现为在删除大量小文件时性能糟糕。该性能问题是被 Red Hat
的 XFS
开发者 Dave Chinner
在代码中定位到的。使用一个叫 “延迟记录” 的挂载选项可以成数量级地提升元数据操作的性能。该选项几乎把日志整个存在内存中。Linux
内核主线版本 2.6.35
中作为一个试验性特性引入了这个补丁,在 2.6.37
中使它成为了一个稳定的特性,并计划在 2.6.39
中把它作为默认的日志记录方法。早期测试显示在有少量线程的环境中其性能接近 EXT4
,在大量线程的环境下超过了 EXT4
。
6. 小结
本小节介绍了 ext3
、ext4
、ReiserFS
、JFS
、XFS
日志相关的文件系统的特点,日志文件系统为 Linux 系统增加了一层安全性,熟悉这些文件系统之后,你就知道了 Linux 系统中有多个文件系统,除了默认使用的文件系统之外,还有可供选的文件系统。