Grub2

(UEFI) 從 GRUB 鍊式載入 GRUB

  • May 28, 2020

術語: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 安裝到我的 ESPgrub-installgrub-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 的單個安裝;它只是使用第二種配置。

引用自:https://unix.stackexchange.com/questions/343632