修复被grub覆盖的ntfs分区引导扇区

此页由Linux Wiki用户Chenxing于2012年12月18日 (星期二) 08:00的最后更改。 在lzh、Linux Wiki用户BillbearErosHuohuliaisili其他的工作基础上。

出自Linux Wiki

提示:此文已超过 12 年(4388 天)未更新,如发现内容过时或有误,欢迎改进:)

目录

前言

大概不少人有过把Grub不小心安装到NTFS分区的经历,由于Grub占据了NTFS分区的引导扇区,导致分区无法被系统正确识别。有些朋友可能误以为此时数据已经丢失,实际上,此时只要采取有效措施,分区中的数据可以被完全恢复。

Note.gif
注意:
可以使用各种数据恢复软件,如GetDataBack等,也可能会找回分区中的文件,但需要很长时间,可靠性相对低,加之这些软件价格昂贵,建议不要尝试。

前提条件

在用Grub覆盖了NTFS分区引导扇区之后,没有更改该分区中的数据,否则恢复可能失败。

NTFS分区引导扇区恢复原理

恢复原理其实简单,NTFS分区的引导扇区是有备份的,按照微软的说明,NTFS 3.5x在分区中间存有备份,而NTFS 4.0则把备份数据存在分区的末尾。grub安装时只覆盖了引导扇区的内容,故只要用NTFS分区引导扇区的备份恢复当前分区即可。

至此,如果你掌握如何直接读取硬盘数据的方法,就可以跳过下面的所有内容,自己恢复这个分区的引导扇区了,如果你的方法比下文所述的简单,请把它贴在这里,谢谢!

修复方法

使用Windows故障恢复控制台

 

Note.gif
注意:
此方法未经测试!请谨慎使用。

从一张Windows安装光盘启动,并进入恢复控制台。根据提示,输入阿拉伯数字并按Enter键选择要修复的系统。

Hint.gif
提示:
如果使用Windows 2000/XP 的安装盘,进入恢复控制台的方法是:看屏幕上的提示按 R 键。如果直接被询问是否升级安装不要升级安装,就先按Esc键。


在恢复控制台中输入fixboot。它向第一主分区的第一扇区写入引导代码。

使用能访问该硬盘的Windows系统

如果损坏的不是Windows系统的分区,或可以把硬盘插在其它可以进入Windows系统的计算机上并访问,就可以使用这种方法。该方法的核心是用工具Disk Probe(dskprobe.exe)进行修复。

本方法使用随Windows 2000/xp等一同提供的diskprobe.exe修复分区,这个文件在安装光盘的support/tools/support.cab中,把跟dskprobe.exe有关的几个文件解到一个文件夹下,就可以用了。

  • 执行dskprobe.exe,选择DRIVES, Physical Drive,找到要修复的磁盘,双击它,在下面的框中取消Read Only,再点右面的Set Active按钮,会发现上面的Active Handle变成PhysicalDriveX(X=0,1,2,...)了,点击OK
  • 在SECTORS菜单中, 选择Read,在STARTING SECTORS输入0,在Number of Sectors输入1, 点 Read,就进入了MBR。你可以在右边的ASCII文本找到类似Invalid Partition Table....(没有在MBR安装Grub)或有关grub的一些文字,这可以确认你已经处于MBR
  • 查找要恢复的分区,这一步取决于要修复的分区是主分区还是逻辑分区。
    • 如果出现问题的是主分区,那么需要的操作相对简单
      • 单击菜单View中的Partition Table,在标有partition table index的标签中,用旁边的滚动条找到并选中有问题的分区,双击它。在左下角有Relative Sectors的值,记录下这个值。然后单击它旁边的"GO"
      • 在View菜单中选择Bytes,看一下是不是在右边有NTFS字样,下面grub什么的,如果是,那么这就应该是损坏的引导扇区所在了,最好把它存下来,以防万一。接着看下面的步骤。
    • 如果出现问题的是逻辑分区,按下面说的做。
      • 单击菜单View中的Partition Table,在标有partition table index的标签中,找到有问题的分区所在的扩展分区(左边的System ID框会显示Extended),然后可以按Next到下一个分区,也可以用双击继续选择,用Go转移,直到找到有问题的ntfs分区。找到后再双击,到这个分区里面。
      • 记录Current Sector, Relative Sector, Total Sectors,再点Go,进入引导分区,记录Boot Sector(在窗口的标题栏),选择View->Bytes,看一下是不是在右边有NTFS字样,下面grub什么的,如果是,那么这就应该是损坏的引导扇区所在了,最好把它存下来,以防万一。
  • 到VIEW->"NTFS bootsector",如果你是NT 4.0(或以上,现在基本都是这个)选"Volume End",如果是NT V3.5x 选 "Volume Middle"
  • 到VIEW->Bytes看一下这是不是NTFS的引导扇区,应该有NTFS,还有"A disk Read error occurred..."的字样。确认后在SECTORS菜单选Write,在Starting Sector to write Data填记录下的Relative sectors(主分区)或boot sector(逻辑分区),再按Write按钮。
  • 正常的话,分区已经修复,重新启动后看看效果吧。

在Linux下修复

首先,列出

sudo fdisk -lu

注意是 -lu 不是 -l。下面是一个 U 盘的例子,输出结果是

/dev/sdc1 63 25671869 12835903+ 7 HPFS/NTFS
/dev/sdc2 25671870 31696244 3012187+ 7 HPFS/NTFS

修复 ntfs 分区 sdc1 的命令是

sudo dd if=/dev/sdc of=/dev/sdc bs=512 count=1 seek=63 skip=25671869

修复 ntfs 分区 sdc2 的命令是

sudo dd if=/dev/sdc of=/dev/sdc bs=512 count=1 seek=25671870 skip=31696244

请参照你的情况修改,把上面的 if 和 of 两处 sdc 改为比如 sda,seek 和 skip 的值改为你需要修复的ntfs 分区的精确起止扇区。再说一遍,这里的值来自 sudo fdisk -lu 的输出,而不是 sudo fdisk -l,请再三确认。

linux 最擅于此类工作,简单漂亮。不过,dd 来不得半点马虎,如果写错位置不但修复不了,还会产生其他不可预料的后果。因此,最好在修复之前先查看一下最后一个扇区,以上面的 sdc2 为例,下面的命令查看 sdc2 的末尾扇区:

sudo dd if=/dev/sdc bs=512 count=1 skip=31696244  2> /dev/null | hd

输出结果应该是典型的 ntfs 引导扇区,类似这样:

这时,你就可以放心地把它写入该分区的首扇区了。


参考资料

本文对您有帮助?分享给更多朋友!

反馈与讨论

发现文档不全面、有错误却没时间编辑文档?想分享自己的经验或见解?欢迎在此留言、讨论。
个人工具
简体繁体转换