Ext3文件系统用i-节点描述文件的元数据,i-节点的分配情况由该i-节点所在块组的i-节点位图描述,i-节点位图有以下特点:
①每个块组中都有一个i-节点位图,i-节点位图的地址在该块组的描述符中给出。
②i-节点位图起始于该块组的块位图块后的下一个块。
③系统分配了一个块来存放i-节点位图,但实际上i-节点位图用不完这个块,因为一个块组内i-节点的实际数量总是小于这一个块能描述的i-节点数量。
④i-节点位图的实际大小可以通过每组i-节点数除以8计算得到。
⑤i-节点位图用于描述本块组所管理的i-节点的分配状态,i-节点位图中的每一位映射本块组中的一个i-节点。如果i-节点位图中相应的位被置1,代表该i-节点已经使用;否则表示未用。
⑥因为i-节点位图中的每一位映射本块组中的一个i-节点,所以每个字节映射8个i-节点,这8个i-节点中的第一个i-节点对应字节中的最低位。例如,i-节点位图中有一个字节为FEH,换算为二进制等于11111110,这个值的最低位是0,就说明其映射的8个i-节点中,第一个i-节点是空闲的,其他7个i-节点已经使用。
⑦i-节点从1开始编号,即第一个i-节点是1号i-节点而不是0号i-节点,所以i-节点位图的第一个位映射1号i-节点。
在图7-33的块组描述符例子中,1号块组描述符描述了1号块组的i-节点位图起始于32 771号块,我们就以这个i-节点位图为例进行分析。
用WinHex跳转到32 771号块,其内容如图7-38所示。
图7-38中大部分数据都是“FF”,表示它们所映射的i-节点是被分配的。在偏移量311AH处画圈的值为“03H”,换算为二进制等于“00000011”,那么这8个位映射哪8个i-节点呢?下面我们来做换算。
第1步 计算“03H”在该i-节点位图中的相对偏移量。
这需要用其当前的偏移量减去i-节点位图的起始偏移量,即311AH−3000H=11AH,换算成十进制等于282。
第2步 计算“03H”在该块组中映射的8个i-节点号。
因为“03H”在i-节点位图中的相对偏移量为282,所以它在该块组中映射的第一个i-节点号为282×8+1=2257,所以这8个映射i-节点为2257到2264号i-节点。
第3步 计算“03H”在该文件系统中映射的8个i-节点号。
上一步计算出的2257~2264这8个i-节点是“03H”这个值在1号块组中映射的相对i-节点号,并不是整个文件系统的绝对i-节点号,如果要把块组中的相对i-节点号换算为文件系统的绝对i-节点号,换算公式为:
文件系统的绝对i-节点号=块组中的相对i-节点号+该块组第一个i-节点的i-节点号
i-节点从1开始编号。
从超级块中可知每块组包含16 320个i-节点,所以1号块组第一个i-节点的i-节点号是16 321,那么1号块组中的相对i-节点号2257~2264换算为文件系统的绝对i-节点号,应该等于(2257+16321)~(2264+16321),即18 578~18 585号i-节点。
现在我们知道了1号块组中i-节点位图值“03H”映射的是文件系统中18 578~18 585号i-节点,“03H”的二进制为“00000111”,说明18 578~18 580号i-节点已经使用,而18 581~18 585号i-节点没有使用。