天天看點

Ubuntu——grub rescue 主引導修複

   長期使用windows 和 ubuntu 人雙系統,很可能遇到沉重的一個系統,或以其他方式加盟分區,導緻系統重新啟動時 :

GRUB loading
error:unknow filesystem
grub rescue>      

                                                                                                                       轉載請注明出處:javascript:void(0)

一.概念

BIOS:"Basic Input Output System",中文名稱就是"基本輸入輸出系統"。事實上,它是一組固化到計算機内主機闆上一個ROM晶片上的程式。它儲存着計算機最重要的基本輸入輸出的程式、系統設定資訊、開機後自檢程式和系統自啟動程式。 其主要功能是為計算機提供最底層的、最直接的硬體設定和控制。

MBR: “Master Boot Record” 硬碟的實體扇區,也叫主引導記錄!

由于BIOS 非常小無法承載啟動的執行程式,是以在bios檢測到一個硬碟後。将硬碟的0柱面、0磁頭、1扇區的内容經過簡單推斷後, 至記憶體中的指定位置。然後跳轉至這個位置,開始從這個位置執行,大小為512個byte。當中主要存放引導程式和該硬碟的分區表。

GRUB:“GRand Unified Bootloade” 多重作業系統啟動管理器。就是執行這個GRUB之後能夠通過它來引導進入其他的系統,包含window以及linux

上面三個概念,從字面意思上應該能明确他們的流程。大體是:

PC 首先啟動到BIOS ,然後檢測硬碟的MBR,将MBR這塊扇區的内容(也就是寫在上面的GRUB)裝入記憶體執行,再通過執行GRUB得到的結果實作新的跳轉啟動!

二.Ubuntu的grub2 修複

當PC 是先裝windows後裝ubuntu 或者僅僅有一個ubuntu系統。是将ubuntu系統自帶的grub2 引導程式寫在了MBR上的話。那麼開機的主引導程式就是grub2 ! (ubuntu 自9.10之後就所有使用的grub2)

而grub2 分為兩部分,當中一部分寫入MBR。當中一部分存在與ubuntu的/boot/grub 檔案夾下。

而出現 grub rescue> 就是代表MBR部分的無法正常運作grub程式,啟動grub 救援模式,由于無法找到/boot/grub部分。

grub rescue下可用指令:

set,ls,insmod。root,prefix(設定啟動路徑)

首先通過 ls 檢視全部的分區。會列出:

(hd0),(hd0。msdos8)。(hd0,msdos7)。(hd0,msdos6),(hd0。msdos5),(hd0,msdos3)。(hd0,msdos1)

須要找到ubuntu的安裝分區。通過ls (hd0,msdos*)/boot 直到不出現:error:unknown filesystem

假設知道開始安裝ubuntu 在哪個分區的話,比方sda7 那麼這裡就是msdos7。假設是在ubuntu 硬碟空間之前的地方進行了加入分區。那麼就把ubuntu的分區序号往後移!

變成msdos8

找到之後通過例如以下指令設定設定一次性啟動參數:

grub rescue>set root=(hd0,msdos8)
grub rescue>set prefix=(hd0,msdos8)/boot/grub
grub rescue>insmod /boot/grub/normal.mod      

grub rescue>normal 就會出現boot/grub 中的啟動界面了!

假設/boot/grub沒有損壞,就能進入ubuntu 系統啦,假設grub啟動ubuntu的部分損壞了。就須要手動引導了:

進入grub指令行:

grub> root (hd0,8) ## 指定包括vmlinuz-2.6.18-274.7.1.el5和initrd-2.6.18-274.7.1.el5.img的partition
grub> kernel /boot/vmlinuz-2.6.18-274.7.1.el5 ro root=/dev/sda8 ## root= 是指定包括/sbin/init的partition,即挂載/的partition(以Linux的角度)
grub> initrd /boot/initrd-2.6.18-274.7.1.el5.img ## 據說這項能夠省略
grub> boot      

