Ext3文件系统的超级块起始于2号扇区,占用两个扇区。当文件系统的块大小不同时,超级块所在块号是不同的。例如,当块大小为两个扇区时,0号块是引导程序块或者保留块,超级块起始于1号块;当块大小为4个扇区时,超级块起始于0号块,其位于0号块的后两个扇区,前两个扇区是引导程序或者保留扇区;当块大小为8个扇区时,超级块也起始于0号块,其位于0号块的2~3号扇区,0~1号扇区是引导程序或者保留扇区,4~7号扇区则是空闲的。
超级块的结构分析
Ext3文件系统的超级块是非常重要的一个扇区,其记录的参数非常多,具体见表7-2。
表7-2 Ext3文件系统的超级块结构
字节偏移 | 字段长度(字节) | 字段名和定义 |
0x00~0x03 | 4 | i-节点总数 |
0x04~0x07 | 4 | 总块数 |
0x08~0x0B | 4 | 保留块数 |
0x0C~0x0F | 4 | 空闲块数 |
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~0xFF | 4 | 默认Hash版本 |
0x100~0x103 | 4 | 默认挂载选项 |
0x104~0x107 | 4 | 第一个元数据块的块组 |
0x108~0x10B | 4 | 文件系统创建时间 |
0x10C~0x14F | 68 | 日志节点信息备份(具体见表7-9) |
对超级块的重点参数进一步解释如下:
(1) 0x00~0x03:i-节点总数。是指当前文件系统中包含的i-节点总数。
(2) 0x04~0x07:总块数。是指当前文件系统中包含的总块数。
(3) 0x08~0x0B:保留块数。是指为避免分区用完而给文件系统保留的块数,其数量一般为文件系统总块数的百分之五。
(4) 0x0C~0x0F:空闲块数。是指当前文件系统未分配的块数。
(5) 0x10~0x13:空闲i-节点数。是指当前文件系统未分配的i-节点数目。
(6) 0x14~0x17:第一个数据块。是指0号块组起始块号。
(7) 0x18~0x1B:块大小描述值。用来描述文件系统每个块的字节数,具体描述方法为:当此参数的值为N时,块大小就等于2N×1024字节。例如,该参数等于2时,块大小等于4096字节。
(8) 0x1C~0x1F:段大小描述值。段大小是UFS中的一个概念,因为Ext文件系统来源于UFS,所以超级块中保留了这个参数,但在文件系统中并不使用,该参数跟“块大小描述值”保持一致。
(9) 0x20~0x23:每块组包含的块数。是指文件系统每个块组中包含块的数量。
(10) 0x24~0x27:每块组包含的段数。因为“段”的概念在Ext3文件系统中已不再使用,所以该参数也跟“每块组包含的块数”保持一致。
(11) 0x28~0x2B:每块组包含的i-节点数。是指文件系统每个块组中包含i-节点的数量。
(12) 0x2C~0x2F:最后挂载时间。是指文件系统最后一次挂载的时间。
(13) 0x30~0x33:最后写入时间。是指文件系统最后一次写入数据的时间。
(14) 0x34~0x35:挂载次数。是指文件系统到目前为止挂载的次数总和。
(15) 0x36~0x37:最大挂载数。是指文件系统挂载的最大次数。
(16) 0x38~0x39:签名值。是指文件系统的标志值,固定为十六进制数值“53 EF”。
(17) 0x3A~0x3B:文件系统状态,见表7-3。
表7-3 文件系统的状态描述
状态值 | 状态描述 |
0x0001 | 文件系统是干净的 |
0x0002 | 文件系统存在错误 |
0x0004 | 正在恢复孤立的i-节点 |
(18) 0x3C~0x3D:错误处理方式。是指当文件系统出错时,操作系统应该采取的处理方法。这个值在文件系统创建时被设置,它有三种处理方式,见表7-4。
表7-4 错误处理方式描述
数值 | 处理方式 |
0x0001 | 继续运行 |
0x0002 | 以只读方式重新挂载 |
0x0003 | 紧急处理 |
(19) 0x3E~0x3F:次版本号。是指文件系统版本号中的次版本号。
(20) 0x40~0x43:最后检查时间。是指文件系统最后一次运行一致性检查的时间。
(21) 0x44~0x47:强迫一致性检查的最大间隔时间。是指对文件系统强制运行一致性检查的最大间隔时间,以秒为单位。
(22) 0x48~0x4B:创建文件系统的操作系统类型。是指当前文件系统是由哪一种操作系统创建的,具体见表7-5。
表7-5 创建文件系统的操作系统类型描述
数值 | 操作系统类型 |
0x00 | Linux |
0x01 | GNU Hurd |
0x02 | Masix |
0x03 | Free BSD |
0x04 | Lites |
(23) 0x4C~0x4F:主版本号。是指文件系统的主版本号,有两种取值,其中“0”表示原始版本;“1”表示动态版本。
只有当该参数设置为“1”时,超级块中偏移54H~5BH处的参数才有效,这部分参数属于“扩展超级块”。
(24) 0x50~0x51:用户ID保留块。是指用户ID可以使用的保留块数。
(25) 0x52~0x53:组ID保留块。是指组ID可以使用的保留块数。
(26) 0x54~0x57:第一个非保留i-节点。是指用户数据可以使用的第一个i-节点号,一般都是11号i-节点。
(27) 0x58~0x59:i-节点大小。是指文件系统中每个i-节点的字节数。
(28) 0x5A~0x5B:当前超级块所在块组。因为超级块在很多块组中有备份,该参数用来描述当前超级块所在的块组号。
(29) 0x5C~0x5F:兼容性特征标志。操作系统在挂载文件系统时,会检查其特征,如果存在兼容性特征标志,就将其挂载为正常的文件系统。兼容性特征见表7-6。
表7-6 兼容性特征描述
数值 | 兼容性特征 |
0x0001 | 给目录预分配块以减少碎片 |
0x0002 | 存在AFA服务i-节点 |
0x0004 | 文件系统包含日志,即Ext3文件系统 |
0x0008 | i-节点有扩展属性 |
0x0010 | 文件系统能够调整大小 |
0x0020 | 目录使用hash树 |
(30) 0x60~0x63:非兼容性特征标志。操作系统在挂载文件系统时,如果发现文件系统存在非兼容性特征标志,将不对其挂载。非兼容性特征见表7-7。
表7-7 非兼容性特征描述
数值 | 非兼容性特征 |
0x02 | 目录项中包含文件类型 |
0x40 | 文件系统使用盘区结构 |
0x80 | 文件系统使用64位块号 |
(31) 0x64~0x67:只读兼容性特征标志。操作系统在挂载文件系统时,如果发现文件系统存在只读兼容性特征标志,将对其以只读方式挂载。只读兼容性特征见表7-8。
表7-8 只读兼容性特征描述
数值 | 只读兼容性特征 |
0x01 | 稀疏超级块方式 |
0x02 | 文件系统中有大文件 |
0x04 | 目录结构使用B-树管理 |
(32) 0x68~0x77:卷的UUID。这是卷的全局ID,用16个字节描述。
(33) 0x78~0x87:卷名。是指文件系统的名称。
(34) 0x88~0xC7:最后挂载路径。是指文件系统最后一次挂载的路径。
(35) 0xC8~0xCB:位图算法。是指文件系统中位图使用的算法。
(36) 0xCC~0xCC:文件预分配块数。是指文件系统为文件预分配的块数。
(37) 0xCD~0xCD:目录预分配块数。是指文件系统为目录预分配的块数。
(38) 0xD0~0xDF:日志的UUID。是指文件系统中日志的全局ID。
(39) 0xE0~0xE3:日志的i-节点。是指文件系统中日志的i-节点号。
(40) 0xE4~0xE7:日志设备号。是指文件系统中日志的设备号。
(41) 0xE8~0xEB:最后的孤立i-节点。是指文件系统中最后的孤立i-节点号。
(42) 0x104~0x107:第一个元数据块的块组。是指文件系统中存放元数据的第一个块组号。
(43) 0x108~0x10B:文件系统创建时间。是指创建该文件系统的具体时间信息。
(44) 0x10C~0x14F:日志节点信息备份。这是超级块为日志节点信息做的备份,具体见表7-9。
表7-9 日志节点信息的备份
超级块实例讲解
下面具体分析一个Ext3文件系统超级块的实例,该超级块的内容如图7-29所示。
图7-29 超级块实例
图7-29中超级块主要参数的数值及解释可以用WinHex的模板查看,其内容如图7-30和图7-31所示。
图7-30 超级块模板参数第一部分
图7-31 超级块模板参数第二部分
日志节点信息备份的具体数值也可以用WinHex的模板查看,其内容如图7-32所示。
图7-32 日志节点信息备份的参数模板
在该实例中,超级块内的参数描述了文件系统总块数为863 846 391,每块组包含的块数为32 768,用这两个参数可以算出该文件系统的块组数,计算方法为(863846391 DIV 32768)+1,结果等于26 363,说明文件系统中有26 363个块组。
文件系统的最后一个块组包含的块数往往比其他块组要少。我们再来计算一下该文件系统最后一个块组中的块数,计算方法为863846391−32768×26362,结果为16 375,说明该文件系统最后一个块组只包含16 375个块,比其他块组中的块少很多。
另外,还可以用取模的方法计算最后一个块组包含的块数,计算式为863846391MOD 32768,结果也等于16 375。