案列背景:看了网上、书上关于raid的重组基本都是在ntfs或fat文件系统下的,就想试试ext4文件系统,刚好以前搭过一个Linux系统的阵列,就拿来练手了。
Linux系统基本情况:共用5块2T的硬盘,一块用作系统盘,剩下4块组了一个raid5的阵列。直接拆盘,raid的配置参数没看。
所需理论知识:raid的原理、MBR分区、GPT分区、ext4文件系统,重点推荐马林的《数据重现》。
好,正式开始:
1、将5块拆下的硬盘通过只读接口接入电脑,用FTK加载5块硬盘,只有5号盘能正常显示,根据内容判断为系统盘,剩下4块为raid。
2、4块2T的硬盘组成的raid 5容量为6T,因为MBR分区最大只能支持2T,所以这个阵列应该是GPT分区,依次查看每块磁盘的0号扇区,只有6号盘的0号扇区符合GPT分区的特征,第一扇区为保护性MBR(55AA为标志)。
3、地址0X01C6-0x01C74个字节内容为:01 00,为第一分区的起始扇区,即1号扇区,(关于的字节顺序这里也是小字节顺序:即低位在前)。并且整个raid只有一个分区。
4、查看第一扇区,偏移地址0x00-0x07为“45 46 49 20 50 41 52 54”对应ASCII码为“EFI PART”,这是GPT头签名,证实的确是GPT分区,偏移0x28-2F表示分区的起始扇区位置,为第34号扇区。偏移地址0x48-0x4f表示分区表起始扇区,为2号扇区。
5、在2号扇区里的分区表中,偏移地址0x00-0x0f表示分区类型,在这里可以查看分区是什么文件系统类别,参考资料上没有列出EXT4文件系统的标识码,猜想下面“”A2…C7"这一串可能表示是EXT4文件系统,之后再结合后面的信息来判断。
6、对于ext系的文件系统而言,第一、二号逻辑扇区为引导程序专用,如果没有引导程序,这两个扇区保留不用。第三、四号扇区是超级块的位置。结合GPT分区的起始扇区为34号扇区,查看34号扇区,34号扇区和35号扇区都是空白,36号扇区有内容,这种结构符合ext文件系统特点。转到36号扇区,对照超级块的结构定义仔细查看。偏移地址0x38-0x39为“53EF”这是ext文件系统的签名标志,所以它应该是ext文件系统。下面来解读超级块:
0x04-0x07:文件系统总块数:0x57542BF7=1465134071
0X18-0X1B:每个块占用的字节数:0x02,为:2^2*1024=4kb,即一个块是8个扇区(一个扇区512byte)
0x20-0x23:每个块组包含的块数量:0x8000=32768
0x08-0x0b:为文件系统预留的块数量:0x45dceff=73256703
使用的块为:块总数-预留的块=1391877368
总共有多少个块组:使用的块/每个块组包含的块数量=42476.656,为42477个。即共有42477个块组,每个块组有一个块位图,即块位图为:42477个。
关于块位图的作用:一个块组里面有32768个块,操作系统怎么知道哪些块已经使用,哪些块还没有用,如果用32768个bit位来标识,用了的块对应的bit位标识为1,没有用的块标识为0,这样系统扫描这32768个bit位就知道一个块组哪些块用了,哪些没有用。这32768个bit位就是块位图,位于每一个块组的第一个块。32768bit=4KB,刚好一个块,也必须等于一个块,因为块组的大小设定结合快位图的特点,必须等于一个块的bit数。
(对于以上内容的理解,请结合《数据重现》第5章)
7、对于ext文件系统而言,块组描述符表位于超级块所在块的下一块,已知块大小为8个扇区,即块组描述附表应该位于:34+8=42扇区。并且36、37扇区(超级块所在扇区)之后的39-41号扇区应该没有内容,经查看,符合推断。查看块组表示符表所在的42号扇区。
块组描述符表内用32个字节存放一个块组的描述符,块组描述符里指定了这一个块组块位图起始地址和其他信息,(我们重点先关注块位图)。之前算出有42477个块组,就有42477个块组描述符。
在42号扇区中, 偏移地址0x00-0x03,块位图的起始块号:0x401号块,这表示0号逻辑块组开始于0x401号块。
偏移地址0x20-0x23表示第二块组的块位图起始块号为:0x402号块。依次查看发现42号扇区里共有16个块组描述符,并且这16个块组的快位图是从0x401号块依次存放的,没有放到每一个块组的第一个块。这和第6点讲的“每个块位图放在每个块组的第一个块”不符合。
仔细查看ext4和ext3文件系统的区别,在ext4文件系统中引入了段的概念,对于一个包含32768个块的块组,大小为:128MB(一个块大小为8扇区4KB),存放100G的数据需要很多块组,并且这些块组在物理上不是连续的,那么数据的存取会比较慢,如果把物理上连续的块组拼在一起组成一个更大的“块组”来存放大数据,效率会高很多。于是引入“段”,一个段包含连续的几个块组,每一个块组的块位图都按块组顺序存放在“段“的最前面的块上。
16个块组的大小为:16*0x80 00=0x08 00 00,也就是说下一个段的起始块为0x401+0x08 00 00=0x08 04 01,查看43号扇区,第二段的第一个块位图起始块号为:0x08 00 00,有些误差。再看44号扇区,第三段的第一块位图起始块号:0x10 00 00,与第二段相差刚好0x08 00 00个块。继续依次查看下面的扇区,发现从第二段开始,每段相距都是0x08 00 00个块。
8、42477个块组,16个块组一个段,共有2654.8个段即2655个段,一个段的块组描述符占一个扇区,共需要2655个连续扇区。
Raid的条带的大少为2的冥次方,并且应该大于一个块的大小,即为16扇区、32扇区、64扇区、128扇区、256扇区等等。结合上面的信息,这个raid5的条带应该大于等于64个扇区,我们先关注63号扇区到64号扇区之间段的块组描述符里的块位图起始地址是否连续,这里的连续理解为:63号扇区的段第一个块位图起始块号与64号扇区的段的第一块位图起始快号相差0x08 00 00个,如下图63、64号扇区是连续的,说明条带大于64个扇区,继续看127、128号扇区
127号扇区段的块位图起始块号为:0x02 A8 00 00,
128号扇区段的块位图起始块号为:0x0A B0 00 00,
如果逻辑上两个段是连续的,128号扇区段的块位图起始块号应该为:0x02 A8 00 00+0X08 00 00=0X02 B0 00 00,所以raid的条带大小为128个扇区,即64KB。第二块磁盘的0扇区也应该放的块组描述符表,并且偏移地址0x00-0x03上的内容应该为:00 00 B0 02
9、查看另外3块磁盘0号扇区,发现2号磁盘的0号扇区符合推断,继续看2号磁盘的127、128扇区
127号扇区段的块位图起始块号为:0x06 A8 00 00,
128号扇区段的块位图起始块号为:0x0E B0 00 00,不是相差0x08 00 00,再次证实条带大小为128个扇区。逻辑上,下一个扇区段的块位图起始块号应该为:0x06 A8 00 00+0X08 00 00=0X06 B0 00 00
10、查看剩下两块磁盘的0号扇区,发现4号磁盘的0号扇区符合推断
剩下的3号磁盘就是存放的第一块校验数据。由此已经确定盘序为:6-2-4-3,条带大小为:64KB。2655个段能确定2655/128=20.7即21个数据块,按照上述办法足以确定raid5的校验块位置和走向,建立下图所示的表格
由上述表,可以知道这个raid5为左异步。
11、用取证大师(或者winhex)加载阵列,按照推算出的参数选择
最后成功完成raid5的重组。
总结:ext4文件系统的raid5重组,关键是利用了块组描述符表中块位图的起始块号来完成的。该案例中的ext4文件系统:
1个块=8个扇区
1个块组=32768个块
1个段=16个块组
一个块组中哪些块使用了,哪些块空闲是用的块位图来标识。ext3中块位图是位于每一个块组的第一个块。在ext4中,引入段的概念。一个段中的16个块位图是依次放在段的最前面16个块中。而块位图在硬盘的哪个位置是用块组描述符中偏移地址0x00-0x03来标识的。
在ext4文件系统中,除系统保留的块外,所有的块组,每一个块组都有一个块组描述符。这些块组描述符集中保存在块组描述符表中。块组描述符表固定位置为:超级块所在块的下一个块。