- Grub 2 是最受歡迎的 bootloader ,,幾乎用在所有 Linux 發(fā)行版上,。
- bootloader 是一個至關(guān)重要的軟件,但是非常容易損壞,。
- Grub 2 是兼具擴展性和靈活性的一款引導加載程序,,提供了大量可定制選項。
Grub 2 是一款精彩的功能強大的軟件,。它不是 bootloader 界的一枝獨秀,,但卻最受歡迎,幾乎所有主要的桌面發(fā)行版都在使用它,。 Grub 的工作有兩個,。首先,它用一個菜單展示計算機上所有已經(jīng)安裝的操作系統(tǒng)供你選擇,。其次,,當你從啟動菜單中選擇了一個 Linux 操作系統(tǒng), Grub 便加載這個 Linux 的內(nèi)核,。
你知道,,如果使用 Linux ,你就離不開 bootloader 。然而它卻是 Linux 發(fā)行版內(nèi)部最鮮為人知的部分,。在這篇文章里,,我們將帶你熟悉 Grub 2 一些著名的特性,強化你相關(guān)技能,,使你在 bootloader 跑飛的時候能夠自行處理,。
Grub 2 最重要的部分是一堆文本文件和兩個腳本文件。首先需要了解的是 /etc/default/grub
,。這是一個文本文件,,你可以在里面設置通用配置變量和 Grub 2 菜單(見下方 “常見用戶設置” )的其它特性。
Grub 2 另一個重要的部分是 /etc/grub.d
文件夾,。定義每個菜單項的所有腳本都放置在這里,。這些腳本的名稱必須有兩位的數(shù)字前綴。其目的是,,在構(gòu)建 Grub 2 菜單時定義腳本的執(zhí)行順序以及相應菜單項的順序,。文件 00_header
首先被讀取,負責解析 /etc/default/grub
配置文件,。然后是 Linux 內(nèi)核的菜單項,,位于 10_linux
文件中。這個腳本在默認的 /boot
分區(qū)為每個內(nèi)核創(chuàng)建一個正規(guī)菜單項和一個恢復菜單項,。
緊接著的是為第三方應用所用的腳本,,如 30_os-prober
和 40_custom
。 os-prober 腳本為內(nèi)核和其它分區(qū)里的操作系統(tǒng)創(chuàng)建菜單項,。它能識別安裝的 Linux,、 Windows、 BSD 以及 Mac OS X ,。 如果你的硬盤布局比較獨特,,使得 os-prober 無法找到已經(jīng)安裝的發(fā)行版,你可以在 40_custom
文件(見下方 “添加自定義菜單項”)中添加菜單項,。
Grub 2 不需要你手動維護你的啟動選項的配置文件:取而代之的是使用 grub2-mkconfig
命令產(chǎn)生 /boot/grub/grub.cfg
文件,。這個功能會解析 /etc/grub.d
目錄中的腳本以及 /etc/default/grub
設置文件來定義你的設置情況。
圖形化的引導修復
多虧了 Boot Repair 應用,,只需要點擊按鈕,,Grub 2 許許多多的問題都能輕易解決。這個漂亮小巧的應用有一個直觀的用戶界面,,可以掃描并識別多種硬盤布局和分區(qū)方案,,還能發(fā)現(xiàn)并正確識別安裝在其中的操作系統(tǒng)。這個應用可以處理傳統(tǒng)計算機里的主引導記錄(Master Boot Record) (MBR),,也可以處理新型 UEFI 計算機中的 GUID 分區(qū)表(GUID Partition Table)(GPT),。
Boot Repair 最簡單的使用方式是安裝到 Live Ubuntu 會話中,。在一個 bootloader 損壞的機器上啟動 Ubuntu Live 發(fā)行版,先通過添加它的 PPA 版本庫來安裝 Boot Repair ,,命令如下:
1 2 | sudo add-apt-repository ppa:yannubuntu/Boot Repair |
然后刷新版本庫列表:
1 2 | sudo apt-get update |
安裝應用,,如下:
1 2 | sudo apt-get install -y Boot Repair |
安裝完畢后就啟動應用。在顯示它的界面(由一對按鍵組成)之前將會掃描你的硬盤,。根據(jù)工具的指示,,只需按下 Recommended Repair(推薦的修復)按鈕,即可修復大部分壞掉的 bootloader ,。修復 bootloader 之后,,這個工具會輸出一個短小的 URL ,你應該把它記錄下來,。這個 URL 包含了硬盤詳盡的信息:分區(qū)信息以及重要的 Grub 2 文件(如/etc/default/grub
和 /boot/grub/grub.cfg
)的內(nèi)容,。如果工具不能解決 bootloader 的問題,可以把你這個 URL 共享在你的發(fā)行版的論壇上,,讓其他人可以分析你的硬盤布局以便給你建議,。
Boot Repair 也可以讓你定制 Grub 2 的選項。
Bootloader 急救
Grub 2 引導問題會讓系統(tǒng)處于幾種不同狀態(tài),。屏幕(如你所想,本該顯示 bootloader 菜單的地方)所展示的文本會指示出系統(tǒng)的當前狀態(tài),。如果系統(tǒng)中止于 grub> 提示符,,表明 Grub 2 模塊已經(jīng)被加載,但是找不到 grub.cfg 文件,。當前是完全版的 Grub 2 命令行 shell,,你可以通過多種方式解決此問題。如果你看到的是 grub rescue> 提示符,,表明 bootloader 不能找到 Grub 2 模塊或者找不到任何引導文件( boot files ),。然而,如果你的屏幕只顯示 ‘GRUB’ 一詞,,表明 bootloader 找不到通常位于主引導記錄( Master Boot Record )里的最基本的信息,。
你可以通過使用 live CD 或者在 Grub 2 shell 中修正此類錯誤。如果你夠幸運,, bootloader 出現(xiàn)了 grub> 提示符,,你就能獲得 Grub 2 shell 的支配權(quán),來幫助你排錯,。
接下來幾個命令工作在 grub> 和 grub rescue> 提示符下,。 set pager=1 命令設置顯示分頁( pager ),防止文本在屏幕上一滾而過,。你還可以使用 ls 命令列出 Grub 識別出的所有分區(qū),,如下:
1 2 3 | grub> ls (hd0) (hd0,msdos5) (hd0,msdos6) (hd1,msdos1) |
如你所見,,這個命令列出分區(qū)的同時一并列出了分區(qū)表方案(即 msdos)。
你還可以在每個分區(qū)上面使用 ls 來查找你的根文件系統(tǒng):
1 2 3 4 | grub> ls (hd0,5)/ lost+found/ var/ etc/ media/ bin/ initrd.gz boot/ dev/ home/ selinux/ srv/ tmp/ vmlinuz |
你可以不寫上分區(qū)名的 msdos 部分,。同樣,,如果你忘記了尾部的斜杠( trailing slash )只輸入 ls (hd0,5)
,那你將獲得分區(qū)的信息,,比如文件系統(tǒng)類型,、總體大小和最后修改時間。如果你有多個分區(qū),,可以使用 cat
讀取 /etc/issue
文件中的內(nèi)容,,來確定發(fā)行版,格式如 cat (hd0,5)/etc/issue
,。
假設你在 (hd0,5) 中找到根文件系統(tǒng),,請確保它包含 /boot/grub
目錄,以及你想引導進入的內(nèi)核鏡像,,如 vmlinuz-3.13.0-24-generic ,。此時輸入以下命令:
1 2 3 4 | grub> set root=(hd0,5) grub> linux /boot/vmlinuz-3.13.0-24-generic root=/dev/sda5 grub> initrd /boot/initrd.img-3.13.0-24-generic |
第一個命令把 Grub 指向我們想引導進入的發(fā)行版所在的分區(qū)。接著第二個命令告知 Grub 內(nèi)核鏡像在分區(qū)中的位置,,以及根文件系統(tǒng)的位置,。最后一行設置虛擬文件系統(tǒng)( initial ramdisk )文件的位置。你可以使用 tab 補全功能補全內(nèi)核名字和虛擬文件系統(tǒng)( initrd: initial ramdisk )的名字,,節(jié)省時間和精力,。
輸入完畢,在下一個 grub> 提示符后輸入 boot
,, Grub 將會引導進入指定的操作系統(tǒng),。
如果你在 grub rescue> 提示符下,情況會有些許不同,。因為 bootloader 未能夠找到并加載任何必需的模塊,,你需要手動添加這些模塊:
1 2 3 4 5 | grub rescue> set root=(hd0,5) grub rescue> insmod (hd0,5)/boot/grub/normal.mod grub rescue> normal grub> insmod linux |
如上所示,跟之前一樣,,使用 ls
命令列出所有分區(qū)之后,,使用 set
命令標記起來。然后添加 normal 模塊,,此模塊激活時將會恢復到標準 grub> 模式,。如果 linux 模塊沒加載,接下來的命令會進行添加,。如果這個模塊已經(jīng)加載,,你可以跟之前一樣,把引導加載程序指向內(nèi)核鏡像和虛擬文件系統(tǒng)( initrd )文件,,然后使用 boot
啟動發(fā)行版,,完美收官,。
一旦成功啟動發(fā)行版,別忘了為 Grub 重新產(chǎn)生新的配置文件,,使用
1 2 | grub-mkconfig -o /boot/grub/grub.cfg |
命令,。你還需要往 MBR 里安裝一份 bootloader 的拷貝,使用
1 2 | sudo grub2-install /dev/sda |
命令,。
想要禁用 /etc/grub.d
目錄下的腳本,,你只需移除其可執(zhí)行位,比如使用 chmod -x /etc/grub.d/20_memtest86+
就能將 ‘Memory Test’ 選項從菜單中移除,。
Grub 2 和 UEFI
在支持 UEFI 的機器(最近幾年上市的機器大部分都是)調(diào)試壞掉的 Grub 2 增加了另一復雜的層次,。恢復安裝在 UEFI 機器上的 Grub 2 的和安裝在非 UEFI 機器上的并沒多大區(qū)別,,只是新的固件處理方式不一樣,,從而導致了很多種恢復結(jié)果。
對于基于 UEFI 的系統(tǒng),,不要在 MBR 上安裝任何東西,。相反,你要在 EFI 系統(tǒng)分區(qū)(EFI System Partition)( ESP )里安裝 Linux EFI bootloader,,并且借助工具把它設置為 EFI 的默認啟動程序,,這個工具對于 Linux 用戶是 efibootmgr
,對于 window 用戶則是 bcdedit
,。
照目前情況看,,在安裝任何與 Windows 8 兼容的主流桌面 Linux 發(fā)行版前,應該正確安裝好 Grub 2,。然而,如果 bootloader 損壞,,你可以使用 live 發(fā)行版修復機器,。在啟動 live 介質(zhì)之時,請確保是以 UEFI 模式啟動,。計算機每個可移動驅(qū)動器的啟動菜單將會有兩個: 一個普通的和一個以 EFI 標記的,。使用后者會用到 /sys/firmware/efi/ 文件中的 EFI 變量。
在 live 環(huán)境中,,掛載教程前面所提的安裝掛掉系統(tǒng)的根文件系統(tǒng),。除此之外,還需要掛載 ESP 分區(qū),。假設分區(qū)是 /dev/sda1,,你可以如下所示掛載:
1 2 | sudo mount /dev/sda1 /mnt/boot/efi |
接著在 chroot 到安裝完畢的發(fā)行版前之前,使用 modprobe efivars
加載 efivars 模塊,。
在這里,, Fedora 用戶可以使用如下命令重新安裝 bootloader
1 2 | yum reinstall grub2-efi shim |
但在此之前,,需要使用
1 2 | grub2-mkconfig -o /boot/grub2/grub.cfg |
來產(chǎn)生新的配置文件。 Ubuntu 用戶則改用以下命令
1 2 | apt-get install --reinstall grub-efi-amd64 |
一旦 bootloader 正確就位,,退出 chroot ,,卸載所有分區(qū),重啟到 Grub 2 菜單,。
伙計,,我的 Grub 哪去了?
Grub 2 最好的特性是可以隨時重新安裝,。因此,,當其它像 Windows 之類的系統(tǒng)用它們自己的 bootloader 替換后,導致 Grub 2 丟失,,你可以使用 live 發(fā)行版,,寥寥數(shù)步即可重裝 Grub 。假設你在 /dev/sda5
安裝了一個發(fā)行版,,若要重裝 Grub ,,你只需首先使用以下命令為發(fā)行版創(chuàng)建一個掛載目錄:
1 2 | sudo mkdir -p /mnt/distro |
然后掛載分區(qū),如下:
1 2 | mount /dev/sda5 /mnt/distro |
接著就能重裝 Grub 了,,如下:
1 2 | grub2-install --root-directory=/mnt/distro /dev/sda |
這個命令會改寫 /dev/sda
設備上的 MBR 信息,,指向當前 Linux 系統(tǒng),并重寫一些 Grub 2 文件,,如 grubenv 和 device.map,。
另一個問題常見于裝有多個發(fā)行版的計算機上。當你安裝了新的 Linux 發(fā)行版,,它的 bootloader 應當要能找到所有已經(jīng)安裝的發(fā)行版,。一旦不行,只要引導進入新安裝的發(fā)行版,,并運行
1 2 | grub2-mkconfig |
在運行這個命令之前,,請確保啟動菜單中缺失的發(fā)行版的 root 分區(qū)已經(jīng)掛載。如果你想添加的發(fā)行版有單獨的 /root
和/home
分區(qū),,在運行 grub2-mkconfig
之前,,只需掛載包含 /root
的分區(qū)。
雖然 Grub 2 能夠找到大部分發(fā)行版,,但是在 Ubuntu 中嘗試添加安裝的 Fedora 系統(tǒng)需要額外的一個步驟,。如果你以默認設置安裝了 Fedora ,則發(fā)行版的安裝器已經(jīng)創(chuàng)建了 LVM 分區(qū),。此時你需要使用發(fā)行版的包管理系統(tǒng)安裝 lvm2 驅(qū)動,,如下
1 2 | sudo apt-get install lvm2 |
才能使得 Grub 2 的 os-prober
腳本能夠找到并將 Fedora 添加進啟動菜單。
常見用戶設置
Grub 2 有很多可配置變量,。 這里有一些 /etc/default/grub
文件中你最可能會修改到的常見變量,。 GRUB_DEFAULT 變量指定默認的啟動項,,可以設置為數(shù)字值,比如 0 ,,表示第一個菜單項,,或者設置為 “saved” ,將指向上一次啟動時選中的菜單項,。 GRUB_TIMEOUT 變量指定啟動默認菜單項之前的停留時間,。 GRUB_CMDLINE_LINUX 列出了要傳遞給所有 Linux 菜單項的內(nèi)核命令行參數(shù)。
如果 GRUB_DISABLE_RECOVERY 變量設置為 true ,,那么將不生成恢復模式菜單項,。這些菜單項會以單用戶模式啟動發(fā)行版,這種模式下允許你利用命令行工具修復系統(tǒng),。 GRUB_GFXMODE 變量同樣有用,,它指定了菜單上文本顯示的分辨率,它可以設置為你的顯卡所支持的任何數(shù)值,。
Grub 2 有個命令行模式,,通過在 bootloader 菜單上按 C 進入。
徹底的修復
如果 grub2-install
命令不能正常運作,,使得你無法引導進入 Linux ,,你需要完整地重裝以及重新配置 bootloader 。為此目的,,需要用到強大的 chroot 功能將運行環(huán)境從 live CD 環(huán)境切換至我們想修復的 Linux 的安裝位置,。任何擁有 chroot 工具的 Linux live CD 都可以實現(xiàn)這個目的。不過需要確保 live 介質(zhì)的系統(tǒng)架構(gòu)和硬盤上系統(tǒng)的架構(gòu)一致,。因此當你希望 chroot 到 64 位系統(tǒng),,你必須使用 amd64 live 發(fā)行版。
啟動進入 live 發(fā)行版之后,,首先需要檢查機器上的分區(qū),。使用 fdisk -l
列出磁盤上所有分區(qū),記錄你想修復的 Grub 2 系統(tǒng)所在的分區(qū),。
假設我們希望從安裝在 /dev/sda5
中的發(fā)行版中恢復 bootloader ,。啟動終端使用如下命令掛載分區(qū):
1 2 | sudo mount /dev/sda5 /mnt |
此時需要綁定(bind)Grub 2 bootloader 需要進入的目錄,,以便檢測其它操作系統(tǒng):
1 2 3 4 5 | $ 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 |
此時可以離開 live 環(huán)境進入安裝在 /dev/sda5 分區(qū)中的發(fā)行版了,,通過 chroot :
1 2 | $ sudo chroot /mnt /bin/bash |
現(xiàn)在可以安裝、檢測,、以及升級 Grub 了,,跟之前一樣,使用
1 2 | sudo grub2-install /dev/sda |
命令來重裝 bootloader ,。因為 grub2-install 命令不能創(chuàng)建grub.cfg 文件,,需要手動創(chuàng)建,,如下
1 2 | sudo grub-mkconfig -o /boot/grub/grub.cfg |
這樣應該就可以了。現(xiàn)在你就有了 Grub 2 的一份全新拷貝,,羅列了機器上所有的操作系統(tǒng)和發(fā)行版,。在重啟電腦之前,你需要依次退出 chroot 系統(tǒng),,卸載所有分區(qū),,如下所示:
1 2 3 4 5 6 7 | $ exit $ sudo umount /mnt/sys $ sudo umount /mnt/proc $ sudo umount /mnt/dev/pts $ sudo umount /mnt/dev $ sudo umount /mnt |
現(xiàn)在你可以安全地重啟電腦了,而它應該會回退到 Grub 2 的控制之中,,你已經(jīng)修好了這個 bootloader,。
添加自定義菜單項
如果希望往 bootloader 菜單里添加菜單項,你需要在 40_custom 文件里添加一個啟動段( boot stanza ),。例如,,你可以使用它展示一個菜單項來啟動安裝在可移動 USB 驅(qū)動里的 Linux 發(fā)行版。假設你的 USB 驅(qū)動器是 sdb1 ,,并且 vmlinuz 內(nèi)核鏡像和虛擬文件系統(tǒng)( initrd )都位于根 (/)目錄下,,在 40_custom 文件中添加以下內(nèi)容: