创建镜像、mount等操作和上一篇一样,测试目录结构如下:
一些文件系统信息如下:
- Block size: 1024
- Inodes per group: 128
- Inode size: 128
- Block bitmap at 6
- Inode bitmap at 7
- Inode table at 8-23
下面看看文件系统根目录的结构,ext2的根目录的索引节点号是2,根据上面的信息可以计算出根目录的索引节点地址是0x002080。如果是用vim打开的镜像文件,可以通过以下命令计算地址:
:echo printf("%x", 8*1024+128)
文件内容如下:
对照ext2_inode结构定义:
- i_mode: 0x41ed 对照这里可知文件格式为EXT2_S_IFDIR
- i_uid: 0
- i_size: 0x000400,也就是1K (可以通过ls -ld /tmp/ext2验证)
- i_block: 0x000018,说明该目录只占用了一个block,地址为0x18 * 1024=0x6000,这里也就是根目录的内容
0x6000地址处内容如下:
ext2的目录是一个特殊的文件,文件内容是多个ext2_dir_entry_2结构的目录项,每个目录项是文件名和索引节点的集合。
对照ext2_dir_entry_2的结构,第一个目录项信息如下:
- inode : 2
- rec_len: 0x000C
- name_len: 0x01
- file_type: 0x02,表示目录
- name: 0x2E, 也就是“."
因为上一个目录项rec_len是0x0C,所以下一个目录项地址为0x600C,对应目录项信息如下:
- inode: 2
- rec_len: 0x000C
- name_len: 0x02
- file_type: 0x02,表示目录
- name: 0x2E,0x2E,也就是“..”
下一个目录项地址为上一个目录项地址加上上一个目录项的rec_len,也就是0x600C + 0x0C = 0x6018,信息如下:
- inode: 0x0B,11
- rec_len: 0x14,20
- name_len: 0x0A,10
- file_type: 0x02, 2,表示目录
- name: 0x6C,0x6F, ..., 也就是“lost+found”
以此类推就可以找到所有根目录下的目录项