GRUB2 未加载模块

GRUB2 未加载模块

我正在尝试使用自定义 GRUB2 配置制作自己的 Multiboot-USB 棒。我基本上遵循了https://wiki.archlinux.org/index.php/Multiboot_USB_drive以 EFI 模式在 USB 驱动器上安装 GRUB2:

  • 格式化存储棒,具有一个 EFI 分区(100MB)和一个 EXT4 分区
  • 将分区挂载到某个位置
  • 执行grub-install --target=x86_64-efi --recheck --removable --efi-directory=/EFI_MOUNTPOINT --boot-directory=/DATA_MOUNTPOINT/boot

所以我有一个 EFI 分区,其中包括一个 grub.cfg,就像

search.fs_uuid <uuid> root hdX,gptY 
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg

以及一个只有一个文件夹 /boot/grub 的启动分区,其中包含

  • 字体(文件夹)
  • 区域设置(文件夹)
  • x86_64-efi(文件夹)
  • grubenv(文件)

只要我可以将自己的 grub.cfg 写入 /boot/grub(包含一些菜单项),并且我可以从该条目启动,此方法就可以正常工作。但我无法加载任何模块。如果我输入命令行,例如输入

insmod ntfs

什么都没做。没有任何错误消息或其他东西,模块只是没有加载(使用 lsmod 检查)。我还尝试了绝对寻址,例如

insmod (hdX,gptY)/boot/grub/x86_64-efi/ntfs.mod

结果相同。路径是正确的,因为例如我可以将 .mod 文件 cat 到标准输出。

我实际上能做的是删除模块。例如

rmmod btrfs
rmmod btrfs

导致第二行出现错误消息,因此模块 btrfs 被删除,lsmod 输出证实了这一点。但输入(当 btrfs 已被删除时)

insmod btrfs (or absolute addressing like above)
rmmod btrfs

导致第 2 行出现错误消息,因此第一行显然没有效果。

你知道哪里出了问题吗?我甚至尝试将 mod 文件夹复制到 EFI 分区,但没有成功……

提前致谢

答案1

我尝试了几种不同的“多启动 USB”选项。我喜欢这个,因为它是动态的,你只需添加 ISO 文件,它就会找到新的 ISO 文件并将其添加到菜单中。无需配置 GRUB 菜单。我在使用 Linux Mint Debian Edition 3 时遇到了麻烦,但这个却可以正常工作。你可以随时查看他的脚本来了解它的工作原理。

祝你好运。

网站如下:

https://github.com/mpolitzer/grub-iso-multiboot

答案2

好的,我刚刚发现这是由安全启动引起的。根据https://forums.opensuse.org/showthread.php/531587-is-GRUB-deliberately-broken-in-openSUSE

如果启用了安全启动,则 grub2-efi 会在内部禁用“insmod”,以防止违反安全启动。并且“grub2”已从 EFI 分区中的“grub.efi”加载,该分区已预加载通常需要的模块。此外,如果启用了安全启动,则不允许使用“linux”——必须使用“linuxefi”(检查签名)。

grub-install --help 的结果

--no-uefi-secure-boot:不安装可用于 UEFI 安全启动的映像,即使系统当前已使用它启动。此选项仅在 EFI 上可用。

因此,如果您当前的计算机是用安全启动启动的,那么 grub-install 会安装该版本的 GRUB,并且您无法插入任何模块。奇怪的是,在我的情况下,GRUB 加载了模块“linux”,但没有加载模块“linuxefi”。无论如何,这是我更新后的设置:

  • 格式化记忆棒,有一个 EFI 分区(100MB)和一个 EXT4 分区(作为与 GRUB 无关的所有内容的数据分区)
  • 挂载 EFI 分区
  • 执行grub-install --target=x86_64-efi --recheck --removable --no-uefi-secure-boot --efi-directory=/EFI_MOUNTPOINT --boot-directory=/EFI_MOUNTPOINT/boot

我无法禁用机器上的安全启动,但可以将 .efi 文件标记为安全。使用该设置(并在计算机 EFI 中将 /EFI/BOOT/BOOTX64.EFI 标记为安全)对我来说很有效,GRUB 现在完全可以正常工作。--boot-directory=/DATA_MOUNTPOINT/boot在我的原始设置中使用类似设置会导致 GRUB 崩溃并进入救援模式。

考虑到如今安全启动有多么普遍,我发现整个 GRUB2 手册中没有提到这种行为,这很烦人。

答案3

您可以使用超级 UEFI 安全启动盘这是专门为这种情况设计的。它包含经过修改的引导加载程序,不仅可以在安全启动模式下加载模块,还可以劫持文件验证功能来加载任意不受信任的 EFI 文件。

相关内容