跳转至内容

多重启动 U 盘

来自 ArchWiki

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

使用 GRUB 和回环设备

本文或本节需要在语言、wiki 语法或风格方面进行改进。请参阅 Help:Style 获取参考。

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

优点

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

缺点

  • 并非所有 ISO 镜像都兼容
  • 不会显示 ISO 文件的原始启动菜单
  • 可能很难找到可行的启动条目

准备工作

本文章或章节需要扩充。

原因: 引导加载程序需要多少额外空间?(在 Talk:Multiboot USB drive 中讨论)

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

本文或本节正考虑移除。

原因: 当存在 其他 BIOS/GPT 启动的解决方法 时,没有理由建议糟糕的混合 MBR。(在 Talk:Multiboot USB drive#Section 1.2.2 Hybrid UEFI GPT + BIOS GPT/MBR boot 中讨论)

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

  1. 一个 BIOS 启动分区 (gdisk 类型代码 EF02)。该分区大小必须为 1 MiB
  2. 一个 EFI 系统分区 (gdisk 类型代码 EF00,使用 FAT32 文件系统)。该分区最小可为 50 MiB。
  3. 您的数据分区 (使用 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
提示 有关内核参数的列表,请参阅 内核命令行参数文档。有关更多启动条目示例,请参阅 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 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 驱动器。
https://github.com/thias/glim || 未打包?在 AUR 中搜索
  • liveusb-builder — 一个用于为 GNU/Linux 发行版创建多启动 USB 存储棒的脚本套件
https://github.com/mytbk/liveusb-builder || liveusb-builder-gitAUR
  • MultiOS-USB — 一个极简的开源工具,用于为 ISO/WIM/EFI 文件创建支持安全启动 (Secure Boot) 且对 GRUB2 修改极小的多启动 USB 驱动器。
https://github.com/Mexit/MultiOS-USB || multios-usb-binAUR
  • Ventoy — 一个用于为 ISO/WIM/IMG/VHD(x)/EFI 文件创建多启动 USB 驱动器的工具,支持安全启动,但对其提供的二进制 blob 存在安全性和开源许可 疑虑
https://www.ventoy.net/ || ventoyAUR

参见

GRUB

Syslinux

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.