Windows系统下磁盘结构层面的数据恢复是一类很有趣的问题,处理这类问题的效果是非常明显,往往会给用户比较神奇的感觉。这次我们就结合实例来谈谈这类问题的处理方法与技巧。首先我们来了解一下磁盘分区的大致结构:
上图是磁盘大致的分区结构。在一块磁盘的扇区0 - 即第一个扇区会包含主引导记录(MBR - Master Boot Record),实际就是嵌入磁盘的一段代码,主要负责在启动过程引导系统找到正确的分区继续启动流程,紧接着主引导记录就是分区表,其中包含了每个分区的起始位置和长度信息,以及其他类似文件系统类型的信息。分区表指明了每个分区在磁盘上的位置,因此系统在我们挂载磁盘之后可以通过分区表来找到每一个分区,并且通过文件系统的类型在加载每一个分区。
当然实际的分区表结构可能会更加复杂一些,比如会有扩展分区的类型,以此来支持多于四个分区的情况。另外Windows系统还支持动态磁盘的类型,有别于以上讨论的基本磁盘,动态磁盘将分区表的信息存放在磁盘尾部大约1MB的空间之上,这些我们会在以后慢慢讨论,本文将主要针对基本磁盘和少于四个分区的情况。
然后是需要给大家介绍一下分区恢复的工具dskprobe,该工具包含在Windows Support Tools当中,大家可以从微软官网上下载并解压:https://www.microsoft.com/en-us/download/details.aspx?id=18546。 该工具可以帮我们显示并修改磁盘扇区中的原始数据。当然也可以有一些简单的解析功能方便我们识别分区结构的信息。
接下去就是磁盘结构恢复的具体方法了,掌握这类问题处理方法的最好方式就是实战,因此我们来举一个实例案例,给大家一个直观印象。首先问题现象自然是:用户发现磁盘分区丢失,数据无法访问。我们的任务就是尝试将分区恢复回来。
我们首先来查看磁盘扇区0的信息,因为其中包含了分区表信息,是磁盘结构的关键信息。方法是打开dskprobe,选择Drives->Physical Drive,会列出所有的磁盘,双击出现问题的磁盘,选择Set Active单击OK即可打开对应的磁盘,注意此时我们可以保留Read Only的选项,因为在这个阶段我们需要首先查看磁盘的损坏情况,确定修复方案之后我们才会真正需要修改磁盘信息。
打开磁盘之后我们选择Sectors->Read,输出需要读取的扇区号和需要读取的长度即可,这里由于我们需要查看扇区0的信息,自然输入0和1(长度)即可。此时显示的是原数据,可以选择View->Partition Table,可以将分区表的信息解析出来:
我们可以观察一下这些信息,除了一些通用信息外,关键信息有如下几条:
- Relative Sector - 分区开始的位置
- Total Sector - 分区的长度,以扇区为单位
- System ID - 分区的文件系统类型
此时如果我们点击Relative Sector旁边的Go,dskprobe会帮助我们直接跳转到对应的扇区,这个扇区就是分区的第一个扇区,我们称之为分区的引导扇区(Boot Sector),其中会包含关于本分区的文件系统层面的类型,当然不同的文件系统引导扇区的结构也是不同的,所幸的是Windows系统上90%是NTFS,我们可以选择View->NTFS BootSector来解析NTFS的引导扇区,我们可以发现主要数据如下:
- Total Sectors - 分区长度,以扇区为单位
- Clusters to MFT - 文件系统元数据的存在位置
- Clusters to MFT mirr - 文件系统元数据镜像的存在位置
- Bytes per sector - 每个扇区的大小,以字节为单位
- Sectors per cluster - 每个簇的大小,以扇区为单位
我们发现这些关键性信息在这块磁盘上基本为0,因此可以判断该问题是由于引导扇区损坏导致的。那么怎样恢复引导扇区呢?理论上所有这些信息都是可以重构的,但是我们有一个相对简单的方法:在分区的底部一般会存有一个引导扇区的备份,因此我们可以利用这个备份来做恢复。方法如下:
注意:在做如下操作之前,强烈建议首先做一个磁盘快照,确保数据可以复原。
1. 首先我们搜索分区底部,寻找NTFS引导扇区:选择菜单Tools->Search Sectors,在offset里面填入3,在Enter characters to search for中填入NTFS进行搜索,这个动作的含义是在所有的扇区中判断是否在偏移量为3的位置有一个NTFS的字符串,如果是很有可能这个扇区就是引导扇区。当然大家也可以调整搜索的起始位置来提高搜索的效率。
2. 找到对应的扇区后就可以再次解析原始数据,再这个例子中我们可以看到备份的引导扇区在扇区是81922047,通过选择View->NTFS BootSector可以看所有的信息都在:
3. 此时我们需要选择File->Save As将其存成文件。
4. 选择Drives->Physical Drive,取消Read Only的勾选,点击Set Active,此时我们已经可以对磁盘进行写操作了。
5. 关键步骤: 我们选择File->Open打开刚才存取的文件,选择Sectors->Write,在Starting sector to write data输入2048 (就是损坏的引导扇区的位置),选择write it写入。注意在操作之前还是建议通过File->Save在备份一下被覆盖的扇区,以防万一。
此时我们回到磁盘管理器,可以发现分区已经恢复,如果分区其他部分没有损坏的话,我们就可以看到分区里的数据了。
这里我们需要注意:分区恢复的操作设计到数据,所以快照备份是必要的。另外操作时务必小心。