浅谈Linux下的EXT3文件系统

简介:

【EXT3的基本介绍】

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

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

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

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

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

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


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

wKiom1LUu3OBEyX1AADsV8ccK3w710.jpg


【分析超级快】

   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:未用。

超级块和块组描述符表的是非常重要的,如果超级块或者块组描述符损坏,会导致文件系统不可以,因此文件系统对他们都有备份。如果文件系统不具有“稀疏超级块特性”,那么每个块组中都有超级块以及块组描述符;如果文件系统具有“稀疏超级块特性”,那么只会在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节点

wKiom1LVUlDQS7iUAAIgpzwolDs135.jpg

如下:是各参数的解释

wKioL1LVUmnATQHaAAVSv3nyiSM859.jpg

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

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


【分析目录项】

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

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

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

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

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

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

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

wKiom1LVWV-AYFleAANnXX_fxNc270.jpg

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

wKioL1LVWZrRTPGoAAGWdGxEDZ8175.jpg


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

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

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

wKiom1LVXEaTa486AAC5Ko6BIs8941.jpg分析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节点号即可。


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



本文转自yun5277 51CTO博客,原文链接:http://blog.51cto.com/dengqi/1351708,如需转载请自行联系原作者

相关文章
|
3天前
|
存储 Linux 文件存储
Linux文件系统
Linux文件系统 一切皆文件 在Linux中,“一切皆文件”的概念意味着系统中的所有资源,包括硬件设备、目录及进程等,均被视为文件。这种设计简化了操作和管理,具体包括: 普通文件:存储数据的常规文件。 目录文件:包含其他文件和子目录的文件。 进程文件:在/proc目录下代表系统中运行的进程。 设备文件:位于/dev目录,代表硬件设备。 网络字节流套接字文件:用于网络通信的数据流。 链接文件:指向另一个文件的符号链接或硬链接。 管道文件:用于进程间通信的文件。
26 7
|
2月前
|
存储 Linux 索引
Linux 下最主流的文件系统格式——ext
【9月更文挑战第8天】硬盘被划分为若干相同大小的块(Block),默认大小为4K,便于灵活管理文件数据。文件数据分散存放于这些块中,提高了数据添加、删除和插入的便利性。
|
3月前
|
编解码 Linux 程序员
深度探索Linux操作系统 —— 构建根文件系统2
深度探索Linux操作系统 —— 构建根文件系统
44 12
|
3月前
|
Linux Shell 网络安全
深度探索Linux操作系统 —— 构建根文件系统1
深度探索Linux操作系统 —— 构建根文件系统
51 6
|
3月前
|
存储 人工智能 数据管理
深入理解Linux操作系统之文件系统管理探索人工智能:从理论到实践的旅程
【8月更文挑战第30天】在探索Linux的无限可能时,我们不可避免地会遇到文件系统管理这一核心话题。本文将深入浅出地介绍Linux文件系统的基础知识、操作命令及高级技巧,帮助你更有效地管理和维护你的系统。从基础概念到实践应用,我们将一步步揭开Linux文件系统的神秘面纱。
|
3月前
|
存储 监控 Linux
|
3月前
|
存储 监控 Linux
|
2月前
|
存储 缓存 Linux
Linux文件系统的功能规划
【9月更文挑战第12天】本文通过类比图书馆,形象地解释了文件系统的组织形式和管理方法。首先,文件系统需按块存储文件,并设有索引区方便查找。其次,热点文件应有缓存层提高效率,文件需分类存储以便管理。最后,Linux内核需记录文件使用情况,通过文件描述符区分不同文件,确保文件操作准确无误。
|
3月前
|
算法 Linux 索引
Linux0.11 根文件系统挂载(四)
Linux0.11 根文件系统挂载(四)
31 0
|
3月前
|
存储 Linux 网络安全
【Azure 存储服务】如何把开启NFS 3.0协议的Azure Blob挂载在Linux VM中呢?(NFS: Network File System 网络文件系统)
【Azure 存储服务】如何把开启NFS 3.0协议的Azure Blob挂载在Linux VM中呢?(NFS: Network File System 网络文件系统)
下一篇
无影云桌面