当前位置: 首页>>技术教程>>正文


如何使用Linux创建多重引导USB

, ,

目的

创建包含多个Linux发行版的可启动USB设备。

要求

  • 具有足够大小以容纳多个ISO的USB设备
  • 具有修改设备分区和安装grub的root权限

困难

介质

介绍

能够直接从安装介质运行整个操作系统非常有用:我们可以测试发行版,将其用于备份目的,或者修复现有系统。创建可启动媒体的通常方法是使用以下命令在其上写入系统映像:dd命令或某些专用工具。在本教程中,我们将看到如何创建可以容纳多个分发映像的multiboot usb设备。

关于BIOS vs UEFI

UEFI(统一可扩展固件接口),它是替代旧版固件的现代固件BIOS(基本输入输出系统)。大多数最新的Linux发行版都可以在两种模式下正常启动:安装程序将相应地自动调整其行为。

按照标准,这两种固件与特定的分区表布局相关联:UEFIgpt,而BIOS附带msdos一。但是,这些协会不是严格强制性的,因为至少从理论上讲,UEFI固件可以从msdos磁盘布局和遗留问题BIOS系统可以从gpt分区磁盘。




在前一种情况下EFI分区必须是磁盘上的第一个分区,并使用fat32文件系统,在后者中,bios boot没有任何文件系统的分区应该存在,需要存储grub stage 1.5,因为在gpt布局主引导记录和第一个分区之间的间隙不存在(这是此grub阶段通常安装的位置)。

我们将使用传统的方式准备设备msdos布局,同时在efi和旧版模式下安装grub引导加载程序,以便能够在UEFIBIOS模式。

准备设备

我们要做的第一件事是准备我们的设备。我们将按顺序创建两个分区:

  • 一个EFI划分
  • 数据分区

首先需要启动UEFI模式,因为已安装grub-efi。该分区必须使用fat32文件系统。从理论上讲,该设置甚至只适用于此分区,因为我们也可以使用它来存储我们要使用的分布图像。但是在那种情况下,我们将受到限制,因为fat32不支持大于4GB的文件,某些iso可能会超过此大小。

第二个分区将使用grub支持的文件系统进行格式化,并将托管映像和grub配置文件。

在本教程中,我将假设我们要准备的设备是/dev/sdb

分区表和EFI分区

首先要做的是创建一个msdos设备上的分区表:

$ sudo parted -s /dev/sdb mklabel msdos

完成此步骤后,我们可以创建EFI分区并格式化fat32文件系统。分区的建议大小为550 MiB:在较小的分区上,我们可能会收到错误消息,例如“群集不足以容纳32位FAT”:

$ sudo parted -s /dev/sdb mkpart primary 1MiB 551MiB


然后,我们将继续激活espboot标志:


$ sudo parted -s /dev/sdb set 1 esp on
$ sudo parted -s /dev/sdb set 1 boot on

最后,我们必须创建fat32文件系统:

$ sudo mkfs.fat -F32 /dev/sdb1

数据分区

我们必须创建的另一个分区是数据分区,它将托管发行版的ISO映像和grub配置文件。我们可以根据需要调整分区的大小:分区的大小越大,它可以包含的图像就越多。在这里,我们将使用设备上的所有剩余空间:

$ sudo parted -s /dev/sdb mkpart primary 551MiB 100%

我们可以使用grub支持的文件系统之一来格式化分区。在这种情况下,我将使用ext4

$ sudo mkfs.ext4 /dev/sdb2

创建安装点并安装分区

下一步是安装EFI分区和数据分区在系统中的某个位置,因此我们可以在它们上创建必要的目录,安装grub并将我们的iso文件放在适当的位置:

# Create the mountpoints
$ sudo mkdir /media/{efi,data}

# Mount the EFI partition
$ sudo mount /dev/sdb1 /media/efi

# Mount the data partition
$ sudo mount /dev/sdb2 /media/data

安装grub引导程序

为了使我们的设备在两种情况下都能正常工作legacyUEFI我们需要安装grub和grub的模式efi。在Fedora上称为grub二进制文件grub2并在UEFI设置上生成自定义配置,grub2-efi-modules包装也是必要的。在其他发行版中,二进制文件的名称仅为”grub”:

