目的
创建包含多个Linux发行版的可启动USB设备。
要求
- 具有足够大小以容纳多个ISO的USB设备
- 具有修改设备分区和安装grub的root权限
困难
介质
介绍
能够直接从安装介质运行整个操作系统非常有用:我们可以测试发行版,将其用于备份目的,或者修复现有系统。创建可启动媒体的通常方法是使用以下命令在其上写入系统映像:dd
命令或某些专用工具。在本教程中,我们将看到如何创建可以容纳多个分发映像的multiboot usb设备。
关于BIOS vs UEFI
UEFI
(统一可扩展固件接口),它是替代旧版固件的现代固件BIOS
(基本输入输出系统)。大多数最新的Linux发行版都可以在两种模式下正常启动:安装程序将相应地自动调整其行为。
按照标准,这两种固件与特定的分区表布局相关联:UEFI
与gpt
,而BIOS
附带msdos
一。但是,这些协会不是严格强制性的,因为至少从理论上讲,UEFI
固件可以从msdos
磁盘布局和遗留问题BIOS
系统可以从gpt
分区磁盘。
在前一种情况下EFI
分区必须是磁盘上的第一个分区,并使用fat32
文件系统,在后者中,bios boot
没有任何文件系统的分区应该存在,需要存储grub stage 1.5,因为在gpt
布局主引导记录和第一个分区之间的间隙不存在(这是此grub阶段通常安装的位置)。
我们将使用传统的方式准备设备msdos
布局,同时在efi和旧版模式下安装grub引导加载程序,以便能够在UEFI
和BIOS
模式。
准备设备
我们要做的第一件事是准备我们的设备。我们将按顺序创建两个分区:
- 一个
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
然后,我们将继续激活esp
和boot
标志:
$ 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引导程序
为了使我们的设备在两种情况下都能正常工作legacy
和UEFI
我们需要安装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-grub
wrapper-script。这些工具会自动执行所需的操作。
但是,在本例中,我们必须动手操作并手动创建配置。并非所有发行版都需要相同的指令,但是这里将看到一些常见的示例。首先,我们应该创建一个目录,其中将包含我们发行版的图像:
$ sudo mkdir /media/data/boot/iso
(可选)我们可能希望拥有此目录的所有权,以便能够更轻松地在其上移动图像。假设一个id
和gid
每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-usb设备。完成此设置后,我们将能够在UEFI固件的旧版操作系统上引导它们,并从grub菜单中选择要启动的映像。
这里介绍的grub.cfg设置绝对是最小的,可以进一步定制以包括许多其他模块并调整grub超时等其他设置:查阅grub官方文档是开始探索多种可能性的理想方法。