Grub2

如何創建任意 UEFI 引導存根?

  • December 29, 2019

我安裝了 TinyCore 作為我的維護作業系統。我給了那個 GRUB2。但是 TinyCore 安裝說明告訴您使用 MBR 方法添加 GRUB2。(它可以工作,但這只是因為 EFI 向後兼容 MBR。)理想情況下,我想將它連結起來,以便 EFI 引導存根引導到 TinyCore 的 /boot/grub,這樣我就可以從 TinyCore 的 GRUB2 引導我的任何其他作業系統想。或者第二個選擇,我想將它連結起來,以便 EFI 引導存根向量到 TinyCore 的 vmlinuz。

TinyCore 沒有 efibootmgr。當我從 Ubuntu USB 記憶棒啟動時,efibootmgr 給了我“系統不支持 efivars”。

有沒有辦法只獲取 TinyCore 的 grub 目錄,將其帶到其他 Linux 機器上並從中創建一個 grub.efi,然後我可以將其帶回這台機器並複製到這台機器上的 ESP 中?

這就是我的做法。首先,我將我的 PC EFI 選項設置為僅 EFI 引導。然後我從 DVD 啟動 Ubuntu 16.04.4。(顯然這是 UEFI 引導。)。在 Ubuntu 16.04.4 中,我執行了以下操作。

  1. 掛載了我的 ESP 分區。(它是磁碟 1 的分區 1)
  2. mkdir /path/to/mounted/esp/partition/EFI/prime_boot
  3. 使用以下命令安裝 grub-efi-amd64: sudo apt-get install grub-efi-amd64
  4. grub-mkimage -o /path/to/mounted/esp/partition/EFI/prime_boot/bootx64.efi –format=x86_64-efi ‘–prefix=(hd0,gpt1)/EFI/prime_boot’ ext2 part_gpt
  5. 在 /path/to/mounted/esp/partition/EFI/prime_boot/ 中設置以下 grub.cfg 文件

menuentry “GRUB 鍊式載入器” { 鍊式載入器 (hd0,gpt2)/boot/efi/core.efi } 6. 將目錄 /usr/lib/grub/x86_64-efi 複製到 /path/to/mounted/esp/partition/EFI/prime_boot/。 7. efibootmgr -c -d /dev/sda -p 1 -l \EFI\prime_boot\bootx64.efi -L “主載入器” 8. 在 EFI 菜單中設置引導順序以使用“Primary Loader”

是的,您必須在“efibootmgr”命令中轉義“\”。現在您已經使用此主載入程序將 EFI 引導到 TinyCore 分區中的引導載入程序。所以現在你設置了 TinyCore 分區的引導載入程序。

  1. 掛載 TinyCore 分區。(我的是磁碟 1 分區 2)
  2. grub-mkimage -o /path/to/mounted/tinycore/partition/boot/efi/corex64.efi –format=x86_64-efi ‘–prefix=(hd0,gpt2)/boot/efi’ ext2 part_gpt
  3. 現在在 /path/to/mounted/tinycore/partition/boot/efi/ 中創建多引導 grub.cfg

我知道有人會想為什麼我從主引導載入程序跳轉到多引導載入程序。我只想在我的 esp 分區中做盡可能少的事情。我希望 TinyCore(我的維護作業系統)成為多引導引導管理器的所有者。

當我從 Ubuntu USB 記憶棒啟動時,efibootmgr 給了我“系統不支持 efivars”。

發生這種情況是因為您使用傳統 BIOS 樣式從 USB 記憶棒啟動,因此 UEFI 的兼容性支持模組將禁用用於​​訪問啟動變數的 UEFI 執行時介面。如果您可以在本機 UEFI 模式下啟動 U 盤,則efibootmgr可以。如果韌體啟動設置包括選擇首先嘗試 UEFI 還是傳統啟動方法,請嘗試在從記憶棒啟動時將其切換到“UEFI 優先”模式。

使用舊版 MBR GRUB2,您只能引導可使用舊版 MBR 樣式引導的作業系統。為了連結到已安裝以使用本機 UEFI 引導的作業系統,您需要 GRUB2 的 UEFI 版本。

將 UEFI GRUB 從一個發行版移植到另一個發行版的問題在於,不同的發行版設置它的方式略有不同:例如,Debian 過去使用grub.efi嵌入指令將一個非常小的 ESP 植入到 ESP 中,以從另一個發行版讀取更多 GRUB 模組和配置文件在 GRUB 安裝時指定的文件系統(通常是包含/boot目錄的文件系統)。

這種方法的問題在於,如果啟用 Secure Boot,這將變得不可能:載入的所有可執行程式碼都必須進行簽名,並且由於 GRUB 模組沒有使用與標準 UEFI 二進製文件相同的二進製文件格式,因此無法以會UEFI 韌體可被辨識。

另一方面,RedHat 派生的發行版傾向於將所有必要的 GRUB 模組嵌入到主grubx64.efi二進製文件中,然後可以通過 Secure Boot 在一次操作中成功載入shim.efi。GRUB 配置文件也放置在 ESP 文件系統中,通常反映主 UEFI GRUB 二進製文件的命名,即如果將二進製文件重命名為foo.efi,它將foo.cfg在同一目錄中查找。

知道了這一點,您只需確保禁用安全啟動,grub.efi從 RedHat/CentOS/Fedora 安裝介質中獲取二進製文件,手動將其寫入最小配置文件,將它們放入您的 ESP(可能是\EFI\boot\bootx64.efiand \EFI\boot\bootx64.cfg,因此 UEFI 應該選擇它們無需 UEFI 變數)並啟動一次。然後你可以看看TinyCore原生的GRUB配置生成器生成的GRUB配置文件是否兼容那個版本的GRUB,或者把簡化的配置文件替換成真實的,或者用TinyCore的首選UEFI GRUB版本替換移植版本的GRUB .

如果你想vmlinuz直接從 UEFI 韌體啟動 TinyCore,核心需要用 編譯CONFIG_EFI_STUB=y,然後你需要弄清楚如何處理啟動參數和 initramfs 文件。通過將引導選項配置到 UEFI 引導變數中,我進行了一次這樣的設置。如果沒有引導載入程序,您可能無法在引導時更改引導參數,因此您最好提前生成多個具有不同引導參數的 UEFI 引導變數設置,這樣您就可以訪問例如,如果核心更新出現問題,系統會出現問題。

(如果您的韌體級 UEFI 引導選項包括引導到 UEFI Shell 的方法,那麼它在設置“無引導載入程序”的 UEFI 可引導安裝時非常有用。)

UEFI 引導變數中使用的 UUID 可以通過執行該blkid命令來發現。GRUB 使用文件系統 UUID(=UUID=欄位),而 UEFI 引導變數使用分區的唯一 UUID(=PARTUUID=欄位)。

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