注:此格式为android改版的ext4
目录
1、ext4文件系统总体布局2、超级块3、块组描述符表4、节点表5、根目录
图0 ext4镜像文件格式总体分布该图中红色为重要结构
在第1个布局中,前0x400字节为BootBlock, 用0填充
0x400-0x800为ext4的超级块,对应结构体ext4_super_block,
0x800-0x1000用0填充
第2个布局为块组描述符表(ext2_group_desc)。块组描述符表的起始偏移固定为0x1000,没有限制大小,
对应结构体ext2_group_desc,此结构体大小由超级块的s_desc_size字段指定。
每个块组对应一个结构体。
第3个布局为保留的gdt块,此块用于当第2个Block无法存放下所有块组描述结构体时,向该块填充。
该块大小由超级块的s_reserved_gdt_blocks字段指定Block个数
第4个布局为节点表,由块组描述符中bg_inode_table, 指定节点表的偏移block,如果一个块组的所有空闲inode都被使用,
就使用下一个块组的节点表。每个块组默认0x2000个节点。
节点表中存放着节点(ext4_inode)的数组,
节点表中的第1个节点用0填充
第2个节点为根目录的节点,指向根目录的目录信息(ext4_dir_entry_2数组)。
第8个节点为日志节点,指向日志块。
第5个布局为日志块
第6个布局为根目录,根目录为ext4_dir_entry_2的结构体数组,由节点表的第2个节点索引过来。
其余为其他目录和文件,以及每个块组的起始块。
注:以下图中的所有字段均为重要字段,其余字段说明可参考《Ext4文件系统手动提取文件》
图1 超级块,
inode总数(s_inodes_count):所有块组中的节点总和
Blocks总数低位(s_blocks_count_lo):镜像文件总大小/每个block大小。注:每个block大小固定为0x1000
空闲的blocks数低位(s_free_blocks_count_lo): 所有的块组中剩余的空闲Block
空闲的Inode数(s_free_inodes_count):所有块组中剩余的空闲Inode
每个块组的inode数(s_inodes_per_group):每个块组有多少个inode,块组描述符中有剩余inode字段
魔术标记(s_magic):默认0xEF53
节点的大小(s_inode_size):每个节点的大小
保留的gdt块(s_reserved_gdt_blocks):保留的gdt块的个数,图0中的resize块
日志系统的Inode号(s_journal_inum):日志系统在节点表中的inode号
块组描述符的大小(s_desc_size):每个块组描述符的大小。
图2 块组描述符
块组Blocks位图(bg_block_bitmap):块位图的block位置
块组的Inode位图(bg_inode_bitmap):inode位图的block位置
Inode表(bg_inode_table):inode表的block位置
空闲的blocks数(bg_free_blocks_count):空闲的blocks个数,添加时如果该组空闲的Block小于文件大小,就寻找下一个块组的空闲的block
块组中空闲inodes数(bg_free_inodes_count):该块组中空闲的inodes
用户的目录数(bg_used_dirs_count):该镜像文件的目录个数
图3 节点表
文件类型和访问权限(i_mode):文件的类型与访问权限。
0xA000软链接
0x8000为文件,
0x4000为目录,
0x100当前用户可读,
0x80当前用户可写
0x40当前用户可执行
0x20组用户可读
0x10组用户可写
0x8组用户可执行
0x4其他用户可读
0x2其他用户可写
0x1其他用户可执行
文件大小(i_size_lo):文件或目录的大小,以字节为单位
硬链接计数(i_links_count):该目录下拥有硬链接的个数
文件的数据块个数(i_blocks_lo):根据文件大小决定,
inode标志(i_flags):inode的标志
指向数据块的指针(i_block):此处为一个union,为15个4字节大小的的数据
ext4_extent_header:
魔术标志(eh_magic): 值默认为0xFC0A
ext4_extent:
ee_block:第一个逻辑块
blocks个数(ee_len): 节点指向的数据的block数
数据块偏移高16位(ee_start_hi):
数据块偏移低32位(ee_start_lo):指向的数据块的偏移
6、根目录:此为一个变长结构体数组
inode:指向子目录或文件在节点表中的Inode号
rec_len:ext4_dir_entry_2结构体的长度
name_len:目录名称或文件名称的长度
file_type:1为文件,2为目录
name:目录名称或文件名称
目录中的第一个结构体为"."表示当前目录
目录中的第二个结构体为".."表示上一级目录
目录中的最后一个结构体为剩余的大小。
参考资料:https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout
http://blog.chinaunix.net/uid/28989651/cid-180423-list-1.html
本文来源:https://www.2haoxitong.net/k/doc/c5b3cf44eefdc8d377ee3202.html
文档为doc格式