1、前言
熟悉Linux操作系统的都应该或多或少的了解或者使用过Ext4文件系统。
接下来,会简单介绍Ext4文件系统的一些特性和工作原理。
2、常用概念
在介绍Ext文件系统之前,先简单描述一些相关概念。
块(Block):Ext文件系统存储分配的基本单位。块是由多个簇构成的集合,大小在1KB和64KB之间。默认情况下块大小=4KB。 默认情况下文件系统最多可以管理232块。但是当指定64位特性时,最多可以管理264块。
块组(Block Group):多个块联合在一起称之为块组。每个块组中都存储着本块组的超级块、组描述符、块位图和索引节点位图。
超级块(Super Block):超级块记录整个文件系统的大量信息,如数据块个数、inode个数、支持的特性、管理信息等。
组描述符(Group Descriptors):文件系统每一个块组都对应有一个块组描述符,它是块组中的第二个内容。组描述符记录了位图和inode表的位置信息。
块位图(Block Bitmap)/索引节点位图(Inode Bitmap):块位图跟踪块组中数据块使用情况。Inode位图跟踪块组中Inode使用情况。每个位图一个数据块,每一位用0或1表示一个块组中数据块或inode表中inode的使用情况。
索引节点表(Inode Table):用于存储文件的Inode信息。
3、磁盘分布
EXT4文件系统的标准磁盘布局如下:
4、常用特性
4.1 sparse super
从上一章节中可以看出,超级块和组描述符在每一个块组中都存在冗余备份。而这种方式虽然保证了文件系统的稳健性,但无疑造成了磁盘空间的浪费。因此Ext4提供了2种超级块冗余备份的方式。
- RO_COMPAT_SPARSE_SUPER
超级块和组描述符的冗余备份仅存放在编号为0或3、5、7的幂次方的块组中。 - COMPAT_SPARSE_SUPER2
只提供了2个超级块的冗余备份,分别位于block group 1和最后一个block group。
4.2 flex bg
开启灵活块组特性(INCOMPAT_FLEX_BG)后,文件系统会将多个连续块组的块位图、Inode位图和inode表合并到一起,从而有效减少磁盘寻道时间。
Flex_bg中块组的个数存储在超级块中,默认灵活块组中的块组数 = 16。下图为开启flex bg和sparse super后的磁盘结构。
4.3 meta bg
通常,在每个冗余备份的超级块的后面是一个完整的(包含所有块组描述符的)块组描述符表的备份。
这样会产生一个限制,按照块大小=4096,组块大小=128M= 2^27 ,组块描述符=64计算,一个块组最多可以管理:2^27 / 64 = 2^21组块,即文件系统最大支持256TB。
使用元块组Meta元组特性,每个块组都包含该块组自己的描述符的冗余备份。目前 Ext4最大支持的是48bits block寻址方式,所以最大卷大小为2 ^ 48 个block,一个块组128MB,因而可以创建2 ^ 33个块组。下图为开启meta bg和sparse super后的磁盘结构。
注意:meta bg和flex bg特性可以同时使用。
5、工作方式
说到Ext文件系统的工作方式之前,首先要说到的就是Inode。那么,Inode究竟是什么呢?
inode (索引节点):
- 记录文件的权限、属性和数据所在块block的号码
- 每个文件都有且仅有一个的inode,每个inode都有自己的编号,可以把inode简单地理解为文档索引。
在linux中,无论文件还是文件夹都通过inode来管理。
举个例子,当我们想要查看某个文件的内容时,
- 首先要读取根目录**(Inode 2),根据直接/间接块寻址(Direct/Indirect Block Addressing)或者扩展树(Extent Tree)的方式解析inode.i_block**内容。
- 根据文件夹布局是**经典线性布局(Linear Classic Directories)还是hash树(Hash Tree Directories)**布局,遍历根目录下的所有inode和文件名,
- 当找到匹配的文件夹名后,在打开匹配文件夹的inode,继续遍历,反复执行,直到找到对应的文件。
- 找到文件后按照同样的方式解析inode.i_block,获取文件内容。