浅谈Linux下的EXT3文件系统

【EXT3的基本介绍】
ide

一、EXT3文件系统存储单位是“块”,就比如NTFS的“簇”。格式化硬盘或分区时将全部磁盘空间分红若干个大小相同“块”。“块”大小是能够在格式化指定,也能够采用默认的。spa

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

三、EXT3文件系统将若干个块组成“块组”,每一个块组大小相同。可是因为块的总数不必定是块组的整倍数,因此最后一个块组相对于其余块组要小。指针

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

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

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


以下是EXT3文件系统的结构图io

wKiom1LUu3OBEyX1AADsV8ccK3w710.jpg


【分析超级快】class

   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”打开的块组描述符表。

wKioL1LUxHqyqyhHAAJvQF94HRQ635.jpg

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

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

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

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

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

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

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

0x12~0x13:填充。

0x14~0x1F:未用。

超级块和块组描述符表的是很是重要的,若是超级块或者块组描述符损坏,会致使文件系统不能够,所以文件系统对他们都有备份。若是文件系统不具备“稀疏超级块特性”,那么每一个块组中都有超级块以及块组描述符;若是文件系统具备“稀疏超级块特性”,那么只会在三、五、7的幂中才会有备份(如:一、三、五、七、九、2五、49等)。


【块位图分析】

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

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

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

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

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

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

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


【i节点位图分析】

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

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

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

三、因为i节点位图的大小小于一个块,因此i节点的大小须要使用块组描述符中i节点数除以8得出i节点位图的大小。

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

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

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


【i节点分析】

   EXT3文件系统的i节点用来存储除文件名之外的全部信息,i节点的主要特色以下:

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

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

三、每一个i节点的大小为128字节,也能够定义大于128字节的“大i节点”。

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

五、若是已知一个i节点号,计算该i节点所在的块组公式以下:

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

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

wKiom1LVUlDQS7iUAAIgpzwolDs135.jpg

以下:是各参数的解释

wKioL1LVUmnATQHaAAVSv3nyiSM859.jpg

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

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


【分析目录项】

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

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

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

三、虽然目录项的长度不固定,可是其长度必定是4字节的倍数,若是文件名不够4字节的倍数,则在尾部填0补齐。

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

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

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

wKiom1LVWV-AYFleAANnXX_fxNc270.jpg

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

wKioL1LVWZrRTPGoAAGWdGxEDZ8175.jpg


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

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

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

wKiom1LVXEaTa486AAC5Ko6BIs8941.jpg分析EXT3内部存储结构的步骤以下:

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

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

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

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

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

二、读取i节点表

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

三、读取根目录区

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

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

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

四、读取子目录区

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


呼...终于写完了,下班后原本没打算写的,后来仍是坚持写下来了。虽然以是凌晨了,不过感受仍是挺值得的。只要坚持,没有什么事作不到的,相信本身。



做者:邓奇

相关文章
相关标签/搜索