多重启动 U 盘
多启动 USB 闪存驱动器允许从单个设备启动多个 ISO 文件。ISO 文件可以直接复制到设备中并启动,而无需预先解压。虽然有多种可用方法,但它们可能并不适用于所有 ISO 镜像。
使用 GRUB 和回环设备
优点
- 仅需要单个分区
- 所有 ISO 文件都位于一个目录中
- 添加和删除 ISO 文件非常简单
缺点
- 并非所有 ISO 镜像都兼容
- 不会显示 ISO 文件的原始启动菜单
- 可能很难找到可行的启动条目
准备工作
在 USB 驱动器上创建至少一个分区以及 GRUB 支持的文件系统。请参阅 分区 (Partitioning) 和 文件系统#创建文件系统。根据您想要存储在驱动器上的 ISO 文件总大小选择分区大小,并为 引导加载程序预留额外空间。
安装 GRUB
简单安装
挂载 USB 驱动器上的文件系统
# mount /dev/sdXY /mnt
创建 /boot 目录
# mkdir /mnt/boot
在 USB 驱动器上安装 GRUB
# grub-install --target=i386-pc --recheck --boot-directory=/mnt/boot /dev/sdX
如果您希望在 UEFI 模式下启动 ISO,则必须为 UEFI 目标安装 grub
# grub-install --target=x86_64-efi --removable --boot-directory=/mnt/boot --efi-directory=/mnt
对于 UEFI,该分区必须是分区表中的第一个分区并格式化为 FAT32;为了确保与传统 BIOS 的兼容性,必须使用 MBR 分区表而非 GPT。
混合 UEFI GPT + BIOS GPT/MBR 启动
此配置适用于创建可在任何地方启动的通用 USB 密钥。首先,您必须在设备上创建 GPT 分区表。您至少需要 3 个分区
- 一个 BIOS 启动分区 (gdisk 类型代码
EF02)。该分区大小必须为 1 MiB - 一个 EFI 系统分区 (gdisk 类型代码
EF00,使用 FAT32 文件系统)。该分区最小可为 50 MiB。 - 您的数据分区 (使用 GRUB 支持的文件系统)。该分区可以占用驱动器的其余空间。
接下来,您必须创建 混合 MBR (hybrid MBR) 分区表。否则,基于 BIOS MBR 的系统将无法启动,因为它找不到预期的分区。
使用 gdisk 创建混合 MBR 分区表的示例
# gdisk /dev/sdX
Command (? for help): r Recovery/transformation command (? for help): h WARNING! Hybrid MBRs are flaky and dangerous! If you decide not to use one, just hit the Enter key at the below prompt and your MBR partition table will be untouched. Type from one to three GPT partition numbers, separated by spaces, to be added to the hybrid MBR, in sequence: 1 2 3 Place EFI GPT (0xEE) partition first in MBR (good for GRUB)? (Y/N): N Creating entry for GPT partition #1 (MBR partition #1) Enter an MBR hex code (default EF): Set the bootable flag? (Y/N): N Creating entry for GPT partition #2 (MBR partition #2) Enter an MBR hex code (default EF): Set the bootable flag? (Y/N): N Creating entry for GPT partition #3 (MBR partition #3) Enter an MBR hex code (default 83): Set the bootable flag? (Y/N): Y Recovery/transformation command (? for help): x Expert command (? for help): h Expert command (? for help): w Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!! Do you want to proceed? (Y/N): Y
不要忘记格式化分区
# mkfs.fat -F32 /dev/sdX2 # mkfs.ext4 /dev/sdX3
您现在可以安装 GRUB 以同时支持 EFI + GPT 和 BIOS + GPT/MBR。GRUB 配置 (--boot-directory) 可以保存在同一个位置。
首先,您需要挂载 USB 驱动器的 EFI 系统分区和数据分区。
示例操作如下
# mount /dev/sdX3 /mnt # mkdir /mnt/boot /mnt/efi # mount /dev/sdX2 /mnt/efi
然后,您可以使用以下命令安装 UEFI 版本的 GRUB
在大多数情况下,EFI_MOUNTPOINT 将对应于挂载的 USB 磁盘上的 /mnt/efi 目录。DATA_MOUNTPOINT 是数据分区的挂载点。在本例中,它是 sdX3 的挂载点 /mnt。
# grub-install --target=x86_64-efi --recheck --removable --efi-directory=/EFI_MOUNTPOINT --boot-directory=/DATA_MOUNTPOINT/boot
对于 BIOS,使用以下命令
# grub-install --target=i386-pc --recheck --boot-directory=/DATA_MOUNTPOINT/boot /dev/sdX
作为额外的备选方案,您也可以将 GRUB 安装在可由 MBR 启动的数据分区上
# grub-install --target=i386-pc --recheck --boot-directory=/DATA_MOUNTPOINT/boot /dev/sdX3
配置 GRUB
使用模板
有一些 git 项目提供了预先存在的 GRUB 配置文件,以及一个优秀的通用 grub.cfg,可用于根据需要加载其他启动条目,仅在驱动器上存在指定的 ISO 文件或包含它们的文件夹时才显示它们。
Multiboot USB: https://github.com/hackerncoder/multibootusb
GLIM (GRUB2 Live ISO Multiboot): https://github.com/thias/glim
手动配置
对于多启动 USB 驱动器,手动编辑 grub.cfg 比生成它更容易。或者,在 /etc/grub.d/40_custom 或 /mnt/boot/grub/custom.cfg 中进行以下更改,并使用 grub-mkconfig 生成 /mnt/boot/grub/grub.cfg。
建议使用 持久化设备名称 而不是 /dev/sdxY 来标识 USB 驱动器上存放镜像文件的分区,为了方便,请定义一个变量来保存该值。如果 ISO 镜像与 GRUB 在同一个分区,请使用以下内容在启动时读取 UUID
/mnt/boot/grub/grub.cfg
# path to the partition holding ISO images (using UUID) probe -u $root --set=rootuuid set imgdevpath="/dev/disk/by-uuid/$rootuuid"
或显式指定 UUID
/mnt/boot/grub/grub.cfg
# path to the partition holding ISO images (using UUID) set imgdevpath="/dev/disk/by-uuid/UUID_value"
或者使用设备标签 (label) 代替 UUID
/mnt/boot/grub/grub.cfg
# path to the partition holding ISO images (using labels) set imgdevpath="/dev/disk/by-label/label_value"
必要的 UUID 或标签可以使用 lsblk -f 找到。不要为 USB 设备使用与 Arch ISO 相同的标签,否则启动过程将失败。
要完成配置,必须在该标题下方为每个 ISO 镜像添加一个启动条目,示例请参阅下一节。
启动条目
假设 ISO 镜像存储在安装 GRUB 的同一文件系统的 /boot-isos 目录中。否则,在使用 loopback 命令时,需要在 ISO 文件路径前加上设备标识,例如 loopback loop (hd1,2)$iso_path。由于这种设备标识不是 持久的,因此在本节的示例中不使用它。
可以使用持久化块设备命名,如下所示。请根据您的 ISO 文件系统 UUID 替换 UUID。
# define globally (i.e outside any menuentry) insmod search_fs_uuid search --no-floppy --set=isopart --fs-uuid 123-456 # later use inside each menuentry instead loopback loop ($isopart)$iso_path
Arch Linux 月度发行版
该 ISO 提供了一个 loopback.cfg,您可以使用如下条目来利用它。
menuentry '[loopback]archlinux-2023.10.14-x86_64.iso' {
set iso_path='/boot-isos/archlinux-2023.10.14-x86_64.iso'
export iso_path
search --set=root --file "$iso_path"
loopback loop "$iso_path"
root=(loop)
configfile /boot/grub/loopback.cfg
loopback --delete loop
}
另请参阅 archiso。
MemTest86+
MemTest86+ 已包含在月度 ISO 中。
menuentry '[loopback]archlinux-2023.03.01-x86_64.iso MemTest86+' {
set iso_path='/boot-isos/archlinux-2023.03.01-x86_64.iso'
loopback loop $iso_path
linux (loop)/boot/memtest86+/memtest.efi
}
Archboot
请参阅 Archboot 主页。
menuentry '[loopback]archlinux-2014.11-1-archboot' {
set iso_path='/boot-isos/archlinux-2014.11-1-archboot.iso'
loopback loop $iso_path
linux (loop)/boot/vmlinuz_x86_64 iso_loop_dev=$imgdevpath iso_loop_path=$iso_path
initrd (loop)/boot/initramfs_x86_64.img
}
使用 Syslinux 和 memdisk
通过使用 memdisk 模块,ISO 镜像被加载到内存中,随后加载其 引导加载程序。请确保启动此 USB 驱动器的系统有足够的内存来容纳镜像文件并运行操作系统。
准备工作
确保 USB 驱动器已正确 分区,并且有一个使用 Syslinux 支持的 文件系统 的分区,例如 fat32 或 ext4。然后将 Syslinux 安装到该分区,请参阅 Syslinux#BIOS systems。
安装 memdisk 模块
memdisk 模块在安装 Syslinux 时不会被安装,必须手动安装。将安装了 Syslinux 的分区挂载到 /mnt/,然后将 memdisk 模块复制到 Syslinux 安装的相同目录中
# cp /usr/lib/syslinux/bios/memdisk /mnt/boot/syslinux/
配置
将 ISO 文件复制到 USB 驱动器后,编辑 Syslinux 配置文件 并为 ISO 镜像创建菜单条目。基本条目如下所示
boot/syslinux/syslinux.cfg
LABEL some_label
LINUX memdisk
INITRD /path/to/image.iso
APPEND iso
有关更多配置选项,请参阅 Syslinux wiki 上的 memdisk。
自动化工具
- GRUB2 Live ISO Multiboot (GLIM) — 一组 GRUB 配置文件,可将包含 GNU/Linux 发行版 ISO 镜像的 VFAT 格式 USB 存储棒转换为多启动 USB 驱动器。
- liveusb-builder — 一个用于为 GNU/Linux 发行版创建多启动 USB 存储棒的脚本套件
- MultiOS-USB — 一个极简的开源工具,用于为 ISO/WIM/EFI 文件创建支持安全启动 (Secure Boot) 且对 GRUB2 修改极小的多启动 USB 驱动器。
参见
GRUB
- https://help.ubuntu.com/community/Grub2/ISOBoot/Examples
- https://help.ubuntu.com/community/Grub2/ISOBoot
Syslinux