(UEFI) 從 GRUB 鍊式載入 GRUB
術語:ESP = 我的 FAT32 EFI 分區。
我想要:
- 在我的 ESP 上安裝一個獨立的 GRUB,在我的發行版根文件系統 (
/
) 上鍊式載入另一個 GRUB 引導載入程序。我的分區上目前有幾個沒有安裝 GRUB 的發行版。每個都完全安裝在自己的 ext4 上/
。我希望他們都有自己的輔助引導載入程序。- 主 ESP GRUB 也可以使用來自作業系統的 grub.cfg 重新啟動/重新載入。有效地進行鍊式載入。
我試過的:
- 我發現的範例包括從 GRUB2 引導 GRUB legacy,反之亦然,但它們不使用 UEFI 和 .efi 文件。GNU GRUB 文件甚至沒有提到 UEFI,Arch/Ubuntu/Gentoo wiki 提供了最基本的(非鍊式載入)安裝資訊。
至今:
- 我已經使用 .Test 引導工作將 GRUB 安裝到我的 ESP
grub-install
上grub-mkconfig
。這意味著我的/boot/grub
文件夾是空的,並且我的 ESP 不需要在啟動期間/之後安裝。- 我嘗試在 and 中安裝第二個 grub
/boot/efi/
,/boot/grub/
但 EFI 部分無法安裝,grub-install
抱怨目標不是 EFI 分區。但是由於我已經安裝了主 GRUB,所以我的輔助 GRUB 是否在 ext4 rootfs 上應該沒關係吧?Grub 可以讀取 ext4。我也試過這個--force
選項。所以看來我需要找到某種方法來說服安裝程序可以
grubx64.efi
在/boot/EFI
…下安裝如果有人對我是如何安裝主 GRUB 感到好奇,那隻是使用
grub-install
與我的 ESP 相關的正確選項的問題。
我已經找到瞭如何在
.efi
我的每個/
’s 上手動安裝。從主配置中引用輔助 GRUB 鏈載入器很簡單:menuentry "GRUB chainloader" { #Load grub on partition 7 of a gpt formatted drive. #It will reference its own modules and config. chainloader (hd0,gpt7)/path/to/bootloader/on/myOS/core.efi }
為了創建這個輔助文件
.efi
,我使用了grub-mkimage
因為grub-install
沒有讓我寫入非 FAT 文件系統。語法非常挑剔,如果使用錯誤的路徑也不會出錯,因此請仔細檢查參數:grub-mkimage -o /path/to/mounted/targetOS/efidir/core.efi --format=x86_64-efi '--prefix=(hd0,gpt7)/boot/grub' ext2 part_gpt
我嘗試省略 GPT 或 ext2 文件系統模組,但這不起作用,這兩個模組是我係統的絕對最低要求(ext2 適用於 ext2/3/4)。
前綴目錄是輔助引導載入程序查找其模組文件夾和配置文件的位置。因此,我
/boot/grub/
為每個包含x86_64-efi/
文件夾的作業系統手動創建了一個(複製自/usr/lib/grub)
並且grub.cfg
我可以grub-mkconfig
在禁用作業系統探測的情況下修改它(或者只是手動編輯它)。我最初在沒有 GRUB 的情況下安裝了每個作業系統。這種方法允許我在所有使用第一個作業系統或帶有 GRUB 的 LiveCD 的作業系統上安裝輔助 GRUB 引導載入程序。我可以獨立更改每個作業系統的啟動配置,沒有污染風險,因為從未安裝過 ESP。
還有另一種方法:您可以創建一個菜單項,告訴 GRUB 載入另一個輔助 grub.cfg,例如來自另一個 Linux 發行版的 grub.cfg。
例如,我從 Gentoo Linux 開始,我將 GRUB2 安裝到 MBR 中(這台機器對於 EFI 來說太舊了)。
然後我安裝了 NixOS,我將其配置為在它自己的*/boot (與 Gentoo 的**/boot*分開)中生成 grub.cfg,但沒有安裝 GRUB。
澄清一下,
grub-install
是從 Gentoo 執行的,而不是從 NixOS 執行的。接下來,為了能夠啟動 NixOS,我將其添加到Gentoo的*/etc/grub.d/40_custom中:*
#!/bin/sh exec tail -n +3 $0 # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the 'exec tail' line above. menuentry 'NixOS' --class gnu-linux --class gnu --class os $menuentry_id_option 'nixos-0aca58bc-8fdb-4a07-aa2f-56406bcf19b7' { set root='hd0,msdos4' configfile /nixos/root/boot/grub/grub.cfg }
關鍵是
configfile /nixos/root/boot/grub/grub.cfg
線。它告訴 GRUB 載入另一個 grub.cfg。然後我從 Gentoo 跑來grub-mkconfig
應用更改。現在,當我啟動並選擇NixOS時,整個 GRUB 界面都會刷新以反映 NixOS grub.cfg,我可以從中啟動作業系統。與鍊式載入不同,此配置使用 GRUB 的單個安裝;它只是使用第二種配置。