前言

本篇将对 Ext3 文件系统的 块位图、i- 节点位图进行分析

知识点总览

  • Ext3 文件系统的块位图分析

  • Ext3 文件系统的 i- 节点位图分析

Ext3 文件系统的块位图分析

Ext3 文件系统以块作为数据存储的基本单位,文件系统中的所有块被分为若干个组,即块组,块的分配情况由该块所在块组的块位图描述。块位图有以下特点:

  1. 每个块组中都有一个块位图,块位图的地址在该块组的描述符中给出。

在块组描述符中的 块位图起始号 中可以找到所在块组的块位图位置

块位图位置 = 块位图起始号 * 每块扇区数

  1. 对于含有超级块、块组描述符表的块组,或含有超级块备份、块组描述符表备份的块组,块位图起始于块组描述符表所在块的下一个块;对于没有超级块备份和块组描述符表备份的块组,块位图起始于该块组的第一个块。

在相对扇区位置 262144 ~ 524288 区间(1 号块组)中,块组起始为超级块的备份,所以块位图的位置在其块组描述符表后一个块

在 524288 ~ 636432 区间(2 号块组)中,块组的起始不是超级块、块组描述符表的备份,所以块位图的位置在该块组的第一个块

  1. 在创建文件系统时,操作系统将每个块组包含的块数与每个块包含的位数设置为相等,这使得块位图刚好占用一个完整的块。

在通常情况下的 Ext3 文件系统中 每个块组包含的块数 = 32768(块)每个块包含的位数 = 8(位) ,所以块位图刚好占用一个完整的块(32768 / 8 = 4096(字节)/ 512 = 8(扇区),故每块扇区数 = 8)

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

位图值与块的映射关系及块的分配情况如下:

  1. 因为块位图中的每一位映射本块组中的一个块,所以每个字节映射 8 个块,这 8 个块中的第一个块对应字节中的最低位。例如,块位图中有一个字节为 FEH,换算为二进制等于 11111110,这个值的最低位是 0,就说明其映射的 8 个块中,第一个块是空闲的,其他 7 个块已经使用。

通过块位图的分配情况找到文件的存储位置

上图为 Ext3 文件系统的块位图数据,其中每个字节代表 8 个块,每个块占用 512 字节

由图片中框选的位置可以看出,在 129~131 字节处有数据存储,其数据为 FE FF 1F ,换算为二进制等于 11111110 11111111 00011111

由于这段数据流的第一个字节的表示形式为 1111 1110,所以这八个块中的第一个块没有被使用

故可以推断本块组的第 128 * 8 + 1 = 1,025 块为该段数据的起始,大小为 7 + 8 + 5 = 20 个块

1025 * 8 = 8,200 扇区,得到数据的相对本块组的起始位置,从块组起始向后跳转 8200 扇区

可以看到,从块组起始位置向后跳转 8200 扇区,就到达了数据的起始位置,该段数据为某个图片文件

向后跳转 20 * 8 = 160 扇区,向上搜索 !00 即可到达图片文件的结尾标志 FF D9

Ext3 文件系统的 i- 节点位图分析

Ext3 文件系统用 i-节点描述文件的元数据,i-节点的分配情况由该 i-节点所在块组的 i-节点位图描述,i-节点位图有以下特点:

  1. 每个块组中都有一个 i-节点位图,i-节点位图的地址在该块组的描述符中给出。

在块组描述符中的 i-节点位图起始号 中可以找到所在块组的块位图位置

i-节点位图位置 = i-节点位图起始号 * 每块扇区数

  1. i-节点位图起始于该块组的块位图块后的下一个块。

  1. 系统分配了一个块来存放 i-节点位图,但实际上 i-节点位图用不完这个块,因为一个块组内 i-节点的实际数量总是小于这一个块能描述的 i-节点数量。

The number of inodes in the system can not be changed after the filesystem is created, at least without growing the filesystem. If the filesystem is grown using resize2fs (wihch requires increasing the size of the partition or logical volume on which the filesystem resides, of course), the number of inodes in the filesystem will grow, but only in rough proportion to the number of blocks in the filesystem.

Considerations when creating ext3 filesystems -- Kernel.org

创建文件系统后,文件系统中的 i-节点总数与每块组 i-节点个数无法更改,就算使用 resize2fs 命令增加文件系统的大小,i-节点总数也只会按比例增加,每块 i-节点个数不会改变

理论 i-节点位图可以表示的 i-节点数量为 8(每块扇区数)* 512 = 4096(字节数)* 8(位)= 32768(i-节点数),但当每块扇区数为 8,每块组块数为 32768 时,文件数据可用块数为 32768 - 1(块位图)- 1(i-节点位图)- 2048(i-节点数据区所占) 绝对小于 32768,所以 i-节点位图在通常情况下不可能用完一个块。

  1. i-节点位图的实际大小可以通过每组 i-节点数除以 8 计算得到。

在创建分区时,超级块中的 每块组的 i-节点数 决定了该块组内的 i-节点数量,因此实际 i-节点位图所使用的部分为 每块组的 i-节点数 / 8 得出的字节数

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

  2. 因为 i-节点位图中的每一位映射本块组中的一个 i-节点,所以每个字节映射 8 个 i-节点,这 8 个 i-节点中的第一个 i-节点对应字节中的最低位。

例如,i-节点位图中有一个字节为 FEH,换算为二进制等于 11111110,这个值的最低位是 0,就说明其映射的 8 个 i-节点中,第一个 i-节点是空闲的,其他 7 个 i-节点已经使用。

(与前面的块位图类似,故本部分不做图片示例)

  1. i-节点从 1 开始编号,即第一个 i-节点是 1 号 i-节点而不是 0 号 i-节点,所以 i-节点位图的第一个位映射 1 号 i-节点。