首页 > 代码库 > ext2文件系统学习(二)—— 目录磁盘结构

ext2文件系统学习(二)—— 目录磁盘结构

创建镜像、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”

以此类推就可以找到所有根目录下的目录项

ext2文件系统学习(二)—— 目录磁盘结构