EXT4第四代扩展文件系统是Linux系统下的日志文件系统,是ext3文件系统的后继版本。Ext4是由Ext3的维护者Theodore Tso领导的开发团队实现的,并引入到Linux2.6.19内核中。
EXT4是第四代扩展文件系统(英语:Fourth extended filesystem,缩写为 ext4)是 Linux 系统下的日志文件系统,是 ext3 文件系统的后继版本。Ext4 是由 Ext3 的维护者 Theodore Tso 领导的开发团队实现的,并引入到 Linux2.6.19 内核中。
Ext4 产生原因是开发人员在 Ext3 中加入了新的高级功能,但在实现的过程出现了几个重要问题:
(1)一些新功能违背向后兼容性
(2)新功能使 Ext3 代码变得更加复杂并难以维护
(3)新加入的更改使原来十分可靠的 Ext3 变得不可靠。
由于这些原因,从 2006 年 6 月份开始,开发人员决定把 Ext4 从 Ext3 中分离出来进行独立开发。Ext4 的开发工作从那时起开始进行,但大部分 Linux 用户和管理员都没有太关注这件事情,直到 2.6.19 内核在 2006 年 11 月的发布。Ext4 第一次出现在主流内核里,但是它当时还处于试验阶段,因此很多人都忽视了它。
2008 年 12 月 25 日,Linux Kernel 2.6.28 的正式版本发布。随着这一新内核的发布,Ext4 文件系统也结束实验期,成为稳定版。
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 日。
Ext4 文件系统的向前和向后兼容
Ext4 文件系统在 Ext3 的基础之上做了很多改进,引入了大量新功能,这些改进主要是为了提高未来的 Linux 系统的性能。
虽然 Ext4 做了很多改进,但依然能够与 Ext3 实现向后和向前的兼容性,这一点的确很难得。
因为 Ext3 文件系统是 Linux 操作系统上最受欢迎的文件系统之一,所以 Ext4 的研发人员考虑到应该让 Ext3 用户能够轻松迁移到 Ext4,为此,Ext4 被设计为在盘区结构方面具有向后和向前的兼容性。
首先 Ext4 是可以向前兼容的,也就是说 Ext3 文件系统可以挂载为 Ext4 文件系统使用,不过为了充分利用 Ext4 的优势,必须实现文件系统的迁移,以转换和利用新的 Ext4 格式。
Ext3 文件系统可以在线转换为 Ext4,但这样并不能用到 Ext4 的全部新特性,只有将文件系统重新创建为 Ext4 才比较彻底。
Ext4 的向后兼容,向后兼容就是指可以将 Ext4 文件系统挂载为 Ext3 文件系统使用,但是前提是 Ext4 文件系统不能使用盘区功能。
如何使用 Ext4
目前的 Ext4 文件系统是第一个稳定版本,整个的开发进度和发布计划都被放缓了,就是为了保证用户可以享受到“和使用 Ext3 同等级”的稳定。
一个非常重要的事情是,目前还没有 Ext4 Grub。更准确的说,就是目前没有 grub 支持 ext4。换句话说,就是你目前的发行版本的 grub 不支持 ext4。目前我们的 Grub2 正在开发之中,在 ubuntu 和 debian 发行版中已经有了 grub2 的 grub-pc 软件包了,但是目前官方仍没有宣布正式支持。在 Google SoC 中也包含了一个开发版本,且发布了相关补丁。你可以试用一下,你自己选择喽。
在你的发行版本的下一个新版本之中,可能会有相关的支持出现。所以安全起见,尽量保持你的/boot 目录为 Ext3 文件系统类型。
警告归警告,转换到 Ext4 其实是件很容易的事情,如下方法均可:
1 建立 Ext4 文件系统。
这是最简单的方法,你只需要升级你的 e2fsprogs 到 Ext4,并且使用 mkfs.ext4 命令创建文件系统即可。
2 从 Ext3 迁移到 Ext4。
你需要使用 tune2fs 命令和 fsck 命令,并且当前文件系统需要被卸载才可以。运行命令
tune2fs -O extents,uninit_bg,dir_index /dev/yourfilesystem
此后,你务必运行 fsck 命令,否则 Ext4 将无法挂载你的新文件系统。在 fsck 过程中,可能会有一些 error 需要你的确认。你可以考虑使用 -p 选项,来告诉 fsck 你想要的是“automatic repair”,即 fsck -pf /dev/yourfilesystem
3 用 Ext4 挂载 Ext3 文件系统。
你可以使用 mount -t ext4 /dev/yourpartition /mnt 来将一个 Ext3 文件系统用 Ext4 来挂载,但你将享受不到那些需要改变磁盘格式才可以享受得到的特性,比如 Extents。你可以享受到的只有 那些不需要改变磁盘格式即可享受得到的特性,比如多块分配、延迟分配等。我们当然不建议您这么做,因为 Ext4 的优秀特性,您将无法体会。