在 CentOS 7 上設置 grub2

此文章主要以 Things to Know About Grub2 為基礎,而對象是那些開啟 /etc/grub2.cfg(或 /boot/grub2/grub.cfg)編輯開機選單的用戶。

另外請參閱 上游關於 grub2 的文檔grub 的使用手冊

1. 開機選單是自動建立出來的

請勿嘗試手動編輯開機選單,因為它是按照 /boot/ 目錄內的檔案自動建立出來的。然而你可以調整 /etc/default/grub 檔內定義的通用設定,及在 /etc/grub.d/40_custom 檔內加入個別自訂項目。

/etc/default/grub 檔的內容如下:

GRUB_TIMEOUT=5
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

通用於所有項目的內核選項都透過 GRUB_CMDLINE_LINUX 行來定義。舉個例說,要是你想看見詳細的開機訊息,刪除 rhgb quiet。要是你想看見標準的開機訊息,只刪除 rhgb。執行以下指令便能套用更改了的設定:

[root@host ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-229.14.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-229.14.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-229.4.2.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-229.4.2.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-229.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-229.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-605f01abef434fb98dd1309e774b72ba
Found initrd image: /boot/initramfs-0-rescue-605f01abef434fb98dd1309e774b72ba.img
done

UEFI 系統上的指令是 grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

2. 如何定義預設項目

若要列出系統開機時顯示的所有選項,請執行以下指令:

[root@host ~]# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux 7 (Core), with Linux 3.10.0-229.14.1.el7.x86_64
1 : CentOS Linux 7 (Core), with Linux 3.10.0-229.4.2.el7.x86_64
2 : CentOS Linux 7 (Core), with Linux 3.10.0-229.el7.x86_64
3 : CentOS Linux 7 (Core), with Linux 0-rescue-605f01abef434fb98dd1309e774b72ba

又或者:

[root@host ~]# grep "^menuentry" /boot/grub2/grub.cfg | cut -d "'" -f2

/etc/grub2.cfg 這個檔名指向 grub.cfg,而它的位置視乎架構而定。存取檔案時採用絕對路徑是較佳的做法,在維修系統時更甚。預設的項目是透過 /etc/default/grub 檔內的 GRUB_DEFAULT 行來定義。不過,要是 GRUB_DEFAULT 行被設定為 saved,這個選項便儲存在 /boot/grub2/grubenv 檔內。你可以這樣檢視它:

[root@host ~]# grub2-editenv list
saved_entry=CentOS Linux (3.10.0-229.14.1.el7.x86_64) 7 (Core)

/etc/default/grub 檔內另一個有用的選項是:

GRUB_SAVEDEFAULT=true

連同 GRUB_DEFAULT=saved,它確保現時選取的開機項目會被設定下次開機採用 —— 適用於雙重開機的系統,因為更新 Windows 須要數次重新開機。

/boot/grub2/grubenv 檔是不能手動編輯的。請採用以下指令:

[root@host ~]# grub2-set-default 2
[root@host ~]# grub2-editenv list
saved_entry=2

留意上述 awk 指令輸出的第一個項目的編號是 0。

現在你可重新啟動系統。

3. 修復模式及緊急模式

Linux 0-rescue-... 這個選項會令系統進入修復模式。這等同於單獨用戶模式。

此外,CentOS 並提供了一個緊急模式。在這模式下,systemd 啟動後便會立刻出現一個指令殼。其它程序都不會被啟動,而主檔案系統將會以唯讀模式掛載。其它檔案系統都不會被掛載。

要進入緊急模式,請在 grub2 的選單按 e 鍵來編輯設定。然後在內核選項的末端加入 systemd.unit=emergency.target

[如果你與 systemd 關係良好 :-) 你可以在 /usr/lib/systemd/system/emergency.service 檔內檢視緊急模式時發生甚麼事情。]

4. Stage 1.5(core.img)的收錄位置

grub/grub2 的檔案都位於 /boot 檔案系統內。在一個傳統(非 UEFI)的 BIOS 環境下,首先會載入一個開機映像(grub 是 stage1,grub2 是 boot.img),接著是載入 stage 1.5(grub2 是 core.img),它會啟動 /boot 檔案系統內的程式。stage 1.5 的收錄位置可以是緊接 MBR,或在 /boot 檔案系統的分割區內。在 CentOS 7,預設的位置是緊接 MBR。見 此圖像

Translation of revision 10

zh-tw/HowTos/Grub2 (last edited 2019-08-08 10:24:24 by TimothyLee)