在正确進入了ubuntu之後。須要更新MBR的grub部分來适應新的分區情況:

終端輸入:

sudo update-grub2
sudo grub-install/dev/sda      

更新到 /boot/grub/grub.cfg 中!然後再把grub 安裝到主硬碟的MBR

有遇到過這樣安裝不成功的,在GRUB2手冊中有另外的重裝grub2 到MBR 的方法。記錄一下:

此方案安裝會使用 chroot 指令來存取受損系統的檔案。      

一旦執行了 chroot 指令,LiveCD 會將損壞系統的 / (根目錄)當作是眼下自己所使用的。

在 chroot 環境中執行的指令會影響受損系統的檔案系統,而不是 LiveCD 的。

1. 開機進入 LiveCD 桌面(Ubuntu 9.10 或更新版)。注意此 LiveCD 必須要與您現在欲修復系統的版本号同樣 - 無論 32-bit 或是 64-bit(否則 chroot 會失敗)。

2. 開啟終端機 - 應用程式,附屬應用程式,終端機。

3. 確認您的標準系統切割區 - (選項是小寫的「L」)

sudo fdisk -l

若您不確定。執行

df -Th

找到正確的磁碟容量及 ext3 或 ext4 格式。

4. 掛載您的標準系統切割區

用正確的切割區替換:sda1, sdb5 等等。

sudo mount /dev/sdXX /mnt #範例:sudo mount /dev/sda1 /mnt

5. 若您有獨立的 /boot 切割區:

sdYY 是 /boot 切割區的位置(比如 sdb3)

sudo mount /dev/sdYY /mnt/boot

6. 掛載重要的虛擬檔案系統:

sudo mount --bind /dev /mnt/dev

sudo mount --bind /dev/pts /mnt/dev/pts

sudo mount --bind /proc /mnt/proc

sudo mount --bind /sys /mnt/sys

7. Chroot 至您的標準系統裝置:

sudo chroot /mnt

8. 若系統中沒有 /boot/grub/grub.cfg 或其內容不正確,使用下面指令重建

update-grub

9. 又一次安裝 GRUB 2:

以正確裝置替換 - sda, sdb, 等等。不要指定切割區號碼。

grub-install /dev/sdX

10. 驗證安裝(使用正確的裝置,比如 sda。不要指定切割區):

sudo grub-install --recheck /dev/sdX

11. 退出 chroot:按下鍵盤之 CTRL-D

12. 卸載虛擬檔案系統:

sudo umount /mnt/dev/pts

sudo umount /mnt/dev

sudo umount /mnt/proc

sudo umount /mnt/sys

若您有掛載獨立的 /boot 切割區:

sudo umount /mnt/boot

13. 卸載 LiveCD 的 /usr 目錄:

sudo umount /mnt/usr

14. 卸載最後的裝置:

sudo umount /mnt

15. 又一次開機。sudo reboot

另外經常使用的就是,無法啟動到grub界面。這個時候就須要另外的引導了。網上非常多的方法是使用ubuntu的安裝CD光牒,也就是livecd,

我經常使用的就是U盤,用老毛桃載入一個ubuntu 的iso 制作一個ubuntu啟動U盤。然後bios選擇U盤啟動。

選擇 try running ubuntu,不選 install 選項

這樣就執行了我們制作在U盤上面的ubuntu系統。能夠以這個為媒介來改動本機上其他的系統檔案,像上面提到的 先mount 上那些分區:

sudo mount /dev/sdxx /mnt 

可先使用 sudo fdisk -l 指令檢視分區情況,選擇相應的

假設要改動相應内容 使用 chroot 切換 完了之後 ctrl+d退出

我這邊是13.04 , grub版本号為:

jscese@jscese-H61M-S2P:~$ grub-install -v
grub-install (GRUB) 2.00-13ubuntu3      

在這個情況下能夠使用例如以下指令将正确的grub 安裝到 MBR:

grub-install --root-directory=/mnt /dev/sda      

我這的sda 為第一塊硬碟