如何拯救一台GRUB 2啟動失敗的Linux電腦
舊版GRUB我們使用了一段時間了,這個重要的Linux通用引導器的版本已經到了0.97。儘管舊版GRUB有很多的優點,但是它已經有點陳舊了,並且它的開發者也希望添加更多的功能,於是,GRUB 2 時代就要來了。
GRUB 2 做了幾個明顯的改進。它可以從移動存儲設備上啟動,並且可以通過配置一個選項來進入系統BIOS。相對於將所有的配置都放到一個配置文件/boot/grub/menu.lst中 (現在默認是/boot/grub/grub.cfg),使用各種腳本來配置會更複雜。你不要直接編輯這個文件,那不是人乾的事,太複雜了,我們需要使用其它的腳本來改變。我們卑微的人類可以編輯修改/etc/default/grub文件,它主要是控制Grub菜單的外觀。我們還可以修改/etc/grub.d/下的腳本,這些腳本用於啟動操作系統、控制外部應用程序,如memtest 、os_prober和theming等等 。./boot/grub/grub.cfg是由/etc/default/grub和/etc/grub.d/*生成的。當你修改了某個地方,你必須要運行update-grub命令來生成它。
好消息是,update-grub腳本可以可靠的檢測內核、啟動文件,並添加所有的操作系統,自動生成你的啟動菜單,所以你不必手動的修改他們。
我們還要學習如何解決兩個常見的故障。當啟動系統時,它會停在grub>提示上,這是一個完整的GRUB 2命令界面,所以不要驚慌。這意味著GRUB 2依舊可以正常啟動和載入normal.mod模塊(它和其他模塊分別位於/boot/grub/[架構]/ 下),但沒有找到你的grub.cfg文件。如果你看到grub rescue> 這意味著它無法找到normal.mod,因此它有可能找不到你的啟動文件。
這是如何發生的?因為內核可能改變驅動器分區號碼的分配,或者您移動了您的硬碟驅動器,或者你手動改變一些分區,也有可能是安裝一個新的操作系統或者移動一些文件。在這些情況下你的啟動文件仍然存在,但GRUB不能找到他們。所以你可以在GRUB提示符中找到啟動文件,設置它們的位置,然後啟動您的系統並修復GRUB配置。
GRUB 2 命令行
GRUB 2 的命令界面和上一代GRUB中的一樣強大。你可以用它來找到引導鏡像,內核和根文件系統。事實上,它可以讓你避開許可權和其它訪問控制,完全訪問本地計算機上的所有文件。有些人可能會認為這是一個安全漏洞,但是你知道古老的UNIX的名言:有物理訪問機器許可權的人,就是擁有它的人。
當你在grub >提示時,你有許多類似命令行界面的功能,如命令歷史和tab補全。但是grub rescue>模式是受限的,沒有命令歷史,沒有tab補全。
如果你是在一個正常運作的系統上練習,那就當GRUB菜單出現時,可以按下C來打開GRUB命令行界面。你可以通過向上和向下游標鍵滾動你的菜單條目來停止啟動倒計時。在GRUB命令行下做實驗是安全的,因為做不了永久的修改,一切都是暫時的。如果你已經看到grub >或grub rescue>提示符,那就說明你的表現時刻到了。
接下來的幾個命令可以在grub>和grub rescue模式下運行。你應該運行的第一個命令是設置一個分頁器,將長的命令分頁。如下:
grub> set pager=1
等號兩側必須不能出現空格。現在讓我們做一點探索。輸入ls來列出的GRUB識別的所有分區:
grub> ls
(hd0) (hd0,msdos2) (hd0,msdos1)
msdos是什麼?這意味著該系統具有老式的MS-DOS分區表,而不是全新的全局唯一標識符的分區表(GPT)。參見「在Linux下使用新的GUID分區表,和古老的MBR說再見!」。如果你正在運行的GPT,它會出現(hd0,GPT1)。現在讓我們看看,使用ls命令查看你的系統裡面有什麼文件:
grub> ls (hd0,1)/
lost+found/ bin/ boot/ cdrom/ dev/ etc/ home/ lib/
lib64/ media/ mnt/ opt/ proc/ root/ run/ sbin/
srv/ sys/ tmp/ usr/ var/ vmlinuz vmlinuz.old
initrd.img initrd.img.old
太好了,我們已經找到了根文件系統。你可以省略msdos和GPT的標籤。如果沒有加分區後面的斜杠/,則只會列出分區的信息。你可以用cat命令顯示文件系統上的任何文件:
grub> cat (hd0,1)/etc/issue
Ubuntu 14.04 LTS n l
在一個多引導系統上,通過/etc/issue文件可以知道這是哪個Linux系統。
從 grub> 中啟動
下面講述如何設置啟動文件並從grub >提示下啟動系統。我們已經知道如何從Linux根文件系統(hd0,1)下運行ls命令,你可以一直尋找直到找到你的/boot/grub所在位置。然後運行以下命令,記得使用您自己的根分區,內核和initrd映像等參數:
grub> set root=(hd0,1)
grub> linux /boot/vmlinuz-3.13.0-29-generic root=/dev/sda1
grub> initrd /boot/initrd.img-3.13.0-29-generic
grub> boot
第一行設置分區的根文件系統。第二行告訴GRUB您想要使用的內核位置。開始輸入/boot/vmli,然後使用tab補完填寫。輸入root= /dev/sdX設置根文件系統位置。是的,這似乎是多餘的,但如果你忘記了輸入,你會得到一個kernel panic。你知道怎麼找到正確的分區嗎?hd0,1 即 /dev/sda1,hd1,1 即 /dev/sdb1,hd3,2 即 /dev/ sdd2。我想你可以自己推算剩下的了。
第三行設置initrd文件,必須是和內核相同的版本號。
最後一行啟動系統。
在一些Linux系統上,內核和initrd是被符號鏈接到當前的根文件系統的根目錄,就像:
$ ls -l /
vmlinuz -> boot/vmlinuz-3.13.0-29-generic
initrd.img -> boot/initrd.img-3.13.0-29-generic
所以,你也可以這樣輸入命令:
grub> set root=(hd0,1)
grub> linux /vmlinuz root=/dev/sda1
grub> initrd /initrd.img
grub> boot
從grub rescue> 中啟動
如果你處在grub rescue> 命令界面下,命令有所不同,你必須要先載入兩個模塊normal.mod 和 linux.mod。
grub rescue> set prefix=(hd0,1)/boot/grub
grub rescue> set root=(hd0,1)
grub rescue> insmod normal
grub rescue> normal
grub rescue> insmod linux
grub rescue> linux /boot/vmlinuz-3.13.0-29-generic root=/dev/sda1
grub rescue> initrd /boot/initrd.img-3.13.0-29-generic
grub rescue> boot
在你載入了這兩個模塊之後tab補完的功能就可以用了。
永久性的修復
當你成功地啟動你的系統,運行這些命令來永久修復GRUB:
# update-grub
Generating grub configuration file ...
Found background: /usr/share/images/grub/Apollo_17_The_Last_Moon_Shot_Edit1.tga
Found background image: /usr/share/images/grub/Apollo_17_The_Last_Moon_Shot_Edit1.tga
Found linux image: /boot/vmlinuz-3.13.0-29-generic
Found initrd image: /boot/initrd.img-3.13.0-29-generic
Found linux image: /boot/vmlinuz-3.13.0-27-generic
Found initrd image: /boot/initrd.img-3.13.0-27-generic
Found linux image: /boot/vmlinuz-3.13.0-24-generic
Found initrd image: /boot/initrd.img-3.13.0-24-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
done
# grub-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.
當你運行 grub-install 時,記得GRUB是安裝到整個硬碟驅動器的主引導扇區而不是到一個具體分區,所以不要加上像/dev/sda1一樣的分區號。
如果還是不能使用
如果你的系統是如此的倒霉,而且這個方式沒有能起作用,那就嘗試超級GRUB2現場救援磁碟吧。官方GNU GRUB手冊也應該有所幫助。
via: http://www.linux.com/learn/tutorials/776643-how-to-rescue-a-non-booting-grub-2-on-linux
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive