目录项用来存放文件及目录的i-节点号、目录项的长度、文件名等信息,它们存储在分配给目录的块中。Ext3文件系统的目录项结构见表7-16。
表7-16 Ext3文件系统的目录项结构
字节偏移 | 字段长度(字节) | 字段名和定义 |
---|---|---|
0x00~0x03 | 4 | i-节点号 |
0x04~0x05 | 2 | 目录项长度 |
0x06~0x06 | 1 | 名字长度 |
0x07~0x07 | 1 | 文件类型(具体见表7-17) |
0x08~ | 变长 | 名字 |
目录项中“文件类型”的具体分类见表7-17。
表7-17 目录项中“文件类型”的具体分类
类型值 | 类型含义 |
---|---|
0x01 | 文件 |
0x02 | 目录 |
0x07 | 符号链接 |
Ext3文件系统的目录项有如下特点:
①目录项存储在目录区中,i-节点内有描述目录区地址的块指针。
②目录项的长度不是固定的,其长度随着文件名长度的不同而不同,文件名最长为255个字符,并且使用ASCII码进行存储。
③Ext3的目录项长度虽然不固定,但一定是4字节的倍数,每个目录项以4字节为边界进行排列,即每个目录项的起始字节必须是位于目录内可被4整除的相对偏移字节处。
④另外,Ext3目录项的结束位置如果没有达到4字节的边界,那么也需要在文件名后加空字节以达到4字节的边界。
⑤目录区中的前两个目录项一定是“.”和“. .”目录,“.”目录表示当前目录,“. .”目录表示父目录。
⑥每个目录项中有一个长度值指向下一个目录项,最后一个目录项的长度则指向本块的结尾处。
下面通过实例进一步分析目录项的结构。
要在一个Ext3文件系统内找到目录项,需要首先找到根目录区,以下是具体步骤:
Ext3文件系统的超级块位于分区内的2号扇区,跳转到2号扇区,获得如下信息:
块组描述符表起始于超级块所在块的下一个块,也就是1号块。当前文件系统每块大小为4096字节,所以1号块开始于8号扇区。
用WinHex跳转到8号扇区,其中第一个块组描述符就是0号块组描述符表。从0号块组描述符中查看到该块组的i-节点表起始于4号块,因为每块大小为8扇区,所以4号块开始于32号扇区。
跳转到32号扇区就是i-节点表的开始了,其中第一个i-节点(1号i-节点)为坏块i-节点,2号i-节点就是根目录的i-节点。2号i-节点的内容如图7-45所示。
我们用模板查看一下2号i-节点的具体参数,如图7-46所示。
从模板中可以看到,根目录目前只占用1个块,就是第一个直接块指针中记录的“514”号块,换算为扇区等于4112。跳转到4112扇区,其内容如图7-47所示。
图7-47的根目录区中就都是根目录下的文件及文件夹的目录项了,扇区上部的阴影部分是前三个目录项,分别为“.”目录的目录项、“..”目录的目录项和“lost+found”目录的目录项。这三个目录项的具体含义及数值如图7-48、图7-49、图7-50所示。
图7-47的根目录区所在扇区下部的阴影部分是最后一个目录项,也就是为“halt”目录的目录项,这个目录项的具体含义及数值如图7-51所示。
“halt”目录项中记录着其目录项长度为3796字节,而实际上该目录项只用了12字节。因为这是目录区的最后一个目录项了,所以这个目录项的长度则指向了当前块的结尾处。