浅谈Linux下的EXT3文件系统推荐

【EXT3的基本介绍】

1、EXT3文件系统存储单位是“块”,就好比NTFS的“簇”。格式化硬盘或分区时将所有磁盘空间分成若干个大小相同“块”。“块”大小是可以在格式化指定,也可以采用默认的。

2、块是EXT3文件系统中的数据存储单元,每个块都有一个唯一编号,从0开始。0号块起始于文件系统起始扇区。

3、EXT3文件系统将若干个块组成“块组”,每个块组大小相同。但是由于块的总数不一定是块组的整倍数,所以最后一个块组相对于其他块组要小。

4、每个块组都对应一个块组描述符,这些块组描述符统一放在文件系统的前面,对块组进行管理。

5、EXT3文件系统使用“i节点”来记录文件的时间,大小,块指针等信息;用目录项描述文件名和节点号,通过节点号就能访问其节点信息了。

6、在整个文件系统的头部,是超级快,用以描述文件系统的综合信息。

如下是EXT3文件系统的结构图

【分析超级快】

EXT3的超级块起始于文件系统的第2号扇区,占用两个扇区,0-1号扇区被引导程序占用。EXT3的超级快是一个非常重要的扇区,它记录了文件系统的很多参数。如果超级快损坏文件系统将不可用

如下是超级块的一些常见参数:

0x00~0x03:文件系统中包含的i节点总数。

0x04~0x07:文件系统中包含的总块数。

0x08~0x0B:保留块数,文件系统给自身保留的块数量。

0x0C~0x0F:空闲块数,既当前文件系统的可用块数量。

0x10~0x13:空闲i节点数,当前文件系统的可用i节点数量。

0x14~0x17:第一个数据块,既0号块组的起始起始块号。

0x18~0x1B:块大小描述值,块大小=2的N次方*1024字节,N为改参数。

0x1C~0x1F:段大小描述值,与块大小描述值相同。

0x20~0x23:块组大小描述值,既每块组中的块数量。

0x24~0x27:每块组中包含的段数,与块组大小描述符相同。

0x28~0x2B:每块中包含i节点数。

…………

此处省略部分参数解释

【分析块组描述符表】

EXT3文件系统的块组描述符表起始于超级块下面的一个块,每个块组描述符占32个字节,多个块组描述符组成了块组描述符表。如下图:是使用“Winhex”打开的块组描述符表。

块组描述的参数解释如下:

0x00~0x03:该块组的块位图起始块号。

0x04~0x07:该块组的i节点位图起始块号。

0x08~0x0B:该块组的i节点表起始块号。

0x0C~0x0D:该块组的空闲块数,既可用块数量。

0x0E~0x0F:该块组的空闲i节点数,既可用i节点数量。

0x10~0x11:该块组的目录总数。

0x12~0x13:填充。

0x14~0x1F:未用。

超级块和块组描述符表的是非常重要的,如果超级块或者块组描述符损坏,会导致文件系统不可以,因此文件系统对他们都有备份。如果文件系统不具有“稀疏超级块特性”,那么每个块组中都有超级块以及块组描述符;如果文件系统具有“稀疏超级块特性”,那么只会在3、5、7的幂中才会有备份(如:1、3、5、7、9、25、49等)。

【块位图分析】

EXT3文件系统中以块为存储单位,若干个块又组成了一个块组,在块组中块的使用情况用块位图来记录。块位图的主要特点如下:

1、每个块组中都块位图,块位图的地址在该块组描述符中有指定。

2、对于含有超级块、块组描述表以及它们的备份的块组,块位图位于块组描述表的下一个块;否则,则位于块组的第一个块。

3、在创建文件系统的时候,系统会将每个块组中的块数和块位图中的位数设置为相同。因此保证了块位图的每一位对应一个块。

4、块位图中的每个字节对应8个块(1字节=8位),第一个块对应该字节的最低位(例如:某字节的值为0xFE,转换成二进制为11111110,则第一个块对应最低位0)。如果某个块的对应为没有设置,那么则表示此块目前未使用;否则,则表示此块以使用或者是不可用。

5、计算块在文件系统中的绝对位置的公式如下:

文件系统的绝对块号=(当前偏移量-块位图的起始位置)* 8 + 块组在文件系统中的起始位置

【i节点位图分析】

EXT3文件系统中使用i节点来描述文件的元数据,i节点的使用情况由块组中的i节点位图来记录。i节点位图的基本特点如下:

1、每个块组中都有i节点位图,i节点位图的地址在该块组描述符中指定。

2、i节点位图的位置在块位图的下一个块,和块位图一样,i节点中的每个字节对应8个i节点,第一个i节点对应该字节的最低位。

3、由于i节点位图的大小小于一个块,所以i节点的大小需要使用块组描述符中i节点数除以8得出i节点位图的大小。

