潇湘溪苑帝倾天下:手工恢复硬盘分区表

来源:百度文库 编辑:中财网 时间:2024/04/29 20:56:58
手工恢复硬盘分区表
想必大家都有过数据丢失的糟糕经历,费尽心力收集的数据,由于病毒破坏、误删除、误格式化、分区软件误操作、存储设备损坏等原因而毁之一旦,真是令人痛心。其实我们只要静下心来学习一点数据恢复方面的浅近知识,遇上这样的倒霉事,只要不是严重的硬件损坏,就能挽回一部分数据,运气不错的话,找回全部数据也是可能的。
    讨论数据恢复,我们先来看看最简单的情况:单纯的硬盘分区表损毁(非硬件损坏),现象——分区丢失。要重建硬盘分区表,就得搞清楚硬盘分区是如何组织的,下面先介绍相关的背景知识。
  一、硬盘文件系统寻址方式:CHS和LBA
  1.CHS寻址方式
    CHS是Cylinder(柱面)/Head(磁头)/Sector(扇区)的缩写。    为什么会有这些参数,这要从硬盘的结构说起。硬盘通常是由几个盘片叠加在一起,每个盘面由一个磁头访问,盘面又划分为许多同心圆环,这就是磁道,每条磁道又划分为许多区段,每个区段就称为一个扇区。硬盘的存储单位是扇区,数据就存储在扇区里。
    由此产生了所谓的3D参数(Disk Geometry),即磁头数(Heads)、柱面数(Cylinders,所谓柱面是由半径相同分属不同盘面的若干磁道组成)、扇区数(Sectors),以及相应的寻址方式。见附图:
    在硬盘文件系统中规定:
     磁头数(Heads) 表示硬盘总共有几个磁头,也就是有几面盘片,     最大为 255 (用 8 个二进制位存储);     柱面数(Cylinders) 表示硬盘每一面盘片上有几条磁道,     最大为 1024(用 10 个二进制位存储);     扇区数(Sectors) 表示每一条磁道上有几个扇区,     最大为 63 (用 6个二进制位存储)。     每个扇区一般是 512个字节,理论上讲这不是必须的,但好象没有取别的值的。
    所以CHS 方式最大寻址范围为:    255 * 1024 * 63 * 512 / 1000 / 1000 / 1000 = 8.4 GB。             在 CHS 寻址方式中,磁头,柱面,扇区的取值范围分别为    0到 Heads - 1, 0到 Cylinders - 1,1到Sectors (注意是从1开始)。
    当硬盘需要读取某一扇区的数据时,先确定柱面号,再确定磁道(磁头)号,逐级缩小范围,最后确定扇区号,这样就完成了寻址过程。只要确定CHS参数,硬盘就指定相应的磁头到相应的磁道和扇区去读写数据。
    需要说明的是所谓的CHS参数与硬盘真实的柱面号、磁头号、扇区号并不是一一对应的,一般的硬盘磁头也就有几个,不可能到255之多。物理上的柱面号、磁头号、扇区号与文件系统中的CHS 参数存在一定的转换关系,这由硬盘的固件去完成,我们不必关心,在这里,我们只关注文件系统中的CHS 参数。
  2.LBA寻址方式
    随着硬盘技术的不断发展,其容量也不断增大,现在的硬盘早就超过了8G的容量,在硬盘文件系统中采用CHS寻址方式已经满足不了需要了,那么在现代硬盘的文件系统中又是如何寻址的呢?现在的硬盘文件系统基本都采用线性寻址的方式,即把硬盘上所有可用扇区(假定数目为N)从0到N - 1按序编号,硬盘读写数据时按扇区号寻址,这就是LBA寻址方式(logic block address),扇区编号也就是该扇区的LBA地址。
    尽管LBA已经成为硬盘文件系统的主流寻址方式(小于8.4G的分区仍需在分区表中标注CHS 参数,在大于8.4G的分区,CHS 参数就没有什么意义了,此时须用LBA 方式寻址),但在Windows 系统中整个硬盘的逻辑结构仍然是以传统上的CHS 方式组织起来的,硬盘文件系统是由整数柱面组成。现代硬盘文件系统的柱面数已经突破了1024的限制,最大磁头数和扇区数仍为255和63。相对于LBA 来说,CHS模式较为直观,所以磁盘编辑器通常采用CHS模式来作为磁盘逻辑结构划分方式。
  二、MBR(Master Boot Record)、DPT(Disk Partition Table)、    主分区(Primary Partition)、扩展分区(Extended Partition)    和逻辑分区(Logical Partition)
    硬盘的第一个扇区被称为主引导扇区,习惯上称为MBR,CHS参数为0,0,1,LBA参数为0,它包含了硬盘引导程序和硬盘分区表(DPT),作用十分重要,如果MBR扇区受损,那么系统就无法访问这个磁盘了。
  1.MBR引导程序概述
    MBR扇区的512字节数据中,前446字节(0 to 0x1BD)存放硬盘引导程序代码。电脑从硬盘启动时,系统从硬盘中首先读取MBR引导代码,其流程大致如下:
    (1)   将程序代码由0:7C00H移动到0:0600H(注,BIOS把MBR放在0:7C00H处)    (2)   搜索可引导分区,即80H标志          成功:goto 3          失败:跳入ROM BASIC          无效分区表:goto 5    (3)   读引导扇区          失败:goto 5          成功:goto 4    (4)   验证引导扇区最后是否为0xAA55H          失败:goto 5          成功:goto 6    (5)   打印错误进入无穷循环    (6)   跳到0:7C00H进行下一步启动工作
    然后MBR引导程序就把系统控制权交给操作系统引导程序。    如果MBR损坏硬盘无法访问,可在DOS下输入:    Fdisk /cmbr X(X = 1,第一块硬盘;X = 2,第二块硬盘),重写主引导记录。
  2.硬盘分区表(DPT)
    MBR 扇区的最后66字节除去末尾的标志0xAA55H(所有引导扇区的标志。由于磁盘编辑器中的显示内容是从低址到高址排列的,所以AA55显示为55AA)外,剩余的64字节被称为硬盘分区表。硬盘分区表包含四个项目,每项16字节,代表四个分区的参数。分区表项的各字节含义如下:
    偏移            意义    0       自举标志(80为活动分区,00为非活动分区)    1       起始磁头号H    2       起始扇区号S    3       起始柱面号CYL(CYL的高2位存放在S字节的高2位)    4       分区格式标志(05:DOS Extended;06:BIGDOS FAT16;               07:NTFS;0B:FAT32;               0C: FAT32(对INT 13H指令使用LBA);               0E: FAT16(对INT 13H指令使用LBA);               0F: Extended(对INT 13H指令使用LBA);               82:LINUX Swap;83:LINUX;85:LINUX Extended)    5       终止磁头号H    6       终止扇区号S    7       终止柱面号CYL    8-11    本分区之前已用扇区数(即该分区的LBA地址,          当分区表属于扩展分区中的记录时,该值为相对扩展分区首地址的位置)    12-15     本分区扇区总数
  3.主分区(Primary Partition)、扩展分区(Extended Partition)    和逻辑分区(Logical Partition)
    DPT中可定义的分区包括主分区和扩展分区。所谓主分区,是指DPT中包含的能够被系统使用的磁盘分区,它是可以设置为活动的,即可以引导操作系统,一个硬盘只能有一个活动分区;而扩展分区并不能被系统使用,它的作用是突破DPT只能定义4个分区的限制。
    其做法是:让DPT在定义主分区后,将多余容量定义为扩展分区,指定该分区的起始位置,根据起始位置指向硬盘的某一扇区,称作虚拟MBR,在其中定义下一个分区表。如果只有一个分区,就定义该分区,然后结束;如果不止一个分区,就定义一个基本分区和一个扩展分区,扩展分区再指向下一个分区表,在下一个分区表中继续定义分区,直至结束。这样就形成一个分区链,可以描述所有的分区。
    任何分区表中只能有一个扩展分区,扩展分区不能引导操作系统。位于扩展分区中的可被系统使用的磁盘分区称为逻辑分区,逻辑分区不能设置为活动。由于定义了扩展分区和逻辑分区的概念,windows使用的磁盘盘符可以一直到Z,见下图。
  三、硬盘分区结构实例分析
    使用磁盘编辑器可以直接访问硬盘数据,一般磁盘编辑器都是以十六进制显示数据。这里推荐使用数据恢复领域内被广泛使用的软件WinHex,这个软件能在 windows下直接读写磁盘扇区。打开WinHex,点击“工具”菜单,选择“磁盘编辑器”-“物理媒介”-“HD0......”,这样整个硬盘的数据就以十六进制的方式显示于编辑框之内。本文使用的编辑器是UltraEdit,下面就对本人的硬盘分区情况进行分析。
  1.MBR扇区图示
    如图所示,MBR扇区的0~1bd区段是MBR引导代码,    1be~1dd一共有32字节代表两个分区表项,末尾0xAA55H是引导扇区的标志。
    第一分区各项参数为:    80,01,01,00,0C,FE,FF,FF,3F,00,00,00,F8,93,32,02。             第一项80,代表该分区是活动的(可以引导操作系统);    起始位置是0柱面、1磁头、1扇区;    0C代表该分区是FAT32格式;FE、FF、FF三项代表终止柱面磁头扇区的序号,    由于该分区大于8G,所以它的CHS参数已经没有意义;    3F,00,00,00是该分区首扇区的LBA地址,为0x3FH,等于63;    F8,93,32,02代表该分区的扇区数     (由于排列是从低址到高址,扇区数应该是0x23293F8H,为36869112个扇区)。
    第二分区各项参数为:    00,00,C1,FF,0F,FE,FF,FF,37,94,32,02,49,E8,C9,04。             第一项00,代表该分区是非活动的;    起始CHS参数柱面号无效,磁头号0,扇区号1;0F代表该分区是扩展分区;    37,94,32,02是该分区首扇区的LBA地址,为0x2329437H,等于36869175;    49,E8,C9,04代表该分区的扇区数,为0x4C9E849H,一共80341065个扇区。
  2.扩展分区首扇区(虚拟MBR)图示
  (1)第一扩展分区首扇区(虚拟MBR)图示
    如前文所述,由于DPT只能记录4个分区的信息,windows通过扩展分区来记录多于4个分区的信息。DPT中的扩展分区称为第一扩展分区,它的首扇区称作虚拟MBR。
    从示例图上可以看到扩展分区的首扇区之内没有MBR引导代码,只有分区表,一共有两项记录,表示一个逻辑分区和一个扩展分区。             第一分区各项参数:    00,01,C1,FF,0B,FE,FF,FF,3F,00,00,00,37,16,71,02。
    第一项00,代表该分区是非活动的;    起始CHS参数柱面号无效,磁头号1,扇区号1;0B代表该分区是FAT32文件系统;    3F,00,00,00是该分区首扇区的LBA地址(相对第一扩展分区首扇区),为63;    37,16,71,02代表该分区的扇区数,一共40965687个扇区。             第二分区各项参数:    00,00,C1,FF,05,FE,FF,FF,76,16,71,02,D3,D1,58,02。
    第一项00,代表该分区是非活动的;    起始CHS参数柱面号无效,磁头号0,扇区号1;05代表该分区是扩展分区;    76,16,71,02是该分区首扇区的LBA地址(相对第一扩展分区首扇区);    D3,D1,58,02代表该分区的扇区数,一共39375315个扇区。
  (2)第二扩展分区首扇区(虚拟MBR)图示
    如图所示,该扩展分区只包含一个逻辑分区,它的分区表各项参数如下:
    00,01,C1,FF,07,FE,FF,FF,3F,00,00,00,94,D1,58,02
    第一项00,代表该分区是非活动的;    起始CHS参数柱面号无效,磁头号是1,扇区号是1;    07代表该分区是NTFS文件系统;    3F,00,00,00是该分区首扇区的LBA地址(相对第二扩展分区首扇区),为63;    94,D1,58,02代表该分区的扇区数,一共39375252个扇区。
    综上所述,该硬盘的分区结构已经搞清楚了,它的主分区表中包括一个主分区(活动的)和第一扩展分区;第一扩展分区中包含一个逻辑分区和第二扩展分区;第二扩展分区包含一个逻辑分区,如图所示。
  3.主分区和逻辑分区首扇区图示
    如前文所述,该硬盘一共有三个分区,C区为主分区、FAT32格式,D区是逻辑分区、FAT32格式,E区是逻辑分区、NTFS格式。我们就来看看这三个分区的第一扇区各自都有什么特点。
  (1)C区首扇区图示
    C区首扇区结尾标志是0xAA55H,CHS参数为0,1,1。    扇区第一行出现MSWIN4.1字样(由于文本显示不正确,“M”被省略掉了),    说明该分区是FAT32文件系统,在偏移52~59区段还有FAT32字样。
    C区首扇区内保存着该分区的引导代码,这略去不谈,我们只关注1C~23字段。    其中1C~1F字段是3F,00,00,00,这是LBA地址,表示该分区之前有63个扇区;    20~23字段是F8,93,32,02,是该分区的总扇区数。    以上这些信息十分重要,对于我们下面手工恢复磁盘分区结构十分关键。
  (2)D区首扇区图示
    D区首扇区结尾标志是0xAA55H,CHS参数为X,1,1,扇区第一行出现MSDOS5.0字样    (由于文本显示的问题,“M”被省略掉了),    说明该分区是FAT32文件系统,在偏移52~59区段还有FAT32字样。
    1C~1F字段是3F,00,00,00,这是D区的LBA地址,表示该分区之前有63个扇区    (相对于扩展分区首扇区而言),20~23字段是37,16,71,02,是分区的总扇区数。
  (3)E区首扇区图示             E区首扇区结尾标志是0xAA55,CHS参数为X,1,1,扇区第一行出现NTFS字样    (由于文本显示的问题,“N”被省略掉了),说明该分区是NTFS文件系统。    28~2F字段是93,D1,58,02,00,00,00,00,是E区可使用的总扇区数,    与第二扩展分区表中记录的E区总扇区数相差1。为何相差1呢?那是因为NTFS    文件系统的一个特性,它会把分区最后一个扇区用来保存首扇区的备份,这个    扇区是保留的,不能被用户使用。一般保留扇区数目为1,但也有大于1的情况,    这时NTFS分区首扇区中记录的可用扇区数和分区表中记录的总扇区数相差就不是1了。
  4.总结
    综上所述,有几点经验值得重视:
  (1)所有引导扇区的末尾都是0xAA55H。
  (2)硬盘MBR扇区的CHS参数是0,0,1;    所有扩展分区首扇区的CHS参数是X,0,1;    主分区、逻辑分区的首扇区CHS参数是X,1,1,    主分区的CHS参数也可以是X,0,1,    主分区、逻辑分区的首扇区也可能不是1号扇区,这个现象是存在的。
  (3)所有扩展分区、主分区、逻辑分区终止CHS参数都为:X,254,63。    综合(2)、(3)来看,所有分区的大小都是整数柱面,不能跨柱面存在。
  (4)所有扩展分区一般只包含分区表数据和0xAA55H标志,一般不含引导代码。
  (5)第一扩展分区的LBA地址是相对于MBR而言,而之后的扩展分区的LBA地址计算    都是以第一扩展分区的位置为基准。
  (6)主分区、逻辑分区的首扇区常常带有FAT32、NTFS之类的字符串,    MSWIN4.1、MSDOS5.0是FAT32分区的标志,MSDOS5.0还可能是    FAT16分区的标志。引导扇中保存有该分区的大小数据,对于NTFS    分区来说,引导扇中记录的分区扇区数和分区表中记录的数据相差个位数,    通常是1。这对我们找回丢失的分区十分关键。
  (7)似乎第一扩展分区类型是0F,之后的扩展分区为05类型,主分区为FAT32格式,    类型为0C,逻辑分区若为FAT32格式则为0B类型。
  四、硬盘分区表恢复实战经历
  1.使用工具软件自动恢复硬盘分区
    这里选用深山红叶的硬盘分区表管理软件进行操作,演示过程在虚拟机中进行。
  (1)首先查看一下硬盘的分区情况,有三个分区,C区是活动的主分区,NTFS格式,D、E是逻辑分区,FAT32格式,为模拟分区丢失的情况,接着用分区软件把硬盘所有分区删除,如图。
  (2)打开硬盘分区表修复与管理软件Partition Table Doctor 3.0,点击“操作”菜单,选“重建分区表”-交互模式,软件自动搜索,找到三个分区,如图。
  (3)在“文件”菜单中选择保存,于是丢失的分区又回来了,如图。
    能够重建硬盘分区表的工具还有一些,比较常用的还有DiskGenius,使用方法类似。
  2.使用磁盘编辑器手工恢复磁盘分区表
    有朋友可能会问,既然有软件能自动恢复,为何还要费时费力地手动恢复呢?其实手动恢复的过程虽然繁琐,却能让我们对磁盘分区的结构有清楚的了解,再说软件虽好却不够智能,遇到比较复杂的情况就无能为力了,这时只能借助磁盘编辑器手动恢复,我们只要了解了原理,在实际情况中就能游刃有余。
  (1)打开硬盘分区表修复与管理软件Partition Table Doctor 3.0,点击“扇区”-“编辑扇区”,弹出十六进制磁盘编辑器,首先显示的是硬盘主引导扇区,CHS:0,0,1,如图。
    从图上可以看到,主分区表已经被清空,说明删除分区的操作其实就是清除分区表中的相关项,只要正确地填写出分区表数据,那么丢失的分区就找回来了。
  (2)恢复C分区:
    移动扇区至0,1,1位置,这是C区的首扇区。
    从图上可以看到该分区是NTFS系统,    大小是7F,E2,5D,00,实际大小还要再加上1,为80,E2,5D,00。
    移动扇区至0,0,1位置,填写1BE~1CD字段。    由于该分区小于8G,所以CHS参数要填写正确。    起始CHS参数是0,1,1,终止CHS参数是382,254,63。    终止柱面号可以这样计算:    (终止柱面号 + 1)X 255 X 63 = 分区总扇区数 + 分区之前的总扇区数。
    于是C分区的分区表参数如下:         80,01,01,00,07,FE,7F,7E,3F,00,00,00,80,E2,5D,00,    填写完毕,保存。
  (3)恢复第一扩展分区:    第一扩展分区首扇区的LBA地址应为63 + C分区扇区总数,    为BF,E2,5D,00(6152895)。    起始CHS参数应为:383,0,1,终止CHS参数为1043,254,63    (此处柱面号大于1023,填写分区表时按1023计)。
    扩展分区大小为10618965个扇区,换算为十六进制为55,08,A2,00。    再移至硬盘主引导扇区,编辑1CE~1DD字段,输入:    00,00,41,7F,0F,FE,FF,FF,BF,E2,5D,00,55,08,A2,00,保存。
  (4)恢复D分区:    把磁盘编辑器移动至383,1,1扇区,这就是D区首扇区。
    由图可知该分区是FAT32格式,大小是80,E2,5D,00。
    移动扇区至383,0,1位置,此处为第一扩展分区首扇区。先在末尾填上55AA标志。    起始CHS参数为383,1,1,终止CHS参数为765,254,63。    于是D分区的分区表参数如下:         00,01,41,7F,0B,FE,BF,FD,3F,00,00,00,80,E2,5D,00,    填写1BE~1CD字段,保存。
  (5)恢复E分区:    第二扩展分区首扇区位于766,0,1;    LBA地址为D区扇区数 + 63,等于BF,E2,5D,00。    把磁盘编辑器的当前扇区移到这里,发现分区表依然完好,如图所示。
    这样的话剩下的过程就很容易了,从分区表中可以获知E区大小是57,25,44,00,    由此可知第二扩展分区大小为E区扇区数 + 63,等于96,25,44,00。
    把磁盘编辑器移至383,0,1,即第一扩展分区首扇区,    编辑1CE~1DD:    00,00,81,FE,05,FE,FF,FF,BF,E2,5D,00,96,25,44,00,保存。
    至此大功告成,如图所示,丢失的分区已经全部找回。
--------------------------------
NTFS分区引导扇区恢复原理:恢复原理其实很简单,NTFS分区的引导扇区是有备份的,按照微软的说明,NTFS 3.5x在分区中间存有备份,而NTFS 4.0则把备份数据存在分区的末尾。grub安装时只复盖了引导扇区的内容,故只要用NTFS分区引导扇区的备份恢复当前分区即可。