沒有什麼事情比 bootloader 壞掉更氣人的了,充分發揮 Grub 2 的做用,讓 bootloader 安分工做吧。爲何這麼說?linux
Grub 2 是一款功能強大的軟件,它不是 bootloader 界的惟一,但卻最受歡迎,幾乎全部主流的桌面發行版都在使用它。shell
Grub 的工做有兩個:首先,它用一個菜單展現計算機上全部已經安裝的操做系統供你選擇;其次,當你從啓動菜單中選擇了一個 Linux 操做系統後, Grub 便加載對應版本Linux 的內核,衆所周知,使用 Linux 就離不開 bootloader ,然而它倒是 Linux 發行版內部不多有人充分了解的部分。ubuntu
/etc/default/grub安全
/etc/grub.dbash
/etc/default/grub架構
/boot工具
Linux、 Windows、 BSD佈局
Mac OS Xui
/boot/grub/grub.cfg操作系統
/etc/grub.d
/etc/default/grub
圖形化的引導修復
多虧了 Boot Repair的應用,咱們只須要點擊按鈕,Grub 2 就能幫咱們輕易解決不少問題,這個漂亮而小巧的應用有一個比較直觀的用戶界面,能夠掃描並識別多種硬盤佈局和分區方案,還能發現並正確識別安裝的操做系統,這個應用既能夠處理傳統計算機裏的主引導記錄Master Boot Record (MBR),也能夠處理新型 UEFI 計算機中的GUID 分區表GUID Partition Table(GPT)。
Boot Repair 最簡單的使用方式是安裝到 Live Ubuntu 會話中,在一個 bootloader 損壞的機器上啓動 Ubuntu Live 發行版,先經過添加它的 PPA 版本庫來安裝 Boot Repair ,命令以下:
sudo add-apt-repository ppa:yannubuntu/Boot Repair
而後刷新版本庫列表:
sudo apt-get update
安裝應用,以下:
sudo apt-get install -y Boot Repair
安裝完畢後就啓動應用,在顯示它的界面(由一對按鍵組成)以前它將會掃描你的硬盤,接下來用戶能夠根據工具的指示,只需按下 Recommended Repair推薦的修復按鈕,便可修復大部分壞掉的 bootloader ,修復 bootloader 以後,這個工具會輸出一個短小的 URL (建議把它記錄下來),這個 URL 包含了硬盤詳盡的信息:分區信息以及重要的 Grub 2 文件(如/etc/default/grub 和 /boot/grub/grub.cfg )的內容,若是工具不能解決 bootloader 的問題,能夠把你這個 URL 共享在你的發行版的論壇上,讓其餘人能夠分析你的硬盤佈局以便給你建議。
Bootloader 急救
Grub 2 引導問題會讓系統處於幾種不一樣狀態,屏幕(本該顯示 bootloader 菜單的地方)所展現的文本會指示出系統的當前狀態:
你能夠經過使用 live CD 或者在 Grub 2 shell 中修正此類錯誤,若是你夠幸運, bootloader 出現了 grub> 提示符,你就能得到 Grub 2 shell 的支配權,來幫助你排錯,接下來幾個命令工做在 grub> 和 grub rescue> 提示符下, set pager=1 命令設置顯示分頁pager,防止文本在屏幕上一滾而過,你還可使用 ls 命令列出 Grub 識別出的全部分區,以下:
grub> ls (hd0) (hd0,msdos5) (hd0,msdos6) (hd1,msdos1)
如你所見,這個命令列出分區的同時一併列出了分區表方案(即 msdos)。
你還能夠在每一個分區上面使用 ls 來查找你的根文件系統:
grub> ls (hd0,5)/ lost+found/ var/ etc/ media/ bin/ initrd.gz boot/ dev/ home/ selinux/ srv/ tmp/ vmlinuz
你能夠不寫上分區名的 msdos 部分,一樣,若是你忘記了尾部的斜槓trailing slash只輸入 ls (hd0,5) ,那你將得到分區的信息,好比文件系統類型、整體大小和最後修改時間,若是你有多個分區,可使用 cat 讀取 /etc/issue 文件中的內容,來肯定發行版,格式如 :
cat (hd0,5)/etc/issue
假設你在 (hd0,5) 中找到根文件系統,請確保它包含 /boot/grub 目錄,以及你想引導進入的內核鏡像,如 vmlinuz-3.13.0-24-generic ,此時輸入如下命令:
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 指向咱們想引導進入的發行版所在的分區,接着第二個命令告知 Grub 內核鏡像在分區中的位置,以及根文件系統的位置,最後一行設置虛擬文件系統initial ramdisk文件的位置,你可使用 tab 補全功能補全內核名字和虛擬文件系統initrd: initial ramdisk的名字,節省時間和精力,輸入完畢,在下一個 grub> 提示符後輸入 boot , Grub 將會引導進入指定的操做系統。
若是你在 grub rescue> 提示符下,狀況會有些許不一樣。由於 bootloader 未可以找到並加載任何須需的模塊,你須要手動添加這些模塊:
grub rescue> set root=(hd0,5) grub rescue> insmod (hd0,5)/boot/grub/normal.mod grub rescue> normal grub> insmod linux
如上所示,跟以前同樣,使用 ls 命令列出全部分區以後,使用 set 命令標記起來,而後添加 normal 模塊,此模塊激活時將會恢復到標準 grub> 模式,若是 linux 模塊沒加載,接下來的命令會進行添加,若是這個模塊已經加載,你能夠跟以前同樣,把引導加載程序指向內核鏡像和虛擬文件系統initrd文件,而後使用 boot 啓動發行版,prefect!
一旦成功啓動發行版,別忘了爲 Grub 從新產生新的配置文件,使用命令:
grub-mkconfig -o /boot/grub/grub.cfg
你還須要往 MBR 裏安裝一份 bootloader 的拷貝,使用命令:
sudo grub2-install /dev/sda
若是想要禁用 /etc/grub.d 目錄下的腳本,你只需移除其可執行位,好比使用 chmod -x /etc/grub.d/20_memtest86+ 就能將 ‘Memory Test’ 選項從菜單中移除。
Grub 2 和 UEFI
在支持 UEFI 的機器(最近幾年上市的機器大部分都是)調試壞掉的 Grub 2 增長了難度,恢復安裝在 UEFI 機器上的 Grub 2 的和安裝在非 UEFI 機器上的並沒多大區別,只是新的固件處理方式不同,從而致使了不少種恢復結果,對於基於 UEFI 的系統,不要在 MBR 上安裝任何東西,相反,你要在EFI 系統分區EFI System Partition( ESP )裏安裝 Linux EFI bootloader,而且藉助工具把它設置爲 EFI 的默認啓動程序,這個工具對於 Linux 用戶是 efibootmgr ,對於 window 用戶則是 bcdedit 。
照目前狀況看,在安裝任何與 Windows 8 兼容的主流桌面 Linux 發行版前,應該正確安裝好 Grub 2,若是 bootloader 損壞,你可使用 live 發行版修復機器,在啓動 live 介質之時,請確保是以 UEFI 模式啓動,計算機每一個可移動驅動器的啓動菜單將會有兩個: 一個普通的和一個以 EFI 標記的,使用後者會用到 /sys/firmware/efi/ 文件中的 EFI 變量。
在 live 環境中,掛載教程前面所提的安裝掛掉系統的根文件系統,除此以外,還須要掛載 ESP 分區,假設分區是/dev/sda1 ,你能夠以下所示掛載:
sudo mount /dev/sda1 /mnt/boot/efi
接着在 chroot 到安裝完畢的發行版前以前,使用 modprobe efivars 加載 efivars 模塊。
Fedora 用戶可使用以下命令從新安裝 bootloader
grub2-mkconfig -o /boot/grub2/grub.cfg yum reinstall grub2-efi shim
grub2-mkconfig -o /boot/grub2/grub.cfg
命令是來產生新的配置文件。
Ubuntu 用戶則改用如下命令
apt-get install --reinstall grub-efi-amd64
一旦 bootloader 正確就位,退出 chroot ,卸載全部分區,重啓到 Grub 2 菜單。
Grub 丟失
Grub 2 最好的特性是能夠隨時從新安裝,所以,當其它像 Windows 之類的系統用它們本身的 bootloader 替換後,致使 Grub 2 丟失,你可使用 live 發行版,寥寥數步便可重裝 Grub ,假設你在 /dev/sda5 安裝了一個發行版,若要重裝 Grub ,你只需首先使用如下命令爲發行版建立一個掛載目錄:
sudo mkdir -p /mnt/distro
而後掛載分區,以下:
mount /dev/sda5 /mnt/distro
接着就能重裝 Grub 了,以下:
grub2-install --root-directory=/mnt/distro /dev/sda
這個命令會改寫 /dev/sda 設備上的 MBR 信息,指向當前 Linux 系統,並重寫一些 Grub 2 文件,如 grubenv 和device.map ,另外一個問題常見於裝有多個發行版的計算機上:當你安裝了新的 Linux 發行版,它的 bootloader 應當要能找到全部已經安裝的發行版,一旦不行,只要引導進入新安裝的發行版,並運行
grub2-mkconfig
在運行這個命令以前,請確保啓動菜單中缺失的發行版的 root 分區已經掛載,若是你想添加的發行版有單獨的 /root和 /home 分區,在運行 grub2-mkconfig 以前,只需掛載包含 /root 的分區,雖然 Grub 2 可以找到大部分發行版,可是在 Ubuntu 中嘗試添加安裝的 Fedora 系統須要額外的一個步驟:若是你以默認設置安裝了 Fedora ,則發行版的安裝器已經建立了 LVM 分區,此時你須要使用發行版的包管理系統安裝 lvm2 驅動,以下
sudo apt-get install lvm2
執行以後才能使得 Grub 2 的 os-prober 腳本可以找到並將 Fedora 添加進啓動菜單。
常見用戶設置
Grub 2 有不少可配置變量, 這裏有一些 /etc/default/grub 文件中你最可能會修改到的常見變量:
Grub 2 有個命令行模式,經過在 bootloader 菜單上按 C 進入。
完全的修復bootloader
若是 grub2-install 命令不能正常運做,使得你沒法引導進入 Linux ,你須要完整地重裝以及從新配置 bootloader ,須要用到強大的 chroot 功能將運行環境從 live CD 環境切換至咱們想修復的 Linux 的安裝位置,任何擁有chroot 工具的 Linux live CD 均可以實現這個目的,不過須要確保 live 介質的系統架構和硬盤上系統的架構一致,所以若是你但願 chroot 到 64 位系統,你必須使用 amd64 live 發行版。
啓動進入 live 發行版以後,首先須要檢查機器上的分區,使用 fdisk -l 列出磁盤上全部分區,記錄你想修復的 Grub 2 系統所在的分區,假設咱們但願從安裝在 /dev/sda5 中的發行版中恢復 bootloader 。啓動終端使用以下命令掛載分區:
sudo mount /dev/sda5 /mnt
此時須要綁定bindGrub 2 bootloader 須要進入的目錄,以便檢測其它操做系統:
$ 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 環境進入安裝在 /dev/sda5 分區中的發行版了,經過 chroot :
$ sudo chroot /mnt /bin/bash
如今能夠安裝、檢測、以及升級 Grub 了,跟以前同樣,使用以下命令來重裝 bootloader :
sudo grub2-install /dev/sda
由於 grub2-install 命令不能建立grub.cfg 文件,須要手動建立,以下
sudo grub-mkconfig -o /boot/grub/grub.cfg
這樣應該就能夠了,如今你就有了 Grub 2 的一份全新拷貝,羅列了機器上全部的操做系統和發行版,在重啓電腦以前,你須要依次退出 chroot 系統,卸載全部分區,以下所示:
$ exit $ sudo umount /mnt/sys $ sudo umount /mnt/proc $ sudo umount /mnt/dev/pts $ sudo umount /mnt/dev $ sudo umount /mnt
如今你能夠安全地重啓電腦了,而它應該會回退到 Grub 2 的控制之中,你已經修好了這個 bootloader。
添加自定義菜單項
若是但願往 bootloader 菜單裏添加菜單項,你須要在 40_custom 文件裏添加一個啓動段boot stanza,例如,你可使用它展現一個菜單項來啓動安裝在可移動 USB 驅動裏的 Linux 發行版,假設你的 USB 驅動器是 sdb1 ,而且 vmlinuz 內核鏡像和虛擬文件系統initrd都位於根 (/)目錄下,在 40_custom 文件中添加如下內容:
menuentry 「Linux on USB」 { set root=(hd1,1) linux /vmlinuz root=/dev/sdb1 ro quiet splash initrd /initrd.img }
相比使用設備和分區名,使用它們的 UUID 能夠得到更精確結果,好比
set root=UUID=54f22dd7-eabe
使用以下命令來得到全部已鏈接的驅動器和分區的 UUID :
sudo blkid
你還能夠爲你磁盤上沒被 os-prober 腳本找到的發行版添加菜單項,只要你知道該發行版的安裝位置以及其內核和虛擬文件系統initrd的位置便可。
免費提供最新Linux技術教程書籍,爲開源技術愛好者努力作得更多更好:http://www.linuxprobe.com/