前言

本篇将学习 Ext3 文件系统的介绍、结构。

知识点总览

  • Ext3 文件系统的介绍
  • Ext3 文件系统的结构

Ext3 文件系统的介绍

简介

第三代扩展文件系统(英语:Third extended filesystem,缩写为 ext3),是一个日志文件系统,常用于 Linux 操作系统。它是很多 Linux 发行版的默认文件系统。

Stephen Tweedie 在 1999 年 2 月的内核邮件列表中,最早显示了他使用扩展的 ext2,该文件系统从 2.4.15 版本的内核开始,合并到内核主线中。

The third extension to the Ext filesystem, logically known as Ext3, features a journal in which actions performed on the filesystem data are saved. This helps to considerably shorten the run time of fsck 21 following a system crash.

21. On filesystems with several hundred gigabytes, consistency checks may take a few hours depending on system speed. This downtime is not acceptable on servers. But even PC users appreciate the fact that consistency checks take just a few seconds rather than several minutes.

Professional Linux® Kernel Architecture --Wolfgang Mauerer

Ext3 文件系统提供了一种日志(journal)特性,记录了对文件系统数据所进行的操作。在发生系统崩溃之后,该机制有助于缩短 fsck 的运行时间。

在有几百 G 字节的文件系统上,一致性检查可能会耗费几个小时,具体的时间取决于系统的速度。对服务器来说,
如此长的停机时间是不可接受的。但如果一致性检查只耗费几秒钟,而不是几分钟,那么即使 PC 用户也双手赞成。

相比于 Ext2 文件系统,Ext3 文件系统主要新增了 Journal(日志)特性,以及为了适配后续的 Ext4 文件系统,对 Ext2 文件系统的一些特性进行了修改,弃用了部分 Ext2 文件系统的特性。

Ext3 文件系统是对 Ext2 的继承和发展,它的结构和 Ext2 文件系统的结构基本一致,只是在 Ext2 文件系统的基础上增加了日志功能,以及对 Ext2 文件系统的一些特性进行了修改。

结构特点

Ext 系列的文件系统是基于 UFS 文件系统而设计的,所以它们具有 UFS 的很多特性,Ext3 也同样跟 UFS 有许多相似之处,下面首先谈一谈 Ext3 文件系统的结构特点。

  1. Ext3 文件系统所在区域首先被划分为一个个的块(Block),每个块大小都是一样的,但是对于不同的 Ext3 文件系统,块的大小可以有区别。

    典型的块大小是 1024 字节、2048 字节或者 4096 字节。

    这个大小在创建文件系统的时候被决定,它可以由系统管理员指定,也可以由文件系统的创建程序根据硬盘分区的大小,自动选择一个较合理的值。

  2. 块是文件系统中数据的分配单元,每个块都有一个唯一的编号,第一个块的编号为 0,然后依次往后编,0 号块起始于文件系统的开始扇区。

  3. Ext3 文件系统的块被组合在一起分成几个大的块组(Block Group),每个块组中块数是相同的

    由于文件系统的总扇区数并不一定是块组所包含扇区数的整数倍,这将导致最后一个块组的大小与其他块组不同,也就是说文件系统的最后一个块组往往会小于其他块组。

  4. 每个块组都相对应一个块组描述符(Group Descriptor),这些块组描述符统一放在文件系统的前部,对块组进行管理。

  5. Ext3 文件系统用i-节点描述文件的时间信息、大小、块指针等信息;

    用目录项描述文件名和节点号,通过节点号就能访问其节点信息了。

  6. 在文件系统的头部,是超级块,用以描述文件系统的综合信息。

Ext3 文件系统的结构

类似于 FAT32 文件系统中以 的形式划分磁盘空间,Ext3 文件系统中以 的形式划分磁盘空间,每个块的大小都是固定的,一般为 1024 字节、2048 字节或者 4096 字节,这个大小在创建文件系统的时候被决定,它可以由系统管理员指定,也可以由文件系统的创建程序根据硬盘分区的大小,自动选择一个较合理的值。

Ext3 文件系统的全部空间被划分为若干个块组,每个块组内有若干个块,每个块组都相对应一个块组描述符,这些块组描述符统一放在文件系统的前部,对块组进行管理。

每个块组内的结构都是大致相同的,Ext3 文件系统的整体结构及第一个块组的具体结构如下图所示。

由图所示,Ext3 文件系统的前两个扇区用来存放引导程序,称为引导扇区。如果没有引导程序则保留不用的,一般为空扇区,没有任何数据。

Ext3 文件系统的第三个扇区也就是 2 号扇区是“超级块”,超级块占用两个扇区,用于存储文件系统的配置参数(如块大小、总块数和 i-节点数)和动态信息(如当前空闲块数和 i-节点数)。

块组描述符表用于存储块组描述符,占用一个或者多个块,具体取决于文件系统的大小。每个块组描述符主要描述块位图、i-节点位图及 i-节点表的地址等信息。

为了系统的健壮性,Linux 最初在每个块组内都对超级块和块组描述符表做了备份,但是当文件系统很大时,这将浪费很多空间,尤其是块组描述符表占用的块比较多时,所以后来采用了一种稀疏的方式来存储这些备份,也就是只在块组号是 3、5、7 的幂的块组(如 1、3、5、7、9、25、49 等)内才对超级块和块组描述符表做备份。

这也对后续的分区恢复提供了便利,因为只要找到一个备份的块组,就可以从中恢复出整个文件系统的信息。

通常情况下,只有 0 号块组的超级块信息被文件系统使用,其他备份只有在主超级块被破坏的情况下才使用。

块位图用于描述本块组所管理的块的分配状态,块位图中的每一位映射本块组中的一个块,如果某个块对应的位没有设置,那么代表该块未分配,可以用于存储数据;否则,代表该块已经存放了数据或者该块不能够使用(比如该块号在物理上不存在)。

i-节点位图用于描述本块组所管理的 i-节点的分配状态,i-节点位图中的每一位映射本块组中的一个 i-节点。如果 i-节点位图中相应的位被置 1,代表该 i-节点已经使用;否则表示未用。

i-节点用于描述文件的元数据,每个 i-节点对应文件系统中唯一的节点号。