Ext4文件系统是Ext3文件系统的升级版,所以在文件系统布局上与Ext3类似,不过对于每一个具体结构都有或多或少的改变,比如在超级块中增加了一些64位的参数;在块组描述符中增加了64位参数和校验和;在i-节点中比较重要的变化是用盘区结构替代了Ext3的直接块指针和间接块指针,另外还将时间的描述增加为纳秒级。Ext4文件系统的目录项相对于Ext3则没有发生改变。
因为Ext4文件系统的使用目前还不是太普及,所以为了节省篇幅本书只对超级块部分进行分析,其他结构将在笔者以后的书籍中详细讲解。
Ext4的超级块开始于文件系统的1024字节处,即2号扇区,其具体结构见表7-18。
表7-18 Ext4文件系统的超级块结构
字节偏移 | 字段长度(字节) | 字段名和定义 |
0x00~0x03 | 4 | i-节点总数 |
0x04~0x07 | 4 | 总块数(低32位) |
0x08~0x0B | 4 | 保留块数(低32位) |
0x0C~0x0F | 4 | 空闲块数(低32位) |
0x10~0x13 | 4 | 空闲i-节点数 |
0x14~0x17 | 4 | 第一个数据块(即0号块组起始块号) |
0x18~0x1B | 4 | 块大小描述值 |
0x1C~0x1F | 4 | 段大小描述值(与“块大小描述值”相同) |
0x20~0x23 | 4 | 每块组包含的块数 |
0x24~0x27 | 4 | 每块组包含的段数 |
0x28~0x2B | 4 | 每块组包含的i-节点数 |
0x2C~0x2F | 4 | 最后挂载时间 |
0x30~0x33 | 4 | 最后写入时间 |
0x34~0x35 | 2 | 挂载次数 |
0x36~0x37 | 2 | 最大挂载数 |
0x38~0x39 | 2 | 签名值 |
0x3A~0x3B | 2 | 文件系统状态(具体见表7-3) |
0x3C~0x3D | 2 | 错误处理方式(具体见表7-4) |
0x3E~0x3F | 2 | 次版本号 |
0x40~0x43 | 4 | 最后检查时间 |
0x44~0x47 | 4 | 强迫一致性检查的最大间隔时间 |
0x48~0x4B | 4 | 创建文件系统的操作系统类型(具体见表7-5) |
0x4C~0x4F | 4 | 主版本号 |
0x50~0x51 | 2 | 用户ID保留块 |
0x52~0x53 | 2 | 组ID保留块 |
0x54~0x57 | 4 | 第一个非保留i-节点 |
0x58~0x59 | 2 | i-节点大小 |
0x5A~0x5B | 2 | 当前超级块所在块组 |
0x5C~0x5F | 4 | 兼容性特征标志(具体见表7-6) |
0x60~0x63 | 4 | 非兼容性特征标志(具体见表7-7) |
0x64~0x67 | 4 | 只读兼容性特征标志(具体见表7-8) |
0x68~0x77 | 16 | 卷的UUID(全局ID) |
0x78~0x87 | 16 | 卷名 |
0x88~0xC7 | 64 | 最后挂载路径 |
0xC8~0xCB | 4 | 位图算法 |
0xCC~0xCC | 1 | 文件预分配块数 |
0xCD~0xCD | 1 | 目录预分配块数 |
0xCE~0xCF | 2 | 每块组为组描述符表保留块数(用于在线扩容) |
0xD0~0xDF | 16 | 日志的UUID |
0xE0~0xE3 | 4 | 日志的i-节点 |
0xE4~0xE7 | 4 | 日志设备号 |
0xE8~0xEB | 4 | 最后的孤立i-节点 |
0xEC~0xEF | 4 | Hash种子1 |
0xF0~0xF3 | 4 | Hash种子2 |
0xF4~0xF7 | 4 | Hash种子3 |
0xF8~0xFB | 4 | Hash种子4 |
0xFC~0xFC | 1 | 默认Hash版本 |
0xFD~0xFD | 1 | 保留 |
0xFE~0xFF | 2 | 组描述符大小 |
0x100~0x103 | 4 | 默认挂载选项 |
0x104~0x107 | 4 | 第一个元数据块的块组 |
0x108~0x10B | 4 | 文件系统创建时间 |
0x10C~0x14F | 68 | 日志节点信息备份(具体见表7-9) |
0x150~0x153 | 4 | 总块数(高32位) |
0x154~0x157 | 4 | 保留块数(高32位) |
0x158~0x15B | 4 | 空闲块数(高32位) |
0x15C~0x15D | 2 | i-节点所需最少字节数 |
0x15E~0x15F | 2 | 为新i-节点保留字节数 |
0x160~0x163 | 4 | 其他标志 |
0x164~0x165 | 2 | RAID跨距 |
0x166~0x167 | 2 | MMP检查的时间间隔 |
0x168~0x16F | 8 | 多次挂载保护块 |
0x170~0x173 | 4 | RAID条带宽度 |
0x174~0x174 | 1 | 弹性块组大小 |
0x175~0x175 | 1 | 未用 |
0x176~0x177 | 2 | 保留 |
0x178~0x17F | 8 | 总计写入的千字节数 |
0x180~0x3FF | 640 | 保留 |