超级块对于UFS文件系统来说是至关重要的。超级块中存储着大量的文件系统结构参数,UNIX系统在挂载文件系统时会读取超级块。如果超级块损坏,系统会给出超级块不正确的提示而拒绝挂载。
在系统运行时,由于软件或临时性的硬件信号干扰,可能会导致超级块损坏,从而使文件系统运行出错,并且无法再一次挂载,最终导致文件系统内的数据无法访问。
UFS文件系统在设计时,为了使文件系统在遭到毁灭性打击,如硬盘发生整磁道、整盘面或整个柱面损毁时能够得以恢复,在文件系统初始化时,会将超级块复制到文件系统的每个柱面组中,以便在发生硬件损坏时能够读取。
虽然文件系统的超级块在每个柱面组中都有备份,但在文件系统挂载时,系统只会读取主超级块的内容,如果主超级块受损,文件系统就无法挂载。因为有超级块的这种备份措施,所以给我们恢复超级块开来了很大帮助,我们只需要找到备份超级块,覆盖破坏的主超级块即可。
不过,主超级块在文件系统的生命周期内,会不断地发生修改,以反映文件系统目前的状态,而为了确保备份的安全,备份超级块不会跟随这些变动。所以在用备份超级块恢复主超级块后,如果文件系统还是无法挂载,那么还需要具体分析超级块的参数,并且进行适当的修改。
下面具体分析一个实例。
一台Sparc架构的Solaris工作站,某天因突然断电而导致再一次启动时一个文件系统无法挂载。为了查找原因并恢复数据,在Solaris系统下用“dd”命令将该文件系统镜像为一个文件,然后在Windows环境下用WinHex分析这个镜像文件,发现超级块所在的16号扇区已经被部分覆盖为许多“FF”,如图5-83所示。
超级块一共占4个扇区,后面3个扇区没有遭受破坏,但超级块中的大多重要参数都集中在第一个扇区的前部,恰恰这部分数据被破坏了,所以导致文件系统无法挂载。
为了恢复这个超级块,我们需要在文件系统中搜索超级块的备份。超级块的第三个扇区有一个固定的签名值,为十六进制的“00 01 19 54”,可以利用这个签名值找到超级块的备份。
搜索超级块签名值的具体设置方法如图5-84所示。
很快就在34号扇区搜索到一个签名值,其内容如图5-85所示。
往前翻两个扇区,回到32号扇区,分析发现确实是一个超级块。超级块中“超级块备份相对于柱面组参考位置的偏移量”这个参数的值为16,“每段字节数”这个参数的值为1024,即两个扇区,从这两个参数可以判断0号柱面组中超级块备份位于32号扇区,正是我们搜索到的这个超级块。这就验证了搜索到的超级块是一个合法的备份超级块,可以使用。
于是,把这个备份超级块的第一个扇区复制到被破坏的主超级块的第一个扇区,保存后再把这个修改过的镜像文件挂回Solaris工作站,再一次对这个修改后的文件系统进行挂载。结果挂载成功,文件系统可以正常访问了,数据完好无损。