Linux 日志文件系统
前小节介绍了早期的 Linux 系统,本小节介绍 Linux 日志系统,日志系统是给 Linux 操作系统了一些安全相关能力,日志系统和早期的系统相比,它并不是先把数据写到中间存储设备,然后再写到存储设备索引节点的,而是先把数据写道临时的中(称为日志),然后数据成功同步到存储设备和索引节点表,再对应的日志数据。本小节介绍 Linux 常见的日志系统。
1. ext3 系统介绍
ext3
系统是第三代扩展系统(Third extended filesy,缩写为 ext3
),它是日志系统,经常被用于 Linux 操作系统中,它是很多 Linux 发行版的认系统。Stephen Tweedie 在 1999 年 2 月将该系统从 2.4.15 版本的内核开始,合并到内核主线中,它是对 ext2
系统的扩展,并且它兼容 ext2
。
日志式系统的优越性在于:由于系统都有快取层参与运作,若不使用时必须将系统卸下,以便将快取层的资料写回磁盘中,因此每当系统要关机时,必须将其所有的系统全部 shutdown
后才能进行关机,若在系统尚未 shutdown
前就关机如(停电)时,下次重开机后会造成系统的资料不一致,故这时必须做系统的重整工作,将不一致与的地方修复。
然而,此一重整的工作是相当耗时的,特别是容量大的系统,而且也不能百分之百保证所有的资料都不会流失,此类系统最大的特色就是它会将整个磁盘的写入动作完整记录在磁盘的某个区域上,以便有需要时可以回溯追踪。当在某个过程中被中断时,系统可以根据这些记录直接回溯并重整被中断的部分,而不必花时间去检查其他的部分,故重整的工作速度相当快,几乎不需要花时间。
高可用性:系统使用了 ext3
系统后,即使在非正常关机后,系统也不需要系统。宕机发生后,恢复 ext3
系统的时间只要数十秒钟。
数据的完整性:ext3
系统能够极大地提高系统的完整性,避免了意外宕机对系统的破坏。在保证数据完整性方面,ext3
系统有两种模式可供选择。其中之一就是 同时保持系统及数据的一致性
模式。采用这种方式,你永远不再会看到由于非正常关机而存储在磁盘上的。
系统的速度:尽管使用 ext3
系统时,有时在存储数据时可能要多次写数据,但是,从总体上看来,ext3
比 ext2
的还要好一些。这是因为 ext3
的日志对磁盘的驱动器读写头进行了优化。所以,系统的读写较之 ext2
系统并来说,并没有降低。
数据转换:由 ext2
系统转换成 ext3
系统非常容易,只要简单地键入两条命令即可完成整个转换过程,不用花时间备份、恢复、格式化分区等。用 ext3
系统提供的小工具 tune2fs
,它可以将 ext2
系统轻松转换为 ext3
日志系统。另外,ext3
系统可以不经任何更改,而直接加载成为 ext2
系统。
多种日志模式:ext3
有多种日志模式,一种工作模式是对所有的数据及 data
(定义系统中数据的数据,即数据的数据)进行日志记录(data=journal
模式);另一种工作模式则是只对 data
记录日志,而不对数据进行日志记录,也即所谓 data=ordered
或者 data=writeback
模式。系统管理人员可以根据系统的实际工作要求,在系统的工作速度与数据的一致性之间作出选择。
2. ext4 系统介绍
ext4
是第四代扩展系统(Fourth extended filesy,缩写为 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
系统也结束实验期,成为稳定版。
更大的系统和更大的: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
) 机制。日志机制保证了在每个实际数据之前,相应的日志已经写入硬盘。与数据的安全性有了很大提高。
高效的磁盘空间利用: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
。这非常适合企业级应用中。
优异的:由于它的高效存储和小 特点,使用
ReiserFS
系统的 PC
,在启动 X
窗口系统时,所花的时间要比在同一台机器上使用 ext2
系统少 1/3
。另外,ReiserFS
系统单个尺寸为 4G
的,这为大型系统在 linux
上的应用提供了更好的选择。
搜寻方式:ReiserFS
是基于平衡树 (STree
) 的系统结构,尤其对于大量的巨型系统,如服务器上的系统,速度要比 ext2
快,ext2
使用局部的,综合比不上 ReiserFS
。在 Reiser4
中还运用了即是目录的设计来管理 -data
,并且运用了 Hans Reiser
自己发明的 Dancing B-tree
,效率提升非常明显。
空间分配和利用情况:ReiserFS
里的目录是完全动态分配的,因此不存在 ext2
中常见的无法回收巨型目录占用的磁盘空情况。ReiserFS
里小(< 4K
)可以直接存储进树,小读取和写入的速度更快,树内节点是按字节对齐的,小的可共享同硬盘块,节约大量空间。ext2
使用固定大小的块分配策略,也就是说,不到 4K
的小也要占据4K的空间,导致的空间浪费比较严重。
缺点:出现异常断电的时候,会出现大量的未写入完全的数据。ReiserFS
会在恢复的时候进行 rebuild-tree
。而这个过程是非常慢的。在 ReiserFS
的版本 Reiser4
中有所改观。
从技术层面来讲两者系统有很大的不同,但对于很多人来说,关注其中几点即可:
第一,是你可以很方便地从 ext2
格式进行,因为到目前为止,很多 Linux
发行套件仍然在使用这种系统。
第二,就是 ext3
不仅可以记录数据日志(这在 ext2
中就已经具备),而且在此基础上还可以记录元数据 (data
)日志。现在的 ReiserFS
则只有日志元数据。
第三,就是系统的可扩展性。在介绍第三点以前,让我们先来看一看前两个不同点,因为第三点值得我们特别关注。就 ext3
来说,它可以方便地从 ext2
系统进行转换是其一大优势。当然,对于一直使用 ReiserFS
的人来说,这没有什么意义。但是,大多数并不愿意尝试使用 ext3
以外的任何一种日志系统。原因很简单,把 ext2
转换到 ext3
要比转换成其它任何一种系统更简单、快捷。
4. JFS 系统介绍
JFS
( JOURNAL FILE SY
),一种字节级日志系统,借鉴了保护系统的技术,以日志的形式记录的变化。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 filesy,EFS
)正在迅速变得不适应当时激烈的计算竞争。为这个问题,SGI
决定设计一种全新的高 64 位系统,而不是试图调整 EFS
在先天设计上的某些缺陷。因此,XFS
诞生了,并于 1994 年随 IRIX 5.3
的发布而应用于计算。
数据完全性,采用 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
能以接近裸设备 的存储数据。在单个系统的测试中,其吞吐量最高可达
7GB
每秒,对单个的读写操作,其吞吐量可达 4GB
每秒。
历史上 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 系统中有多个系统,除了认使用的系统之外,还有可供选的系统。