Ext3文件系统的超级块中存储着大量的文件系统结构参数。Linux系统在挂载文件系统时会读取超级块,如果超级块损坏,系统将会拒绝挂载该文件系统。
在系统运行时,由于软件或临时性的硬件信号干扰,可能会导致超级块损坏,从而使文件系统运行出错,并且无法再一次挂载,最终导致文件系统内的数据无法访问。
Ext3文件系统在结构的设计上与UFS文件系统有很多类似之处。为了使文件系统在遭到毁灭性打击时能够得以恢复,操作系统在创建文件系统时,会将超级块复制到文件系统的每个块组中,以便在发生故障时能够读取。
但是,如果文件系统具备稀疏超级块特性,那么只在块组号是3、5、7的幂的块组(如1、3、5、7、9、25、49等)内才对超级块做备份,其他块组内则没有备份。
虽然文件系统的超级块在很多块组中都有备份,但在文件系统挂载时,系统只会读取主超级块的内容,如果主超级块受损,文件系统就无法挂载。因为有超级块的这种备份措施,所以给我们恢复超级块带来了很大帮助,我们只需要找到备份超级块,覆盖破坏的主超级块即可。
主超级块在文件系统的生命周期内,会不断地发生修改,以反映文件系统目前的状态,而为了确保备份的安全,备份超级块不会跟随这些变动。所以在用备份超级块恢复主超级块后,如果文件系统还是无法挂载,那么还需要具体分析超级块的参数,并且进行适当的修改。
下面具体分析一个实例。
一台计算机使用Red Flag Linux系统,某次因突然断电而导致再一次启动时其中一个文件系统无法挂载。为了查找原因并恢复数据,在Linux系统下用“dd”命令将该文件系统镜像为一个文件,然后在Windows环境下用WinHex分析这个镜像文件,发现超级块所在的2号扇区已经全部变成“00”,如图7-82所示。
考虑到Ext3文件系统的超级块在很多块组中都有备份,可以通过查找备份超级块的方法,用备份超级块修复主超级块。
Ext3文件系统超级块中38H~39H偏移处有两个字节的固定签名值,为十六进制数值“53 EF”,用WinHex搜索这两个数值就可以找到超级块的备份。搜索的设置方法如图7-83所示。
通过搜索,在262 144号扇区找到了超级块,其内容如图7-84所示。
该超级块中的具体参数如图7-85和7-86所示。
该超级块中“当前超级块所在块组”参数的值为1,说明这是1号块组中的超级块备份。再看参数“每块组包含块数”的值为32 768,每块大小为4096字节,即8扇区。用每块组包含块数32 768乘以每块扇区数8,可以得到1号块组的起始扇区,结果为262 144,刚好等于我们搜索到的该超级块所在扇区号。这可以说明我们搜索到的是一个合法的超级块。
不过这个超级块中的几个参数会跟主超级块不相符,即图7-85和7-86中标注了“与主超级块不相符”的这几个参数,解决的办法是在Linux系统下对该文件系统做一下一致性检查就可以了。
一致性检查是有潜在风险的,做之前一定要对磁盘进行镜像。
因为我们已经对出错的文件系统做了“dd”镜像,所以可以很放心地在原盘上做修改。把搜索到的超级块备份复制到主超级块处,并对该文件系统运行了一致性检查,随后尝试挂载该文件系统,结果挂载成功,文件系统可以正常访问了,数据成功恢复。