修復被grub覆蓋的ntfs分區引導扇區
出自Linux Wiki
目錄 |
前言
大概不少人有過把Grub不小心安裝到NTFS分區的經歷,由於Grub佔據了NTFS分區的引導扇區,導致分區無法被系統正確識別。有些朋友可能誤以為此時數據已經丟失,實際上,此時只要採取有效措施,分區中的數據可以被完全恢復。
前提條件
在用Grub覆蓋了NTFS分區引導扇區之後,沒有更改該分區中的數據,否則恢復可能失敗。
NTFS分區引導扇區恢復原理
恢復原理其實簡單,NTFS分區的引導扇區是有備份的,按照微軟的說明,NTFS 3.5x在分區中間存有備份,而NTFS 4.0則把備份數據存在分區的末尾。grub安裝時只覆蓋了引導扇區的內容,故只要用NTFS分區引導扇區的備份恢復當前分區即可。
至此,如果你掌握如何直接讀取硬碟數據的方法,就可以跳過下面的所有內容,自己恢復這個分區的引導扇區了,如果你的方法比下文所述的簡單,請把它貼在這裡,謝謝!
修復方法
使用Windows故障恢復控制台
從一張Windows安裝光碟啟動,並進入恢復控制台。根據提示,輸入阿拉伯數字並按Enter鍵選擇要修復的系統。
在恢復控制台中輸入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 引導扇區,類似這樣:
00000000 eb 52 90 4e 54 46 53 20 20 20 20 00 02 08 00 00 |.R.NTFS .....| 00000010 00 00 00 00 00 f8 00 00 3f 00 ff 00 be b8 87 01 |........?.......| 00000020 00 00 00 00 80 00 80 00 b6 ec 5b 00 00 00 00 00 |..........[.....| 00000030 04 00 00 00 00 00 00 00 cb be 05 00 00 00 00 00 |................| 00000040 f6 00 00 00 01 00 00 00 00 8b f9 70 68 94 04 72 |...........ph..r| 00000050 00 00 00 00 fa 33 c0 8e d0 bc 00 7c fb 68 c0 07 |.....3.....|.h..| 00000060 1f 1e 68 66 00 cb 88 16 0e 00 66 81 3e 03 00 4e |..hf......f.>..N| 00000070 54 46 53 75 15 b4 41 bb aa 55 cd 13 72 0c 81 fb |TFSu..A..U..r...| 00000080 55 aa 75 06 f7 c1 01 00 75 03 e9 d2 00 1e 83 ec |U.u.....u.......| 00000090 18 68 1a 00 b4 48 8a 16 0e 00 8b f4 16 1f cd 13 |.h...H..........| 000000a0 9f 83 c4 18 9e 58 1f 72 e1 3b 06 0b 00 75 db a3 |.....X.r.;...u..| 000000b0 0f 00 c1 2e 0f 00 04 1e 5a 33 db b9 00 20 2b c8 |........Z3... +.| 000000c0 66 ff 06 11 00 03 16 0f 00 8e c2 ff 06 16 00 e8 |f...............| 000000d0 40 00 2b c8 77 ef b8 00 bb cd 1a 66 23 c0 75 2d |@.+.w......f#.u-| 000000e0 66 81 fb 54 43 50 41 75 24 81 f9 02 01 72 1e 16 |f..TCPAu$....r..| 000000f0 68 07 bb 16 68 70 0e 16 68 09 00 66 53 66 53 66 |h...hp..h..fSfSf| 00000100 55 16 16 16 68 b8 01 66 61 0e 07 cd 1a e9 6a 01 |U...h..fa.....j.| 00000110 90 90 66 60 1e 06 66 a1 11 00 66 03 06 1c 00 1e |..f`..f...f.....| 00000120 66 68 00 00 00 00 66 50 06 53 68 01 00 68 10 00 |fh....fP.Sh..h..| 00000130 b4 42 8a 16 0e 00 16 1f 8b f4 cd 13 66 59 5b 5a |.B..........fY[Z| 00000140 66 59 66 59 1f 0f 82 16 00 66 ff 06 11 00 03 16 |fYfY.....f......| 00000150 0f 00 8e c2 ff 0e 16 00 75 bc 07 1f 66 61 c3 a0 |........u...fa..| 00000160 f8 01 e8 08 00 a0 fb 01 e8 02 00 eb fe b4 01 8b |................| 00000170 f0 ac 3c 00 74 09 b4 0e bb 07 00 cd 10 eb f2 c3 |..<.t...........| 00000180 0d 0a 41 20 64 69 73 6b 20 72 65 61 64 20 65 72 |..A disk read er| 00000190 72 6f 72 20 6f 63 63 75 72 72 65 64 00 0d 0a 42 |ror occurred...B| 000001a0 4f 4f 54 4d 47 52 20 69 73 20 6d 69 73 73 69 6e |OOTMGR is missin| 000001b0 67 00 0d 0a 42 4f 4f 54 4d 47 52 20 69 73 20 63 |g...BOOTMGR is c| 000001c0 6f 6d 70 72 65 73 73 65 64 00 0d 0a 50 72 65 73 |ompressed...Pres| 000001d0 73 20 43 74 72 6c 2b 41 6c 74 2b 44 65 6c 20 74 |s Ctrl+Alt+Del t| 000001e0 6f 20 72 65 73 74 61 72 74 0d 0a 00 00 00 00 00 |o restart.......| 000001f0 00 00 00 00 00 00 00 00 80 9d b2 ca 00 00 55 aa |..............U.| 00000200
這時,你就可以放心地把它寫入該分區的首扇區了。