# Installing legacy grub2
sudo grub2-install \
  --target=i386-pc \
  --recheck \
  --boot-directory="/media/data/boot" /dev/sdb

# Installing grub for efi
sudo grub2-install \
  --target=x86_64-efi \
  --recheck \
  --removable \
  --efi-directory="/media/efi" \
  --boot-directory="/media/data/boot"

如您所见,在两种情况下,我们都使用/media/data/boot作为平头boot-directory。启动上述命令时,将自动创建此目录,并将托管grub配置文件。

复制图像并创建grub.cfg文件

为了在现代linux系统上创建或更新grub配置,我们通常运行grub2-mkconfig命令,或者在基于debian的发行版中update-grubwrapper-script。这些工具会自动执行所需的操作。



但是,在本例中,我们必须动手操作并手动创建配置。并非所有发行版都需要相同的指令,但是这里将看到一些常见的示例。首先,我们应该创建一个目录,其中将包含我们发行版的图像:

$ sudo mkdir /media/data/boot/iso

(可选)我们可能希望拥有此目录的所有权,以便能够更轻松地在其上移动图像。假设一个idgid每1000个我们将运行:

$ sudo chown 1000:1000 /media/data/boot/iso

现在,假设我们想在我们的设置中包括最新的Fedora netinstall映像。首先,我们必须在/media/data/iso目录:


$ wget -O /media/data/boot/iso/Fedora-Workstation-netinst-x86_64-28-1.1.iso \
https://download.fedoraproject.org/pub/fedora/linux/releases/28/Workstation/x86_64/iso/Fedora-Workstation-netinst-x86_64-28-1.1.iso

然后,下载完成后,我们必须在grub.cfg文件在/media/data/boot/grub2目录。由于它是第一个条目,因此我们必须添加文件本身:


menuentry "Fedora-Workstation-netinst-x86_64-28-1.1" {
    isofile="/boot/iso/Fedora-Workstation-netinst-x86_64-28-1.1.iso"
    loopback loop "${isofile}"
    linux (loop)/isolinux/vmlinuz iso-scan/filename="${isofile}" inst.stage2=hd:LABEL=Fedora-WS-dvd-x86_64-28 quiet
    initrd (loop)/isolinux/initrd.img
}

条目结构非常简单:我们定义了isofile变量,以图像的路径作为值。 Grub可以从iso方向引导,这就是loopback该命令适用于:在上面的示例中,文件系统映像将被挂载并在loop设备。

该行以linux包含通往vmlinuz,它是内核可执行文件,以及其他引导指令。其中你可以注意到iso-scan/filename使用指定的路径在磁盘上查找iso映像时需要使用该映像。




最后,以initrd指定initrd的路径。显然,所有这些路径都是相对于循环设备而言的,这就是为什么它们被前缀为(loop)符号。

我们如何知道在特定情况下应该使用的指令?一种方法是将映像挂载到我们系统中的某个位置,然后查看放置在isolinux目录中的文件。但是,已经存在预先编写的配置,并且可以在网上轻松找到。

现在再举一个例子:我们将最新的Ubuntu版本映像添加到可启动设备中:


$ wget http://releases.ubuntu.com/18.10/ubuntu-18.10-desktop-amd64.iso?_ga=2.232120863.1006005768.1540658570-734439277.1540658570 \
-O /media/data/boot/iso/ubuntu-18.10-desktop-amd64.iso

现在,我们将条目添加到配置文件中:


menuentry "Ubuntu 18.10 - Try without installing" {
    isofile="/boot/iso/ubuntu-18.10-desktop-amd64.iso"
    loopback loop "${isofile}"
    linux (loop)/casper/vmlinuz iso-scan/filename="${isofile}" boot=casper quiet splash ---
    initrd (loop)/casper/initrd
}

这是我们的multiboot-menu此时的样子:

Multiboot Grub Menu

Multiboot Grub菜单

总结思想

在本教程中,我们看到了如何创建一个包含许多分布图像的multiboot-usb设备。完成此设置后,我们将能够在UEFI固件的旧版操作系统上引导它们,并从grub菜单中选择要启动的映像。

这里介绍的grub.cfg设置绝对是最小的,可以进一步定制以包括许多其他模块并调整grub超时等其他设置:查阅grub官方文档是开始探索多种可能性的理想方法。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/10660.html,未经允许,请勿转载。