背景
(跳到标题=problem
如果您是 LiveUSB、ISO、GRUB2 等领域的专家)
我正在设置多重引导/多重 ISO Linux LiveUSB,详细信息这里,我打算在多个主机上使用(即,我决定需要启动的任意 PC)。这个过程看起来很简单:
- 设置您的开发主机:即,您将用于创建 LiveUSB 的盒子,而不是您将使用 LiveUSB 启动的盒子。
- 获取/制作一个 USB 驱动器
- 对于您想要启动的所有 ISO 来说足够大
- 是可启动的
- 有已安装GRUB2
- 将所需的 ISO 放在其上易于指定的位置。
- 编辑
/boot/grub/grub.cfg
:- 设置全局变量@top(即
menuentry
s上方),esproot
menuentry
为每个 ISO创建一个或多个s。
- 设置全局变量@top(即
主要问题是,对于每个 ISO,创建一个或多个menuentry
能够正确启动它的文件。这看起来很简单:
- 安装 ISO:
- 检查 ISO 的结构。获取其
grub.cfg
、initrd*
、vmlinuz
(或任何它所称的 GRUB 配置、初始 RAMdisk 映像和内核映像)的路径 - 从 ISO 复制到
grub.cfg
您的menuentry
- 检查 ISO 的结构。获取其
- 使每个
menuentry
- 设置 ISO 的启动路径
loopback
使用 ISO创建设备- 使用环回设备的路径而不是 ISO 中给出的路径
grub.cfg
,例如initrd /casper/initrd.lz
->initrd (loop)/casper/initrd.lz
linux /live/vmlinuz
->linux (loop)/live/vmlinuz
- 测试您的 LiveUSB:
- 当仍然安装在您的开发主机上时:
grub-script-check
为了心理健康:-) umount
来自您的开发主机- 对于每个测试主机:
- 连接到断电的测试主机
- 开机!
- 当仍然安装在您的开发主机上时:
问题
许多 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.