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文件系统的超级块分析-数据恢复迷

超级块实例讲解

下面具体分析一个Ext3文件系统超级块的实例,该超级块的内容如图7-29所示。

Ext3文件系统的超级块分析-数据恢复迷

图7-29 超级块实例

图7-29中超级块主要参数的数值及解释可以用WinHex的模板查看,其内容如图7-30和图7-31所示。

Ext3文件系统的超级块分析-数据恢复迷

图7-30 超级块模板参数第一部分

Ext3文件系统的超级块分析-数据恢复迷

图7-31 超级块模板参数第二部分

日志节点信息备份的具体数值也可以用WinHex的模板查看,其内容如图7-32所示。

Ext3文件系统的超级块分析-数据恢复迷

图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。