Multiboot USB 驱动器

来自 ArchWiki

多启动 USB 闪存驱动器允许从单个设备启动多个 ISO 文件。ISO 文件可以复制到设备并直接启动,而无需先解压缩它们。有多种方法可用,但它们可能不适用于所有 ISO 镜像。

使用 GRUB 和 loopback 设备

本文或章节需要改进语言、wiki 语法或风格。参阅 Help:Style 以获得参考。

原因: 多个 style 问题(在 Talk:Multiboot USB drive 中讨论)

优点

  • 仅需要单个分区
  • 所有 ISO 文件都位于一个目录中
  • 添加和删除 ISO 文件很简单

缺点

  • 并非所有 ISO 镜像都兼容
  • ISO 文件的原始启动菜单未显示
  • 可能难以找到可用的启动项

准备工作

本文或章节需要扩充。

原因: 启动加载器需要多少额外空间?(在 Talk:Multiboot USB drive 中讨论)

在 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 启动

本文或章节正在考虑移除。

原因:用于 BIOS/GPT 启动的其他解决方法 存在时,没有理由建议使用可憎的混合 MBR。(在 Talk:Multiboot USB drive 中讨论)

此配置对于创建可在任何地方启动的通用 USB 密钥很有用。首先,您必须在设备上创建 GPT 分区表。您至少需要 3 个分区

  1. BIOS 启动分区(gdisk 类型代码 EF02)。此分区大小必须为 1 MiB
  2. EFI 系统分区(gdisk 类型代码 EF00,带有 FAT32 文件系统)。此分区可以小至 50 MiB。
  3. 您的数据分区(使用 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
提示: 有关内核参数的列表,请参阅 内核的命令行参数文档。有关启动项的更多示例,请参阅 GRUB 上游文档 或您要启动的发行版的文档。

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 驱动器。
https://github.com/thias/glim || 未打包? 在 AUR 中搜索
  • liveusb-builder — 用于为 GNU/Linux 发行版创建多启动 USB 棒的脚本套件
https://github.com/mytbk/liveusb-builder || liveusb-builder-gitAUR
  • MultiBootUSB — 一款跨平台 Python 软件,具有 CLI 和 GUI 界面,可让您在 USB 棒上安装和删除多个 Live Linux 镜像。
https://github.com/mbusb/multibootusb || multibootusbAUR
  • Ventoy — 一款开源工具,用于为 ISO/WIM/IMG/VHD(x)/EFI 文件创建可启动 USB 驱动器。您无需一遍又一遍地格式化磁盘,只需将文件复制到 USB 驱动器并直接启动它们即可。
https://www.ventoy.net/ || ventoy-binAUR

参见