如何让 GRUB 在多重引导 Linux LiveUSB 上找到模块?

如何让 GRUB 在多重引导 Linux LiveUSB 上找到模块?

背景

(跳到标题=problem 如果您是 LiveUSB、ISO、GRUB2 等领域的专家)

我正在设置多重引导/多重 ISO Linux LiveUSB,详细信息这里,我打算在多个主机上使用(即,我决定需要启动的任意 PC)。这个过程看起来很简单:

  1. 设置您的开发主机:即,您将用于创建 LiveUSB 的盒子,而不是您将使用 LiveUSB 启动的盒子。
  2. 获取/制作一个 USB 驱动器
    1. 对于您想要启动的所有 ISO 来说足够大
    2. 是可启动的
    3. 已安装GRUB2
  3. 将所需的 ISO 放在其上易于指定的位置。
  4. 编辑/boot/grub/grub.cfg
    1. 设置全局变量@top(即menuentrys上方),esproot
    2. menuentry为每个 ISO创建一个或多个s。

主要问题是,对于每个 ISO,创建一个或多个menuentry能够正确启动它的文件。这看起来很简单:

  1. 安装 ISO:
    1. 检查 ISO 的结构。获取其grub.cfginitrd*vmlinuz(或任何它所称的 GRUB 配置、初始 RAMdisk 映像和内核映像)的路径
    2. 从 ISO 复制到grub.cfg您的menuentry
  2. 使每个menuentry
    1. 设置 ISO 的启动路径
    2. loopback使用 ISO创建设备
    3. 使用环回设备的路径而不是 ISO 中给出的路径grub.cfg,例如
      1. initrd /casper/initrd.lz->initrd (loop)/casper/initrd.lz
      2. linux /live/vmlinuz->linux (loop)/live/vmlinuz
  3. 测试您的 LiveUSB:
    1. 当仍然安装在您的开发主机上时:grub-script-check为了心理健康:-)
    2. umount来自您的开发主机
    3. 对于每个测试主机:
      1. 连接到断电的测试主机
      2. 开机!

问题

许多 ISO 都grub.cfg希望在“真正”启动之前配置视频。它们的做法都略有不同,因此我将每个 ISO 的视频代码放入其menuentry(s) 中。然而,到目前为止我使用过的 ISOgrub.cfg似乎或多或少是这样的:

if loadfont /path/to/font/file ; then
  set gfxmode=auto
  insmod efi_gop
  insmod efi_uga
  insmod gfxterm
  terminal_output gfxterm
fi
# usually followed by more menu and background tweaking

好消息是,我确定字体文件的启动时路径——即,我可以loadfont高兴。坏消息是,一旦进入if街区,

  • 仅加载其中 1 个模块。
  • 我在使用 Casper(例如,基于 Ubuntu 的 Mint、LMDE1)或 Debian Live(例如,Clonezilla、LMDE2)的 ISO 上也遇到同样的问题。

如何让 GRUB 找到全部模块?

示例代码

请注意,Clonezilla 的 in-ISO/boot/grub/grub.cfg仅转发至其/EFI/boot/grub.cfg

# This file is for compatibility to Ubuntu Linux's uEFI secure boot. 
# The real config file for grub is /EFI/boot/grub.cfg.
configfile /EFI/boot/grub.cfg

我的 LiveUSB /boot/grub/grub.cfg(在所有 ISO 之外)包含如下代码

# isofile_abspath==path to the ISO from the root of my LiveUSB.
set isofile_abspath='/ISOs/clonezilla-live-2.4.2-10-amd64.iso'
set root=(hd0,1)
loopback loop ($root)$isofile_abspath
...
set clonezilla_prefix='(loop)/EFI/boot'
...
set loadfont_fp="$clonezilla_prefix/unicode.pf2"
echo -e "About to 'loadfont $loadfont_fp' ..."
if loadfont "$loadfont_fp" ; then
  set gfxmode=auto
  echo -e 'about to `insmod efi_gop` ...'
  insmod efi_gop
  echo -e 'about to `insmod efi_uga` ...'
  insmod efi_uga
  echo -e 'about to `insmod gfxterm` ...'
  insmod gfxterm
  echo -e 'about to `terminal_output gfxterm` ...'
  terminal_output gfxterm
fi
echo -e 'Done loadfont.'

启动时的结果:

About to 'loadfont (loop)/EFI/boot/unicode.pf2' ...
about to `insmod efi_gop` ...
error: file not found.
about to `insmod efi_uga` ...
error: file not found.
about to `insmod gfxterm` ...
about to `terminal_output gfxterm` ...
error: no suitable mode found
Done loadfont.

相关内容