
我正在用 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
}
僅此而已,我希望有人覺得它有用。