2014-07-23?22:12?
舊版GRUB我們使用了一段時(shí)間了,這個(gè)重要的Linux通用引導(dǎo)器的版本已經(jīng)到了0.97。盡管舊版GRUB有很多的優(yōu)點(diǎn),但是它已經(jīng)有點(diǎn)陳舊了,并且它的開發(fā)者也希望添加更多的功能,于是,GRUB?2?時(shí)代就要來了。?
GRUB?2?做了幾個(gè)明顯的改進(jìn)。它可以從移動(dòng)存儲(chǔ)設(shè)備上啟動(dòng),并且可以通過配置一個(gè)選項(xiàng)來進(jìn)入系統(tǒng)BIOS。相對(duì)于將所有的配置都放到一個(gè)配置文件/boot/grub/menu.lst中?(現(xiàn)在默認(rèn)是/boot/grub/grub.cfg),使用各種腳本來配置會(huì)更復(fù)雜。你不要直接編輯這個(gè)文件,那不是人干的事,太復(fù)雜了,我們需要使用其它的腳本來改變。我們卑微的人類可以編輯修改/etc/default/grub文件,它主要是控制Grub菜單的外觀。我們還可以修改/etc/grub.d/下的腳本,這些腳本用于啟動(dòng)操作系統(tǒng)、控制外部應(yīng)用程序,如memtest?、os_prober和theming等等。./boot/grub/grub.cfg是由/etc/default/grub和/etc/grub.d/*生成的。當(dāng)你修改了某個(gè)地方,你必須要運(yùn)行update-grub命令來生成它。?
好消息是,update-grub腳本可以可靠的檢測內(nèi)核、啟動(dòng)文件,并添加所有的操作系統(tǒng),自動(dòng)生成你的啟動(dòng)菜單,所以你不必手動(dòng)的修改他們。?
我們還要學(xué)習(xí)如何解決兩個(gè)常見的故障。當(dāng)啟動(dòng)系統(tǒng)時(shí),它會(huì)停在grub>提示上,這是一個(gè)完整的GRUB?2命令界面,所以不要驚慌。這意味著GRUB?2依舊可以正常啟動(dòng)和加載normal.mod模塊(它和其他模塊分別位于/boot/grub/[架構(gòu)]/?下),但沒有找到你的grub.cfg文件。如果你看到grub?rescue>?這意味著它無法找到normal.mod,因此它有可能找不到你的啟動(dòng)文件。?
這是如何發(fā)生的?因?yàn)閮?nèi)核可能改變驅(qū)動(dòng)器分區(qū)號(hào)碼的分配,或者您移動(dòng)了您的硬盤驅(qū)動(dòng)器,或者你手動(dòng)改變一些分區(qū),也有可能是安裝一個(gè)新的操作系統(tǒng)或者移動(dòng)一些文件。在這些情況下你的啟動(dòng)文件仍然存在,但GRUB不能找到他們。所以你可以在GRUB提示符中找到啟動(dòng)文件,設(shè)置它們的位置,然后啟動(dòng)您的系統(tǒng)并修復(fù)GRUB配置。?
GRUB?2?命令行?
GRUB?2?的命令界面和上一代GRUB中的一樣強(qiáng)大。你可以用它來找到引導(dǎo)鏡像,內(nèi)核和根文件系統(tǒng)。事實(shí)上,它可以讓你避開權(quán)限和其它訪問控制,完全訪問本地計(jì)算機(jī)上的所有文件。有些人可能會(huì)認(rèn)為這是一個(gè)安全漏洞,但是你知道古老的UNIX的名言:有物理訪問機(jī)器權(quán)限的人,就是擁有它的人。?
當(dāng)你在grub?>提示時(shí),你有許多類似命令行界面的功能,如命令歷史和tab補(bǔ)全。但是grub?rescue>模式是受限的,沒有命令歷史,沒有tab補(bǔ)全。?
如果你是在一個(gè)正常運(yùn)作的系統(tǒng)上練習(xí),那就當(dāng)GRUB菜單出現(xiàn)時(shí),可以按下C來打開GRUB命令行界面。你可以通過向上和向下光標(biāo)鍵滾動(dòng)你的菜單條目來停止啟動(dòng)倒計(jì)時(shí)。在GRUB命令行下做實(shí)驗(yàn)是安全的,因?yàn)樽霾涣擞谰玫男薷?,一切都是暫時(shí)的。如果你已經(jīng)看到grub?>或grub?rescue>提示符,那就說明你的表現(xiàn)時(shí)刻到了。?
接下來的幾個(gè)命令可以在grub>和grub?rescue模式下運(yùn)行。你應(yīng)該運(yùn)行的第一個(gè)命令是設(shè)置一個(gè)分頁器,將長的命令分頁。如下:?
grub>?set?pager=1?
等號(hào)兩側(cè)必須不能出現(xiàn)空格?,F(xiàn)在讓我們做一點(diǎn)探索。輸入ls來列出的GRUB識(shí)別的所有分區(qū):?
grub>?ls?
(hd0)?(hd0,msdos2)?(hd0,msdos1)?
msdos是什么?這意味著該系統(tǒng)具有老式的MS-DOS分區(qū)表,而不是全新的全局唯一標(biāo)識(shí)符的分區(qū)表(GPT)。參見"在Linux下使用新的GUID分區(qū)表,和古老的MBR說再見!"。如果你正在運(yùn)行的GPT,它會(huì)出現(xiàn)(hd0,GPT1)?,F(xiàn)在讓我們看看,使用ls命令查看你的系統(tǒng)里面有什么文件:?
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?
太好了,我們已經(jīng)找到了根文件系統(tǒng)。你可以省略msdos和GPT的標(biāo)簽。如果沒有加分區(qū)后面的斜杠/,則只會(huì)列出分區(qū)的信息。你可以用cat命令顯示文件系統(tǒng)上的任何文件:?
grub>?cat?(hd0,1)/etc/issue?
Ubuntu?14.04?LTS?\n?\l?
在一個(gè)多引導(dǎo)系統(tǒng)上,通過/etc/issue文件可以知道這是哪個(gè)Linux系統(tǒng)。?
從?grub>?中啟動(dòng)?
下面講述如何設(shè)置啟動(dòng)文件并從grub?>提示下啟動(dòng)系統(tǒng)。我們已經(jīng)知道如何從Linux根文件系統(tǒng)(hd0,1)下運(yùn)行l(wèi)s命令,你可以一直尋找直到找到你的/boot/grub所在位置。然后運(yùn)行以下命令,記得使用您自己的根分區(qū),內(nèi)核和initrd映像等參數(shù):?
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?
第一行設(shè)置分區(qū)的根文件系統(tǒng)。第二行告訴GRUB您想要使用的內(nèi)核位置。開始輸入/boot/vmli,然后使用tab補(bǔ)完填寫。輸入root=?/dev/sdX設(shè)置根文件系統(tǒng)位置。是的,這似乎是多余的,但如果你忘記了輸入,你會(huì)得到一個(gè)kernel?panic。你知道怎么找到正確的分區(qū)嗎?hd0,1?即?/dev/sda1,hd1,1?即?/dev/sdb1,hd3,2?即?/dev/?sdd2。我想你可以自己推算剩下的了。?
第三行設(shè)置initrd文件,必須是和內(nèi)核相同的版本號(hào)。?
最后一行啟動(dòng)系統(tǒng)。?
在一些Linux系統(tǒng)上,內(nèi)核和initrd是被符號(hào)鏈接到當(dāng)前的根文件系統(tǒng)的根目錄,就像:?
$?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>?中啟動(dòng)?
如果你處在grub?rescue>?命令界面下,命令有所不同,你必須要先加載兩個(gè)模塊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?
在你加載了這兩個(gè)模塊之后tab補(bǔ)完的功能就可以用了。?
永久性的修復(fù)?
當(dāng)你成功地啟動(dòng)你的系統(tǒng),運(yùn)行這些命令來永久修復(fù)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.?
當(dāng)你運(yùn)行?grub-install?時(shí),記得GRUB是安裝到整個(gè)硬盤驅(qū)動(dòng)器的主引導(dǎo)扇區(qū)而不是到一個(gè)具體分區(qū),所以不要加上像/dev/sda1一樣的分區(qū)號(hào)。?
如果還是不能使用?
如果你的系統(tǒng)是如此的倒霉,而且這個(gè)方式?jīng)]有能起作用,那就嘗試超級(jí)GRUB2現(xiàn)場救援磁盤吧。官方GNU?GRUB手冊(cè)也應(yīng)該有所幫助。?
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。