陈培德,吴建平
(云南大学 信息学院,云南 昆明 650223)
全局唯一标识GPT是globally unique identifier partition table的缩写,其含义是“全局唯一标识磁盘分区表”[1],它是可扩展固件接口(EFI)标准的一部分[2]。GPT的出现是为了替代旧式的MBR(master boot record)[3],主要解决了MBR分区表不支持容量大于2.2 TB的分区问题[4]。
由于MBR分区最多包含4个项目,多于4分区则采用扩展分区的形式来管理,每个分区项目定义了主分区在磁盘上的位置[5]。
目前,微软公司Windows 10使用了GPT磁盘分区格式,同时Windows 10不再支持MBR。计算机如果使用Windows 10就必须采用MBR分区格式,这样不同分区表误操作、误转换的结果是硬盘中原有的磁盘分区表丢失,磁盘中的数据不能正常读取。在Windows 7和Windows 10用户数量庞大的今天,这种因GPT分区表问题导致硬盘中的数据无法读取和使用的问题较为突出[6]。
当GPT存储磁盘出现误操作或操作系统本身故障所造成的分区表损坏、数据不可见、不可读的数据等问题的时候,有可能是GPT分区表的逻辑出错,可以通过一定的技术手段,对保存在台式机硬盘、笔记本硬盘、服务器硬盘等设备上丢失的宝贵数据进行抢救和恢复。
从整体来看,GPT磁盘主要由6大部分组成[7]。即保护MBR、GPT头、GPT分区表、GPT分区区域(即文件系统所在区域)、GPT分区表备份和GPT头备份[8]。大致结构如图1所示[8](注:假设GPT磁盘的扇区号范围为0 ~n-1,其中n为GPT磁盘的总扇区数)。
图1 GPT磁盘的整体结构
(1)保护MBR。
保护MBR位于GPT磁盘的0号扇区[9],也是由主引导记录、磁盘签名、MBR分区表和结束标志4个部分组成[10-11]。在MBR分区表中,分区标志为0XEE[2],相对扇区为1,总扇区数为4 294 967 295,也就是分区总数的最大值[2],即该磁盘已经被GPT分区占用,不能再进行MBR分区。
(2)GPT头。
GPT头位于GPT磁盘的1号扇区[12],该扇区是在将MBR磁盘转换成GPT磁盘后自动生成的,GPT头定义了GPT分区各参数的基本信息[12],GPT头也就是对整个GPT磁盘的整体描述。其定义如表1所示。
表1 GPT头各项参数含义
续表1
(3)GPT分区表。
GPT分区表位于GPT磁盘的2~33号扇区,共占用32个扇区,每个分区表占128字节,最多可以容纳128个分区表,由于第1个分区表为系统保留,所以用户在GPT磁盘上最多可以再建立127个分区,每个分区表管理一个分区。其定义如表2所示。
表2 GPT分区表各项参数含义
表3 GPT分区类型GUID定义说明[2]
(4)分区区域。
GPT分区区域是整个GPT磁盘中最大的区域,位于GPT磁盘的中间位置,GPT分区区域的开始扇区和结束扇区由GPT头定义[2],一般情况下,开始扇区为34号扇区,而结束扇区为GPT磁盘总扇区数减去35。该区域由多个具体的分区组成,如:微软保留分区、EFI系统分区、LDM元数据分区、LDM数据分区、OEM分区和主分区等[2]。各分区的开始扇区和结束扇区在各分区表中均有定义。
(5)分区表备份。
一般情况下,分区表备份位于GPT磁盘的倒数33号扇区~倒数2号扇区,也是占用32个扇区,是GPT分区表位于GPT磁盘的2~33号扇区的备份。其定义如表4所示。
表4 GPT头备份各参数含义
(6)GPT头备份。
GPT头备份位于GPT磁盘的倒数1号扇区,该扇区也是在将MBR磁盘转换成GPT磁盘后自动生成的,GPT头备份也是定义了GPT分区各参数的基本信息,但该扇区不是GPT头的简单备份,GPT头备份对GPT分区各参数基本信息的定义与GPT头对GPT分区各参数基本信息的定义稍有不同。GPT头备份也是对整个GPT磁盘的整体描述。
(1)操作系统:Windows 7;
(2)数据恢复软件及分析工具:WinHex 15.08。
(1)在Windows 7操作系统下,使用Windows 7的虚拟磁盘管理功能在D盘的根目录上建立一个名为abc1.vhd的文件,文件大小为1 GB;
(2)将abc1.vhd文件附加为虚拟磁盘1,转换成GPT磁盘;在磁盘1上依次建立6个分区,磁盘1中6个分区的容量分别为150 MB、60 MB、100 MB、180 MB、230 MB和270 MB;
(3)使用WinHex软件打开磁盘1,将磁盘1的0号扇区以文件的形式保存,文件为“保护MBR.vhd”;
将磁盘1的1号扇区以文件的形式保存,文件为“GPT头.vhd”;
将磁盘1的2~3号扇区以文件的形式保存,文件名为“GPT分区表.vhd”;
将磁盘1的2 097 151号扇区以文件的形式保存,文件为“GPT头备份.vhd”;
至此,保护的MBR、GPT头、GPT分区表、GPT头备份的模板已制作完成。
(4)分离abc1.vhd文件。
(1)在Windows 7操作系统下,使用Windows 7的虚拟磁盘管理功能在D盘的根目录上建立一个名为abc2.vhd的文件,文件大小为2 GB;
(2)将abc2.vhd文件附加为虚拟磁盘2,转换成GPT磁盘;在磁盘1上依次建立4个分区,并对4个分区进行快速格式化操作,文件系统均选择NTFS,磁盘1中4个分区依次对应4个逻辑盘情况如下:
H盘,文件系统:NTFS,容量:350 MB
I盘,文件系统:NTFS,容量:600 MB
J盘,文件系统:NTFS,容量:800 MB
K盘,文件系统:NTFS,容量:260 MB
(3)分别在H盘、I盘、J盘和K盘中存储一些文件夹和文件;
(4)将H盘、I盘、J盘和K盘的GPT分区删除;并将GPT磁盘转换为MBR磁盘。
至此,实验素材已制作完成。
(1)恢复0号扇区保护的MBR;
(2)恢复GPT头;
(3)恢复GPT头备份;
(4)恢复GPT分区表和GPT分区表备份。
恢复GPT分区的基本方法如下:
(1)通过计算机管理中的磁盘管理功能将MBR磁盘转换为GPT磁盘;从而实现恢复0号扇区保护的MBR、GPT头和GPT头备份;
(2)由于将MBR磁盘转换为GPT磁盘后,在2号扇区只存储了一个微软保留的GPT分区表,所以,GPT头中的“GPT头CRC32校验和”和“GPT分区表CRC32校验和”这两个参数要重新计算[13];
(3)同理,GPT头备份中的“GPT头备份CRC32校验和”和“GPT分区表备份CRC32校验和”这两个参数也要重新计算;
(4)通过WinHex的“扫描丢失分区”获得4个逻辑盘的开始扇区号和4个逻辑盘的容量,通过4个逻辑盘的容量可以计算4个逻辑盘的总扇区数;
(5)通过4个逻辑盘的开始扇区号和总扇区数,可以计算4个逻辑盘的结束扇区号;
(6)将“GPT分区表.vhd”文件复制到GPT分区表所在扇区号,并修改4个GPT分区表中的开始扇区号和结束扇区号;
(7)通过GPT分区表恢复GPT分区表备份;
(8)通过GPT分区表计算GPT头和GPT头备份中的“GPT分区表CRC32校验和”;
(9)计算GPT头中的“GPT头CRC32校验和”;
(10)计算GPT头备份中“GPT头备份CRC32校验和”。
通过以上操作,可以完整恢复GPT分区表、GPT分分区表备份、GPT头和GPT头备份。
根据恢复GPT分区的基本思路与方法,恢复GPT分区的步骤如下:
1、获得4个逻辑盘的基本情况。
(1)在Windows 7操作系统下,启动WinHex;
(2)文件-->打开-->选择D盘根目录上的abc2.vhd文件,打开D盘根目录上的abc2.vhd文件;
(3)专家-->映象文件为磁盘,将abc2.vhd文件映像为磁盘;
(4)工具-->磁盘工具-->扫描丢失分区,可以获得4个丢失分区的基本情况,如图2所示;
图2 获得4个丢失分区的情况
(5)从图2可以获得4个逻辑盘的文件系统、容量和开始扇区号,填入表5中;
(6)通过各逻辑盘容量可以计算出各逻辑盘的总扇区数;
H盘总扇区数=容量*1 024*1 024/512
=350*1 024*1 024/512
=716 800
I盘总扇区数=容量*1 000*1 024*1 024/512
=0.6*1 024*1 024*1 024/512
=1 228 800
J盘总扇区数=容量*1 024*1 024*1 024/512
=0.8*1 024*1 024*1 024/512
=1 638 400
K盘总扇区数=容量*1 024*1 024/512
=260*1 024*1 024/512
=532 480
(7)通过各逻辑盘的总扇区数和DBR所在扇区号可以计算DBR备份所在扇区号;
H盘结束扇区= H盘开始扇区+H盘总扇区数-1
=65 664+716 800-1
=782 463
I盘结束扇区= I盘开始扇区+I盘总扇区数-1
=782 464+1 228 800-1
=2 011 263
J盘结束扇区= J盘开始扇区+J盘总扇区数-1
=2 011 264+1 638 400-1
=3 649 663
K盘结束扇区= K盘开始扇区+K盘总扇区数-1
=3 649 664+532 480-1
=4 182 143
将H盘、I盘、J盘和K盘的总扇区数和结束扇区号填入表5。
表5 磁盘1各逻辑盘基本情况
2、将MBR磁盘转换为GPT磁盘。
(8)在Windows 7操作系统下,使用Windows 7的虚拟磁盘管理功能附加D盘根目录上的abc2.vhd文件为磁盘1;
(9)将光标移动到“磁盘1 基本2 GB 联机”处,右击,从弹出的快捷菜单中选择“转换成GPT磁盘(V)”;
至此,磁盘1由MBR磁盘转换为GPT磁盘。
(10)将光标移动到“磁盘1 基本1.97 GB 联机”处,右击,从弹出的快捷菜单中选择“分离VHD”,将磁盘1分离。
3、重建4个逻辑盘GPT分区表。
(1)在Windows 7操作系统下,启动WinHex;
(2)文件-->打开-->选择D盘根目录上的abc2.vhd文件,打开D盘根目录上的abc2.vhd文件;
(3)专家-->映像文件为磁盘,将abc2.vhd文件映像为磁盘;
(4)打开“GPT分区表.vhd”文件,并全选该文件,单击“复制”按钮;
(5)将标移动到abc2.vhd文件的2号扇区开始位置,单击“粘贴”按钮;
(6)视图-->模板管理器-->GPT Partition table,在图3中分别输入4个逻辑盘的开始扇区和结束扇区。
图3 通过模版输入4个分区的开始扇区和结束扇区
至此,GPT分区表已恢复。
4、恢复4个逻辑盘GPT分区表备份。
(7)从GPT头可以获得GPT分区表备份在4 194 271号扇区,将2号扇区复制到4 194 271号扇区,至此,GPT分区表备份已恢复。
5、重建GPT头。
(8)选中2号扇区到33号扇区,即GPT分区表所在扇区号;
(9)工具-->比较Hash值-->CRC32(32Bit),可以获得GPT分区表的CRC32校验和为“F0E2AC5D”;GPT分区表的CRC32校验和在GPT头中的存储形式采用小头位序,占4个字节,所以,在GPT头扇区偏移0X58~0X5B中的存储形式为“5D AC E2 F0”;
(10)将1号扇区偏移0X58~0X5B处的值修改为“5D AC E2 F0”(注:存储形式);
(11)将1号扇区偏移0X20~0X23处的值修改为“00 00 00 00 00”(注:存储形式);
(12)选中1号扇区偏移0X00~0X5B这92个字节;
(13)工具-->比较Hash值-->CRC32(32Bit),可以获得GPT头的CRC32校验和为“DE370F6F”;GPT头的CRC32校验和在GPT头中的存储形式采用小头位序,占4个字节,所以,在GPT头扇区偏移0X20~0X23中的存储形式为“6F 0F 37 DE”;
(14)将1号扇区偏移0X20~0X23处的值修改为“6F 0F 37 DE”(注:存储形式);然后存盘。
至此,GPT头已恢复。
6、重建GPT头备份。
(15)将光标移动到4 194 303号扇区,将偏移0X58~0X5B处的值修改为“5D AC E2 F0”(注:存储形式);即修改GPT分区表备份的CRC32校验和;
(16)将4 194 303号扇区偏移0X20~0X23处的值修改为“00 00 00 00 00”(注:存储形式);
(17)选中4 194 303号扇区偏移0X00~0X5B,工具-->比较Hash值-->CRC32(32Bit),可以获得GPT头的CRC32校验和为“7E5F9703”;
(18)将4 194 303号扇区偏移0X20~0X23处的值修改为“03 97 5F 7E”(注:存储形式);然后存盘。
至此,GPT头备份已恢复。
完成以上操作后,GPT磁盘中的保护MBR、GPT头、GPT分区表、GPT分区表备份和GPT头备份已成功恢复。通过计算机管理中的磁盘管理附加abc2.vhd后,在资源管理器中可以看到到H盘、I盘、J盘和K盘符。
如果GPT磁盘总容量小于2.2 TB,且分区总数小于4个时,也可以在硬盘0号扇区通过重建4个MBR的形式来恢复各逻辑盘中的全部数据。
由于MBR分区表存储在0号扇区,逻辑盘的开始扇区也就是0号扇区MBR分区表中的相对扇区;根据相对扇区、总扇区数和分区标志可以得到存储在0号扇区的4个MBR分区表如表6所示。
表6 存储在0号扇区的4个MBR分区
使用WinHex软件打开abc2.vhd,并映像为磁盘,将H盘、I盘、J盘和K盘的4个MBR分区填入到0号扇区偏移0X01BE~0X01FD处,如图4所示;然后存储并退出WinHex;即可恢复0号扇区的4个MBR分区表。
图4 在0号扇区输入4个分区的MBR分区表
通过计算机管理中的磁盘管理附加abc2.vhd后,在资源管理器中可以看到H盘、I盘、J盘和K盘符。
综上所述,当GPT磁盘中的分区被删除,并将GPT磁盘转换为MBR磁盘后,通过扫描丢失分区功能获得逻辑盘的开始扇区号和容量,通过容量计算各逻辑盘的总扇区数,通过各逻辑性盘的开始扇区号和总扇区数,计算出各逻辑盘的结束扇区号,通过修改GPT分区表中的开始扇区号和结扇区号,就可以恢复GPT分区表。
通过计算GPT头中的GPT分区表CRC32校验和与GPT头校验和就可以恢复GPT头;通过计算GPT头备份中的GPT分区表CRC32校验和与GPT头备份校验和就可以恢复GPT头备份。这样也就可以恢复GPT磁盘中各逻辑盘的全部数据;如果GPT磁盘总容量小于2.2 TB,且分区总数小于4个时,也可以在硬盘0号扇区通过重建MBR的形式来恢复各逻辑盘中的全部数。