一台Red Hat Linux系统的服务器,使用5块36GB的SCSI硬盘组建为RAID-5,在一次突发故障之后重启服务器,但是无法识别RAID-5,数据全部丢失。
为了恢复RAID-5中的数据,把服务器的5块SCSI硬盘去RAID化后插入SCSI模组中分别做成文件镜像,然后用WinHex同时打开5个文件镜像进行分析。首先做一个约定,我们这里称文件“0.img”为“硬盘0”,文件“1.img”为“硬盘1”,文件“2.img”为“硬盘2”,以此类推,但这些文件的编号只是按照硬盘在服务器中的物理顺序编排的,并不一定与RAID中各个硬盘的盘序相符。
用WinHex同时打开5块物理盘的镜像文件,并查看它们的第一个扇区。“硬盘0”的第一个扇区全是0字节,如图18-60所示。
“硬盘1”的第一个扇区是MBR,如图18-61所示。
“硬盘2”的第一个扇区全都是0字节,如图18-62所示。
“硬盘3”的第一个扇区也是MBR,如图18-63所示。
“硬盘4”的第一个扇区也完全是0字节,如图18-64所示。
通过查看5块成员盘的第一个扇区发现,“硬盘1”和“硬盘3”的第一个扇区内容完全一样,都是结构完好的MBR。分区表中有三个分区表项,第一个及第二个分区表项描述了两个“0x83”类型的主磁盘分区,它们的参数如图18-65所示。
第三个分区表项描述了一个扩展分区,其参数如图18-66所示。
从分区表的参数中可以计算出所有分区的总扇区数为284 371 542。因为该RAID-5是由5块物理盘组成的,所以用284371542÷(5-1)就大概是每块物理盘的扇区数,这个结果等于71 092 885,经过换算差不多刚好等于36GB,也就是一块物理盘的容量。
从以上分析可以看出,这个MBR是一个有效的MBR扇区,所以能够知道该RAID-5起始扇区就是物理盘的0扇区。
通过第1步的分析已经知道“硬盘0”、“硬盘2”、“硬盘4”第一个扇区的数据都是0,“硬盘1”、“硬盘3”的第一个扇区都是MBR,且完全一样,从这些信息中可以得出一个结论:这两个MBR必定有一个是校验,也就是经过其他4块成员盘的第一个扇区异或得到的结果。
分析条带大小我们就从这两个MBR扇区所在成员盘入手。MBR扇区的分区表中第一个表项描述了分区的开始扇区是63,那么我们分析“硬盘1”和“硬盘3”的63号扇区,看它们是不是分区的开始位置,并且查看它们的65号扇区是不是超级块。
先跳转到“硬盘1”的63号扇区,其内容如图18-67所示。
“硬盘1”的63号扇区很明显是i-节点,往后翻到65号扇区,也同样是i-节点,而i-节点已经是超级块之后的结构了。
再跳转到“硬盘3”的63号扇区,其内容如图18-68所示。
从图18-68可以看出“硬盘3”的63号扇区也是i-节点结构,往后翻到65号扇区,依然是i-节点。
从“硬盘1”和“硬盘3”的65号扇区都没有找到超级块,63号扇区也不是分区的开始位置,所以可以断定,该RAID-5的条带大小一定小于64扇区。
接下来我们在每块物理盘中通过搜索十六进制数值“53 EF”来查找超级块,搜索的设置方法如图18-69搜索。
结果在“硬盘3”的17号扇区找到了超级块,如图18-70所示。
从超级块出现在物理盘的17号扇区基本可以判断该RAID-5的条带大小为16个扇区。因为超级块位于文件系统的2号扇区,当前RAID-5逻辑盘第一个分区起始于63号扇区,所以第一个分区的超级块就应该在RAID-5逻辑盘的65号扇区,按照16个扇区为一个条带,超级块刚好写入到某块物理盘的17号扇区。
为了进一步验证对条带大小的推测,同时也为了找出各个成员盘在盘序上的关系,我们再查看一下每块物理盘的15号和16号扇区是什么数据。首先跳转到“硬盘0”的15号扇区,这是一个引导扇区,也就是文件系统的第一个扇区,相当于RAID-5逻辑盘的63号扇区,如图18-71所示。
“硬盘0”的16号扇区很明显是i-节点的数据结构,如图18-72所示。
然后跳转到“硬盘1”的15号扇区,是一个全0扇区,如图18-73所示。
“硬盘1”的16号扇区的数据比较像校验信息,如图18-74所示。
再跳转到“硬盘2”的15号扇区,这个扇区的数据全部为0,如图18-75所示。
“硬盘2”的16号扇区前部都是0,在扇区最后有一个i-节点,如图18-76所示。
继续查看“硬盘3”的15号扇区,这也是一个引导扇区,跟“硬盘0”的15号扇区内容一样,如图18-77所示。
再查看“硬盘3”的16号扇区,是一个全部为0的扇区,如图18-78所示。
最后查看“硬盘4”,它的15号扇区全都是0,如图18-79所示。
“硬盘4”的16号扇区的数据应该是位图,如图18-80所示。
为了看得清楚,我们把上面对各成员盘0号扇区、15号扇区和16号扇区的分析总结在一起,如图18-81所示。
从图18-81中各个成员盘这些扇区的数据情况就完全可以肯定该RAID-5的条带大小为16个扇区了。
在判断出条带大小为16个扇区之后,我们再注意看图18-81的硬盘1,其16号扇区为校验,说明硬盘1的第二个条带为校验块,所以其第一个条带一定是数据块,也就是说硬盘1的0号扇区的MBR是数据而不是校验,那么硬盘3的第一个扇区的MBR就必定为校验了。
通过上面的分析,我们可以认为,在该RAID-5为左结构的情况下,“硬盘1”是“0号盘”,“硬盘3”是“4号盘”,其他三块盘的盘序不确定,用“?”代替,其结构如图18-82所示。
很明显图18-82中“硬盘1”的16号扇区为校验是跟该结构矛盾的,所以这种假设不成立,也就是说该RAID-5不可能是左结构。
在该RAID-5为右结构的情况下,“硬盘3”是“0号盘”,“硬盘1”是“1号盘”,其他三块盘的盘序不确定,用“?”代替,其结构如图18-83所示。
从图18-83的结构看显然这个假设是跟实际结构相符的,所以该RAID-5为右结构,并且“硬盘3”就是“0号盘”,“硬盘1”就是“1号盘”,其他三块盘的盘序还是未知的。
现在我们来分析剩下三块盘的盘序。前面通过搜索的方式在“硬盘3”的17号扇区找到了超级块,该超级块中的主要参数如图18-84所示。
从超级块中的参数中可以看到该文件系统的块大小为4096字节,也即8扇区,所以从“硬盘3”的超级块所在扇区往后跳转6个扇区,就应该是文件系统的块组描述符表了。
我们跳转到“硬盘3”的23号扇区,果然是块组描述符表,如图18-85所示。
其中0号块组描述符的参数如图18-86所示。
0号块组描述符的参数告诉我们如下信息:
经过上面的分析,我们可以把RAID-5逻辑盘的结构画出来,如图18-87所示。
然后我们再将RAID-5逻辑盘的结构按照RAID-5的数据分布规则转换到物理盘中,如图18-88所示。
根据图形分析如下:
通过以上分析可知该RAID-5的校验方向为右结构,盘序为:“硬盘3”为“0号盘”,“硬盘1”为“1号盘”,“硬盘4”为“2号盘”,“硬盘2”为“3号盘”,“硬盘0”为“4号盘”。
条带大小、盘序、校验方向都确定了,最后就剩下数据的循环方向了,即同步还是异步的问题。
还是以图18-88中的数据进行分析,“4号盘”第一个条带最后一个扇区的数据是引导扇区,它随后的第二个扇区应该是超级块,而超级块在“0号盘”第二个条带的第二个扇区上,也就是说“4号盘”第一个条带的数据显然衔接到“0号盘”第二个条带上,所以这个RAID-5的数据走向是异步的,最终确定该RAID-5的结构为右异步。
通过第2步的分析已经得到了该Linux系统RAID-5的具体结构,最后就可以通过数据重组获得数据了。能够支持Ext3文件系统RAID-5数据重组的工具包括R-studio和UFS Explorer,用这两个工具进行重组,可以直接看到Ext3文件系统中的数据。
重组的具体方法在前面的案例中介绍得比较详细了,为了节约篇幅不再重复讲述。