具有安全啟動功能的 grub 環回模組

具有安全啟動功能的 grub 環回模組

我正在用 ubuntu 衍生品建立一個多啟動 USB 棒。我遵循了網路上找到的幾個教學:本質上,您將 isos 放在 USB 隨身碟上,然後使用安裝在 USB 隨身碟上的 grub 啟動它們。

但是,我有以下問題:我的棒子也應該在安全啟動打開的情況下工作。但是,我需要環回 grub 模組來引導 isos,並且當我在啟用安全引導的情況下引導時,安全引導會禁止 grub 載入環回模組。所以,我無法啟動

有人能夠在啟用安全啟動的情況下從 grub 啟動 iso 嗎?

謝謝

瓦萊裡奧

答案1

我目前正在努力解決這個問題。

看起來 ubuntu 的 grub 已被明確修補以防止在安全啟動期間載入模組。錯誤訊息有點沒有幫助:當錯誤發生時,無論正在載入哪個模組,它都會混淆地引用檔案名稱:

apt-get source grub-common
   ...
grep -C 10 "Secure Boot forbids" -r .
   ...
#ifdef GRUB_MACHINE_EFI
  if (grub_efi_secure_boot ())
    {
      grub_error (GRUB_ERR_ACCESS_DENIED,
                  "Secure Boot forbids loading module from %s", filename);
      return 0;
    }
#endif
...

添加此內容的補丁是 ./debian/patches/no_insmod_on_sb.patch

您最好的選擇可能是重建 grub,或者硬編碼環回支援或允許加載模組,或者您可以在從 USB 引導時停用安全引導(因為這往往是相當罕見的活動)。

允許 grub 加載模組的安全隱患相當複雜,所以我將避免對它們發表評論,因為有人會立即告訴我我錯了,我們將不得不爭論。

答案2

看來目前版本的已簽名 grub 映像(至少是我測試過的 Ubuntu 20.04 附帶的版本)包含該loopback模組,因此無需加載/插入它。事實上,正如上面答案中已經指出的那樣,這是不可能的。我發布了我用來創建外部驅動器的配置,該驅動器可以啟動 Ubuntu 安裝/實時環境和 Windows 10 安裝。

我最終使用了幾個分割區 - 一個 512MB EFI、20GB NTFS 用於解壓縮的 Windows 文件,一個大的 FAT32 分割區用於其他所有內容,包括 Ubuntu ISO。由於 Windows 現在包含大於 4GB 的安裝文件,因此需要 NTFS 檔案系統。我認為目前簽署的 grub 映像不包含 exfat 模組,因此 NTFS 是這裡唯一的選擇。附帶說明一下,解壓縮後的 Windows 檔案必須駐留在分割區根目錄中,將它們放在子目錄中對我來說不起作用。

以下是我用於將 grub 安裝到 EFI 分割區的設定:

sudo grub-install \
--boot-directory=[EFI mount point]/boot \
--efi-directory=[EFI mount point] \
--uefi-secure-boot \
--removable \
--target=x86_64-efi \
--no-bootsector \
/dev/sdaX

這是grub.cfg文件(我認為第一個選單條目上方的行是多餘的,但這是我使用的實際配置):

search --no-floppy --set=root --fs-uuid [UUID of EFI partition]
set prefix=($root)'/boot/grub'
configfile $root/EFI/BOOT/grub.cfg

set menu_color_normal=white/black
set menu_color_highlight=black/light-gray

menuentry 'Ubuntu 20.04.1' --class ubuntu --class gnu-linux --class gnu --class os {        
    set isodir='/images/ubuntu'
    set isoname='ubuntu-20.04.1-desktop-amd64.iso'
    set isofile=$isodir/$isoname
    
    search --no-floppy --set=isodev --fs-uuid [UUID of FAT32 partition]

    loopback loop0 ($isodev)/$isofile
    linux (loop0)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet splash
    initrd (loop0)/casper/initrd
}

menuentry 'Windows 20H2' {
    set efi_path=/efi/boot/bootx64.efi
    
    search --no-floppy --set=windev --fs-uuid [UUID of NTFS partition]
    chainloader ($windev)/$efi_path
}

menuentry 'UEFI Firmware Settings' {
    fwsetup
}

僅此而已,我希望有人覺得它有用。

相關內容