Add custom GRUB entries in Linux to boot different operating systems installed on separate disks, each having its own EFI partition.
問題點:如果有多個硬碟,分別安裝多個不同的作業系統,且各自帶有一個EFI分區,如何在GRUB開機選單加入其他系統的開機選項?
舉例:
- 硬碟1安裝Ubuntu
- 硬碟2安裝Windows
- 硬碟3安裝FreeBSD
這三個硬碟各自帶有一個EFI分區,這樣的好處是能夠各自獨立開機,且不用擔心某個系統更新蓋掉EFI分區。
但是預設使用Ubuntu開機的情況下,GRUB是偵測不到另外二個系統的!Ivon希望可以在GRUB的開機選單,選擇要開機進入哪一個系統。
如圖所示,用Ubuntu的GRUB引導所有系統開機:
電腦開機的時候應該會看到GRUB的選單列出不同硬碟上的作業系統(主題另購):
這個時候得手寫規則加入,自訂GRUB的menu entry。
1. 列出所有硬碟的EFI分區#
GRUB開機需要告訴它要到哪裡找到EFI,我使用最簡單的根據分區的UUID來尋找。這樣就不用寫複雜的(hd0,gpt1)語法了。
用Ubuntu系統開機
使用blikd指令取得所有硬碟的資訊
sudo blkid
- 我們關心的是EFI分區的UUID,所以只要看分區類型是
vfat
的就可以了。
sudo blkid | grep vfat
- 範例輸出:
# Linux的EFI
/dev/sda1: UUID="18DF-5A70" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="2402bc09-540b-48df-b8e3-94b01834a808"
# Windows的EFI
/dev/sdb1: UUID="F7BB-8172" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="Basic data partition" PARTUUID="def0b2f8-d878-4381-906e-eb527a0b8e56"
# FreeBSD的EFI
/dev/sdc1: SEC_TYPE="msdos" UUID="810D-AF9A" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="efiboot0" PARTUUID="6c3ab213a-941e-4125-8735-4f0245b3c41b"
2. 新增GRUB menu entry#
- 不要直接在
/boot/grub/
修改GRUB開機選單。應該編輯GRUB的自訂設定檔,讓GRUB自動更新
sudo vim /etc/grub.d/40_custom
- 新增以下內容,每個區塊一個menuentry。需要注意分區表是
gpt
還是msdos
。在後面search --no-floppy --fs-uuid --set=root
使用EFI分區的UUID當作開機依據
menuentry "Windows" {
insmod part_gpt
insmod fat
search --no-floppy --fs-uuid --set=root F7BB-8172
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
menuentry "FreeBSD" {
insmod part_msdos
insmod fat
search --no-floppy --fs-uuid --set=root 810D-AF9A
chainloader /EFI/BOOT/BOOTX64.EFI
}
- 編輯GRUB設定檔
sudo vim /etc/default/grub
- 啟用偵測其他系統
GRUB_DISABLE_OS_PROBER=false
- 如果電腦開機的時候看不到GRUB選單與倒數秒數,將以下內容取消註解
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=menu
- 可以順便啟用記住上次開機選項
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
- 更新GRUB設定
sudo update-grub
- 重開機,在開機選單用鍵盤方向鍵往下走,就能看到新的menu entry了。