1、WINHEX RAID 修复RAID0 分析关于 RAID,大家可能有些陌生。在个人电脑上,RAID 用的不多,但是 windows XP 支持跨区卷和带区卷。Windows server 2003 支持跨区卷,带区卷,RAID-5 等。对于 RAID0的分析主要在于重组磁盘,重组磁盘就需要确定盘序,块大小,判断磁盘加入阵列的起始位置等。确定了上述参数后就可以重组阵列达到恢复数据的目的了。但是在具体的操作中,要如何确定上述参数呢?这个就要对文件系统有深入的了解,特别是 NTFS 文件系统,因为 RAID 基本都是采用 NTFS 文件系统,很少有采用 FAT32 文件系统的。看了马林老师的数据重
2、现之后发现,马林老师给出的实验素材真是精心设计过的了。如果自己做一个RAID 就会出现很多和马老师的素材不一样的结果。这里我就从如何组建一个 RAID0 开始然后逐步分析。马老师给出的方法具有通用性,但是有些时候会出现找不到符合马老师给出的素材的情况,那么就不能用马老师讲的方法了。我们就只能在对文件系统有深入的理解的前提下,分析 RAID 了。这就要求我们对文件系统有深入的理解,特别是 NTFS 文件系统。好的,下面我就从组建一个 RAID0 开始,分析一下 RAID0。希望能给大家带来一些启示。这个是我在 windows XP 下虚拟出的三块磁盘,每块磁盘的大小都是 200M 三块磁盘做了一
3、个 RAID0 ,采用 NTFS 格式化。上图显示的三块磁盘的 0 号扇区,这个扇区的主要作用是一个 DOS 分区结构。和基本磁盘的 MBR 有点类似。这个扇区也有一个分区表,但是只占用了一个分区表项。 。大家看下图分区类型是 0x42 起始于 63 号扇区,大小是 0x9A 20 06 00 也就是 401562 个扇区。而磁盘的总扇区数是 409600 个扇区。因为在 windows 系统中采用逻辑磁盘管理也就是LDM。LDM 支持 JBOD, RAID0, RAID1 和 RAID5。要组成这些阵列类型,我们需要把我们的磁盘转换成动态磁盘,而 LDM 就是管理动态磁盘的。动态磁盘有两个重
4、要的部分,一个是LDM 分区区域,它占用磁盘的绝大部分,另一个就是动态磁盘的最后 1MB,分配给 LDM数据库。LDM 数据库包含分区区域的分配情况。所以在把基本磁盘转换成动态磁盘时需要在磁盘最后有一定的剩余空间。我们上图显示的类似基本磁盘的分区表部分我们管它叫软分区,分区类型就是 0x42 而基本磁盘的分区我们就叫硬分区吧。好了,现在我们对组成 RAID 的磁盘有了一个基本的了解了,我们来总结一下1. 成员盘都是动态磁盘,windows 操作系统有个叫 LDM 的管理它们。2. LDM 会在每个成员盘的最后 1MB 建立一个数据库,记录一些动态盘的信息,而且这个数据库还有一个作用,当我们的成
5、员盘被卸载了加载到其他机器上去之后,如果那台机器采用的和原来的机器一样的 RAID 那么我们的成员盘又可以组建成原来的RAID 了,而数据不会丢失,这就方便了移植。3. LDM 会在动态磁盘的 0 号扇区建立一个如上图所示的软分区表。4. LDM 数据库中包含四个区域,一个叫做 LDM 私有头,一个内容表区域,一个数据库记录区和一个事物处理日志区。5. 软分区描述的扇区总数并没有包括最后那 1MB 的 LDM 数据库。好的,我们先看看是不是磁盘的最后 1MB 是数据库,看看数据库都写了些什么。1MB 就是 2048 个扇区,我们的磁盘有 409600 个扇区减去 2048。 那么我们的数据库的
6、起始扇区就是 407553 号扇区了。看到了吗,真的是有东西签名标志 54 4F 43 4C 4F 43 4B 具体的数据库分析我们就不做了,太费时了,如果大家有兴趣可以加我共同讨论。这里我只是想让大家知道在 RAID0 中的各成员盘的具体结构是怎样的,写入的各部分数据有什么作用。我们回到 0 号扇区,找到那个软分区表,分区表显示分区的起始扇区是 63 号扇区,那么也就是说磁盘加入阵列的起始扇区是 63 号扇区。通过搜索发现前面的 63 个扇区除了 0 号扇区有一个软分区表 6 号扇区有一些东西其他扇区都是零。好的,我们转到 63 号扇区看看。1 确定盘序:看到了吗 ,硬盘 1 的 63 号扇
7、区是 DBR 而其他两块盘的 63 号扇区不是 DBR 而是数据,这样我们就能知道硬盘 1 就是这个 RAID0 的第一块盘了。至于剩下的两块盘的盘序就通过其他方法确认了,而且我们在这里知道了硬盘 1 是 RAID0 的第一块盘,那么硬盘 2 和硬盘 3 肯定就是相邻的了。我们可以通过寻找硬盘 2 和硬盘 3 的 MFT 来确认他们的盘序和块大小。这个方法不错。但是很遗憾,我做的这个 RAID 居然找不到合适的 MFT。也就是说通过比较 MFT 来判断盘序和块大小的方法就没戏了。那我们怎么办,马老师貌似没有给出方法了。看来我们的自己寻找解决的方法了。因为此 RAID 采用的是 NTFS 文件系
8、统,那么我们能不能根据对 NTFS 文件系统的特点,找找看能不能通过其他的一些特征来确定盘序和块大小呢?我们通过分析 DBR 得出:1, 每簇扇区数 1 个;2, $FT 起始簇号 401408 这里就是 401408 号扇区了;3, $MFTMIRR 起始簇号 602111 这里也就是 602111 号扇区了;4, 分区总扇区数 1204223 个扇区;我们就想了,硬盘 1 已经确定是 RAID0 的第一块盘了, $MFTMIRR 的起始扇区在$MFT的后面。那么系统就是先向磁盘写入$MFTMIRR 然后再写入$MFT 了。好的,我们就根据以 MFT 为线索,我们把每块成员盘的 MFT 搜索
9、出来,当然就搜索前面几个 MFT 项就行了。这里我就直接给出我搜索出的结果了硬盘 1 在 20768 号扇区搜到了第一个 MFT 项,这块硬盘一共有 3 个 MFT 项分别是1 号 2 号 3 号 MFT 项。硬盘 2 133823 号扇区搜到了第一个 MFT 项,这块硬盘一个找到了从 0 号 MFT 项到 36 号 MFT 项,我们知道$MFT 记录的 0 号 MFT 项到 15 号 MFT 项是 NTFS 文件系前面 16 个重要的元文件 16 到 23 号用作保留。而我们这里出现了 36 号 MFT 项,显然这个就是文件的 MFT 项了。硬盘 3 200766 号扇区找到了第一个 MFT
10、 项,这块硬盘就一个 MFT 项,是 0 号 MFT。现在我们应该就能判断了吧,硬盘 2 号记录的是$MFT 这个元文件,而硬盘 1 和硬盘 3 记录的是$MFTMIRR 这个元文件,也就是 $MFT 这个元文件前 4 个 MFT 项的备份,这个和NTFS 系统的描述的样。呵呵,看来分析对了。 。 。我们说了系统先写入$MFT 在写入$MFTMIRR 而硬盘 2 就是$MFT 硬盘 1 和硬盘 3 是$MFTMIRR 而我们前面已经确定硬盘 1 是 RAID 的第一块盘,这里我想我们就能判断出硬盘 2 就是 RAID0 的第二块盘了吧。硬盘 3 是第三块盘。而且根据各磁盘上的 MFT 参考号,
11、我们也能判断出,系统先向硬盘 1 写入数据,到该写入$MFT 元文件的时候,就转到了硬盘 2 向硬盘 2 写入,写入完成之后又转到了硬盘 3 开始写入$MFTMIRR,因为硬盘3 记录的 MFI 参考号是 0 接着又跳转到了硬盘 1 继续写入没有写完的$MFTMIRR 所以硬盘 1 的 MFT 参考号是从 1 号开始的,这样就形成了一个完整的写入过程了。 。盘序分析就出来了。 。 。盘序就是 硬盘 1 硬盘 2 硬盘 32 确定块大小方法一:猜, 逐个试,这个方法虽然笨了一点,但是很管用,我们已经确定了盘序,磁盘加入阵列的起始扇区是 63 号扇区,而块大小是 2 的整数次冥,也就是只可能是 2
12、 4 8 16 32 64 128等等,那么就挨个试,如果块大小吻合,那么数据就能恢复成功。这里我在选择块大小是128 时,数据完美重现了,恢复完成。方法二。通过 NTFS 的特点以及根据实际的情况就行选取特征计算出块大小,如果,实际情况是能出现马林老师素材中的情况就好了,就能通过 MFT 项来计算出块大小了,但是很遗憾实际情况没有出现那种情况,具体的操作方法,请大家讨论讨论了,呵呵。 。好了,就写到这里了,本文的主要目的是讲解 RAID0 的理论原理,动态磁盘,看看RAID0 中系统到底对磁盘进行了哪些写入。这样大家再分析 RAID 的时候就能做到心中有数了。如果要做阵列恢复,猜测盘序和块大小是一种不错的方法。 。