我正在构建一个带有 ubuntu 衍生产品的多启动 usb 棒。我遵循了在线找到的几个教程:本质上,您将 iso 放在 usb 棒上,然后使用安装在该棒上的 grub 启动它们。
但是,我遇到了以下问题:我的硬盘在启用安全启动的情况下也应该可以工作。但是,我需要回环 grub 模块来启动 iso,而当我在启用安全启动的情况下启动时,安全启动禁止 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
}
就这样吧,我希望有人会觉得它有用。