具有安全启动功能的 grub 环回模块

具有安全启动功能的 grub 环回模块

我正在构建一个带有 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
}

就这样吧,我希望有人会觉得它有用。

相关内容