4、i节点从1开始编号,既第一个i节点是1号i节点而不是0号i节点。

5、计算文件系统中绝对i节点公式如下:

文件系统中绝对i节点=(当前偏移量-i节点位图的起始位置)* 8 + 改块组的第一个i节点号

【i节点分析】

EXT3文件系统的i节点用来存储除文件名以外的所有信息,i节点的主要特点如下:

1、文件系统中每个块组都有自己的i节点,每个文件或目录占用一个i节点,若干个i节点组成i节点表。

2、i节点位于i节点位图的下一个块,在超级块中记录了文件传统中i节点的总数,在块组描述符中记录了本块组i节点的总数。

3、每个i节点的大小为128字节,也可以定义大于128字节的“大i节点”。

4、每个i节点都有编号,第一个i节点编号为1,1~10号i节点为系统保留,2号i节点被分配给根目录使用。

5、如果已知一个i节点号,计算该i节点所在的块组公式如下:

(i节点号-1)DIV 每块组i节点数

如下:是使用Winhex打开的一个完整的i节点

如下:是各参数的解释

这里重点解释一下“直接块指针”和“间接块指针”。

在EXT3文件系统中一个有15个块指针,分别是12直接块指针、1个间接块指针、1个二级间接块指针、1个三级间接块指针。12个直接块指针直接指向文件的内容,如果文件的内容大于12个块,那么第13个间接块指针所指向的块记录直接块指针而不是文件内容,直接块指针再指向文件内容。如果间接块指针也不够用时,就需要二级间接块指针了,二级间接指针指向的块记录间接块指针。以此类推,不做多解释,如果二级间接块指针还不够用时就需要三级间接块指针了。

【分析目录项】

目录项用来存放文件或目录的i节点号、目录项的长度、文件名等信息,他们存储在分配给目录项的块中。目录项的主要特点如下:

1、目录项存储在目录区中,i节点内有描述目录区地址的块指针。

2、目录项的长度是不固定,随文件名的长度不同而不同,文件名最长为255个字符。

3、虽然目录项的长度不固定,但是其长度一定是4字节的倍数,如果文件名不够4字节的倍数,则在尾部填0补齐。

4、目录区中的前两个项一个是“.”和“..”,分别表示当前目录和上一级目录。

5、每个目录项中有一个长度值指向下一个目录项,最后一个目录项的长度则指向本块的结尾处。

如下:是使用Winhex打开的文件系统根目录

其中各目录项的解释如下:

【分析EXT3文件系统的底层存储结构】

EXT3文件系统首相被分成若干个块组,并通过块组描述符描述这些块组,所有块组描述符组成块组描述表,块组描述表位于超级块的下一个块。文件以块为单位进行存储,每个文件都有自己的i节点以及目录项,i节点中记录了文件的大小、时间信息、块指针等信息,而目录项则记录了文件的i节点号、文件名等信息。将i节点和目录项结合起来分析,就可以得出文件的所有信息,并通过块指针定位到数据存放的地址,块指针所指向的块就是文件的内容。

综合上述,EXT3文件系统可以用一副图来描述其内部结构。如下图:

分析EXT3内部存储结构的步骤如下:

1、读取超级块和块组描述符的参数

超级块位于2号扇区,从超级块中可以获取一下参数。

块大小、每块组包含的块数、每块组包含的i节点数、i节点大小等等。

块组描述符位于超级块的下一个块,从块组描述符中可以获取一下参数。

该块组i节点表的起始位置等等。

2、读取i节点表

我们知道1~10号i节点为系统 保留,2号i节点被分配给根目录使用,所以我们找到2号i节点,根据i节点中的直接块指针可以找到根目录。

3、读取根目录区

根据i节点的直接块指针,我们找到了根目录,我们可以在根目录项中分析我们需要的目录i节点,并计算出该目录所在的块组。计算公式如下:(目录i节点号 – 1)DIV 每块组中的i节点数

计算出该目录所在的块组之后,还需要计算出该i节点号对应该块组的几号i节点。计算公式如下:

[(目录i节点号 – 1)MOD 每块组中的i节点数 ] + 1

4、读取子目录区

根据上述的方法我已经可以定位到子目录区了,在子目录中我们可以分析我们需要的子目录或文件i节点了。如果是文件,则查看i节点内的直接块指针所指向块的内容,如果有间接指针,则分析间接指针。如果还有子目录,则按照上述的方法进行计算块组,计算块组中的i节点号即可。

呼…终于写完了,下班后本来没打算写的,后来还是坚持写下来了。虽然以是凌晨了,不过感觉还是挺值得的。只要坚持,没有什么事做不到的,相信自己。

作者:邓奇

回避现实的人,未来将更不理想。

浅谈Linux下的EXT3文件系统推荐

相关文章:

你感兴趣的文章:

标签云: