修復被grub覆蓋的ntfs分區引導扇區

此頁由 Linux Wiki使用者Chenxing 於 2012年12月18日 (星期二) 08:00 的最後更改。 在lzh、Linux Wiki使用者BillbearErosHuohuliaisili其他的工作基礎上。

出自Linux Wiki

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

目錄

前言

大概不少人有過把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 引導扇區,類似這樣:

這時,你就可以放心地把它寫入該分區的首扇區了。


參考資料

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

反馈与讨论

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