天天看点

RAID5恢复揭秘:计算各个成员盘第一个校验块的位置

】本内容摘自《数据重现-文件系统原理精解与数据恢复最佳实践》

前面我们提到,利用阵列0号成员盘上第一个校验块的位置可以判断阵列的校验循环方向。不只如此,当阵列的校验循环方向确定后,还可以利用每个成员盘上第一个校验块的位置,对盘序进行判断。

例如,假设一个左循环阵列由N块磁盘组成,那么,0号块为校验的是最后一块磁盘,也就是N-1号磁盘;1号块为校验的是N-2号磁盘…,N-1号块为校验的是0号磁盘。同样,对于由N块磁盘组成的右循环阵列,0号块为校验的是0号磁盘,1号块为校验的是1号磁盘…,N-1号块为校验的是N-1号磁盘。

但是,很多情况下,我们并不能直接判断出一个磁盘的第一个校验块位置是否是校验内容。比如,对于MBR磁盘,1~62号扇区的内容通常全是0,假设一个阵列由3块磁盘组成,块大小为8个扇区,那么,它们校验的结果也会是0,我们无法通过它们来判断哪个是数据块,哪个是校验块。如图11.28所示,被加亮显示的部分全部为0。

虽然在这种特殊情况下不能直接判断哪一个是校验块,但我们毕竟可以在磁盘的其他某个位置找到能够证明当前位置是校验数据的扇区,比如FAT表、MFT等。在知道块大小的情况下,我们可以利用当前位置的扇区号与块大小计算出该磁盘第一个校验块的块号。

下面,我们以一个由三块磁盘组成的、块大小为8个扇区的RAID5为例说明如何进行计算(见图11.29)。在计算的过程中会使用取整与取余运算,如果读者对此不太了解,请查阅第一章的基础知识部分。

首先我们说明一下块号与条带号,对于某个扇区来讲,它的条带号与块号是相同的,只不过在本磁盘内称为块号,而对于整个磁盘组,我们称之为条带号。比如,所有磁盘的0号扇区都属于0号条带,1号磁盘的0号扇区也不例外。但对于1号磁盘来讲,它的0号扇区位于它的0号块。

我们从图11.29中看到,磁盘数为3,从第一个校验块起,经过3个条带后,校验块的位置就又回到原来的磁盘。比如,0号条带的校验位于2号盘,经过0、1、2号三个条带,3号条带内的校验块又回到2号盘上。

我们把所有的条带进行分组,每个组的条带数与阵列中的磁盘数相等,并把每个组称为一个整循环。如0~2号条带为一个整循环,同样,3~5号条带也是一个整循环。

可以发现,在所有的整循环内,校验块的布局位置是相同的。每个磁盘上的第一个校验块也就是第1个整循环内的校验块,我们要想知道某个磁盘上的第一个校验块在第1个整循环内的位置,只要知道该磁盘上的某个校验块在它本身所处的整循环内的位置即可。

例如,图11.29中,假设我们并不知道第一个整循环内所有校验的位置,但我们知道1号磁盘的36号扇区是校验,而且也知道块大小为8个扇区,只要我们能够知道36号扇区在本整循环内的条带号,也就知道了1号磁盘的第一个校验块的块号。

那么,如何知道一个扇区在本整循环内的条带号呢?为了便于理解,我们先来看第一个整循环内的扇区位置。假设我们想知道某个磁盘的10号扇区的条带号,我们只要用这个扇区号对每块扇区数做取整运算即可,即:

10 DIV 8 = 1

也就是说10号扇区位于1号块。同样,如果我们要计算36号扇区在本整循环内的条带号,首先要知道它相对于本整循环在本磁盘上起始位置的扇区偏移,然后用这个扇区偏移对每块大小扇区数做取整运算即可。

要计算一个磁盘某扇区相对于本整循环在本磁盘上起始处的扇区偏移,只要用这个扇区号对每个整循环包含的单磁盘的扇区数取余即可,我们知道,图11.29中的阵列,每块大小为8个扇区,每个整循环包括3个条带,因此,每个磁盘在一个整循环中的扇区数为8 × 3 = 24个扇区,所以,36号扇区相对于本整循环在本磁盘上起始位置的扇区偏移为:

36  MOD (8 × 3)= 12

然后,我们再用这个扇区偏移对每块扇区数做取整运算即可得到它的条带号,即:

12 DIV 8 = 1

因此,1号磁盘的36号扇区位于本整循环内的1号条带,对于1号磁盘来讲,则是1号块。这也就意味着,1号磁盘上的第1个校验块位于1号块。由此,我们可以得到计算磁盘上第一个校验块块号的公式:

第一个校验块的块号=已知校验位置扇区号MOD(每块扇区数 * 磁盘数)DIV 每块扇区数

只要知道磁盘上的某个位置确定为校验,并且知道每块的大小扇区数,就可以利用这个公式很容易地计算出该磁盘上第一个校验块的位置。

本文转自老骥伏枥51CTO博客,原文链接: http://blog.51cto.com/sjhfml/137493,如需转载请自行联系原作者

继续阅读