Multiboot USB 驱动器
多启动 USB 闪存驱动器允许从单个设备启动多个 ISO 文件。ISO 文件可以复制到设备并直接启动,而无需先解压缩它们。有多种方法可用,但它们可能不适用于所有 ISO 镜像。
使用 GRUB 和 loopback 设备
优点
- 仅需要单个分区
- 所有 ISO 文件都位于一个目录中
- 添加和删除 ISO 文件很简单
缺点
- 并非所有 ISO 镜像都兼容
- ISO 文件的原始启动菜单未显示
- 可能难以找到可用的启动项
准备工作
在 USB 驱动器上创建至少一个分区和一个 GRUB 支持的文件系统。参见 分区 和 文件系统#创建文件系统。根据您要存储在驱动器上的 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,分区必须是 MBR 分区表中的第一个分区,并使用 FAT32 格式化。
混合 UEFI GPT + BIOS GPT/MBR 启动
此配置对于创建可在任何地方启动的通用 USB 密钥很有用。首先,您必须在设备上创建 GPT 分区表。您至少需要 3 个分区
- BIOS 启动分区(gdisk 类型代码
EF02
)。此分区大小必须为 1 MiB - EFI 系统分区(gdisk 类型代码
EF00
,带有 FAT32 文件系统)。此分区可以小至 50 MiB。 - 您的数据分区(使用 GRUB 支持的文件系统)。此分区可以占用驱动器的剩余空间。
接下来,您必须创建 混合 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"
或者,使用设备标签而不是 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 系统。
安装 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 棒的脚本套件
- MultiBootUSB — 一款跨平台 Python 软件,具有 CLI 和 GUI 界面,可让您在 USB 棒上安装和删除多个 Live Linux 镜像。
- Ventoy — 一款开源工具,用于为 ISO/WIM/IMG/VHD(x)/EFI 文件创建可启动 USB 驱动器。您无需一遍又一遍地格式化磁盘,只需将文件复制到 USB 驱动器并直接启动它们即可。
参见
- GRUB
- Syslinux