启动加载器

来自 Alpine Linux

启动加载器是一个负责启动计算机的计算机程序。如果它还提供一个包含多个启动选项的交互式菜单,那么它通常被称为启动管理器。本页展示了您需要执行的基本步骤,如果您出于任何原因想要切换启动加载器或应用一些手动配置。

以下启动加载器在 Alpine Linux 中可用。

  • Syslinux 是 Alpine 中使用的默认轻量级启动加载器。
  • rEFInd 是一个易于使用的 EFI 启动菜单,允许启动在可用分区上找到的不同操作系统。
  • GRUB 是一个标准的 Linux 启动加载器。
  • EFI 启动存根 允许直接从支持 UEFI 的主板或其他启动加载器启动 Linux。
  • Gummiboot 可以用于 UEFI 安全启动

rEFInd

对于 (U)EFI 系统,refind 软件包可以提供一个图形化的 EFI 启动菜单,允许启动在可用分区上找到的操作系统。截至目前,refindtesting 仓库中可用。可以按照 指南 安全地安装它。

以下命令安装 alpine-linux rEFInd 软件包

# apk add refind@testing

rEFInd 的 refind-install 脚本创建一个示例文件 /boot/refind_linux.conf

# refind-install

对于大多数情况,上述步骤应该足以开始使用 rEFInd 作为启动加载器。来自 rEFInd 网站的示例 /boot/refind_linux.conf,适用于具有 ext4 文件系统的系统,如下所示

/boot/refind_linux.conf 的内容

"使用标准选项启动" "ro root=UUID=084f544a-7559-4d4b-938a-b920f59edc7e splash=silent quiet showopts " "启动到单用户模式" "ro root=UUID=084f544a-7559-4d4b-938a-b920f59edc7e splash=silent quiet showopts single" "使用最小选项启动" "ro root=UUID=084f544a-7559-4d4b-938a-b920f59edc7e" # 这一行是注释

此示例文件定义了三个条目

  • 第一个条目使用从运行脚本时 /proc/cmdline 的内容派生的选项,除非脚本是从紧急系统运行的,在这种情况下,refind-install 尝试从 /etc/default/grub 中的选项进行转换。
  • 第二个条目提供与第一个条目相同的启动选项,但添加了 single,这会导致大多数发行版启动到单用户维护模式。
  • 最后一个条目从列表中减去大多数选项,仅留下 ro root=rootfs,其中 rootfs 是已识别的根 (/) 文件系统。此选项可能在某些需要不寻常选项的系统上无法启动,但如果它确实启动,它通常会以详细的启动消息执行此操作,这在调试启动问题时可能很有帮助。

下面是 rEFInd 为具有 Btrfs 文件系统的系统自动创建的示例 /boot/refind_linux.conf,其布局在下面作为 blkid 输出给出

/boot/refind_linux.conf 的内容

"使用标准选项启动" "root=LABEL=_SYS0_ modules=sd-mod,usb-storage,btrfs rootflags=subvol=@ resume=LABEL=_SWAP_ ro quiet" "启动到单用户模式" "root=LABEL=_SYS0_ modules=sd-mod,usb-storage,btrfs rootflags=subvol=@ resume=LABEL=_SWAP_ ro quiet single" "使用最小选项启动" "ro root=UUID=aafbf6b0-7d54-4222-a3dd-a8f45c0ac607"

来自 Busyboxblkid 输出如下。

/dev/sda4: LABEL="_SWAP_" UUID="33899521-599f-458e-9bfe-f4b59254eb7c" TYPE="swap" 
/dev/sda3: LABEL="_SYS0_" UUID="aafbf6b0-7d54-4222-a3dd-a8f45c0ac607" TYPE="btrfs"
/dev/sda1: LABEL="_BOOT_" UUID="6771-DB5C" TYPE="vfat" 

根据 u/Xerotras 在 https://redd.it/1hbog74 中的说法,单用户模式和最小选项在 Alpine Linux 中不适用于 Btrfs 文件系统

注意: refind 实用程序当前没有 Alpine Linux 图标文件。您可以将此 图标文件 放置在 /boot/efi/EFI/refind/icons//boot/EFI/refind/icons/ 文件夹中。

仅当重启后 rEFInd 未作为启动加载器出现时,才继续执行手动配置

手动配置

并且需要使用 Alpine 的默认启动参数配置第一个(默认)启动菜单行。假设可启动分区挂载在 /media/sdXY,则可以像这样完成(在编写时)

# echo '"Alpine" "modules=loop,squashfs,sd-mod,usb-storage quiet initrd=\boot\intel-ucode.img initrd=\boot\amd-ucode.img initrd=\boot\initramfs-lts"' > /media/sdXY/boot/refind_linux.conf

注意: 在编写时,仍然需要在 .conf 文件中使用反斜杠。
配置文件中的路径需要相对于内核所在的分区。如果 /boot 位于其自己的单独分区上,则需要从路径中删除 \boot

还有第二个配置文件 refind.conf,它位于 EFI 分区内。该配置文件是不言自明的,必须手动编辑。有关更多信息,请参阅 refind 网站

以下说明假设 esp 分区按如下所示挂载

/etc/fstab 的内容

... UUID=ABCD-1234 /boot/efi vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=utf8,shortname=mixed,errors=remount-ro 0 2 ...

如果您的设置与上述不同,请相应地调整以下文件中的路径。

对于默认的 alpine sys 模式安装,一个用于 双启动 Alpine Linux 和 Windows 的示例 refind.conf 将是

/boot/efi/EFI/refind/refind.conf 的内容

timeout 20 resolution 1920 1080 use_graphics_for windows,linux menuentry "Windows" { loader /EFI/Microsoft/Boot/bootmgfw.efi icon /EFI/refind/icons/os_win.png } menuentry "Alpine Linux" { icon /EFI/refind/icons/os_alpine.png volume ROOT loader /boot/vmlinuz-lts initrd /boot/initramfs-lts options "root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw" }

如果您使用 btrfs 文件系统,对于上述 /etc/fstab 设置,Alpine Linux 的必要启动条目如下

/boot/efi/EFI/refind/refind.conf 的内容

menuentry "Alpine Linux" { icon /EFI/refind/icons/os_alpine.png volume BTRFSVOL loader @alpine/boot/vmlinuz-lts initrd @alpine/boot/initramfs-lts options "root=UUID=823a3283-30a7-4fef-b50b-8a2230c71b5b rw rootflags=subvol=@alpine rootfstype=btrfs" # PARTUUID 不适用于 alpine }
提示: 如果上述配置工作完美,则不需要其他启动加载器,并且可以安全地删除它们。

Syslinux

如果您想从另一个启动加载器切换回 Syslinux,或者如果您出于某种原因想要手动安装 Syslinux,则需要执行以下步骤。

安装 syslinux 软件包

# apk add syslinux

如果您正在使用 GPT 分区,请将 GPT MBR 安装到您想要安装启动加载器的驱动器上(在本例中为 /dev/sda

# dd bs=440 count=1 conv=notrunc if=/usr/share/syslinux/gptmbr.bin of=/dev/sda

或者,如果您正在使用 DOS 分区,请安装 DOS MBR 代替

# dd bs=440 count=1 conv=notrunc if=/usr/share/syslinux/mbr.bin of=/dev/sda


接下来安装所需的 Syslinux 二进制文件。尽管被称为 extlinux,但 Syslinux 支持从 FAT12/16/32、NTFS、ext2/3/4、btrfs、XFS 和 UFS/FFS 文件系统启动。

# extlinux --install /boot

配置文件位于 /boot/extlinux.conf

Alpine 附带一个脚本 update-extlinux,它会自动(重新)生成此文件,例如在更新 Syslinux 时。此脚本的设置可以在 /etc/update-extlinux.conf 中找到,包括禁用自动覆盖 /boot/extlinux.conf 的选项。

您还可以在 /etc/update-extlinux.d/ 目录中放置额外的菜单条目,例如用于双启动。

将 EFI 与 syslinux 结合使用

如果检测到 EFI 模式,Alpine Linux 安装程序会自动使用 Grub。以下部分专门介绍如何将 EFI 与 syslinux 结合使用

假设 /mnt 是 EF00 类型的 FAT32 分区,并且 /boot 属于运行 setup-disk 后创建的 rootfs

# mkdir -p /mnt/EFI/syslinux # cp /usr/share/syslinux/efi64/* /mnt/EFI/syslinux/ # cp /boot/extlinux.conf /mnt/EFI/syslinux/syslinux.cfg # cp /boot/vmlinuz* /mnt/EFI/syslinux/ # cp /boot/initramfs* /mnt/EFI/syslinux/

您可能需要修改 /mnt/EFI/syslinux/syslinux.cfg 以将路径更改为绝对路径(只需在 vmlinuz/initramfs 条目前面添加一个 /),或者将文件复制到 /mnt/EFI/syslinux(XXX:未经测试)。

最后,文件 /mnt/EFI/syslinux/syslinux.cfg 应如下所示

/mnt/EFI/syslinux/syslinux.cfg 的内容

... DEFAULT menu.c32 PROMPT 0 MENU TITLE Alpine/Linux Boot Menu MENU HIDDEN MENU AUTOBOOT Alpine 将在 # 秒后自动启动 TIMEOUT 10 LABEL lts MENU DEFAULT MENU LABEL Linux lts LINUX /vmlinuz-lts INITRD /initrd-lts APPEND root=/dev/sda3 modules=sd-load,usb-storage,ext4 quiet

最后,将 syslinux 添加到 EFI 启动菜单(假设 /dev/sda 是您的硬盘驱动器)

# apk add efibootmgr # efibootmgr -c -d /dev/sda -p 1 -l \\EFI\\syslinux\\syslinux.efi -L "ALPINE-SYSLINUX"

您现在可以验证启动条目是否已添加

efibootmgr

BootCurrent: 0001
Timeout: 0 seconds
BootOrder: 0001,0000,0002,...
Boot001* ALPINE-SYSLINUX HD(1,GPT,xxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)/FILE(\EFI\syslinux\syslinux.efi)

GRUB

要在 BIOS 模式下安装 GRUB,(可选)删除 Syslinux 软件包并安装所需的 GRUB 软件包

# apk del syslinux # apk add grub grub-bios

对于 EFI,请安装 GRUB 的 EFI 软件包。请注意,/boot 必须是 EFI 兼容的文件系统,例如 FAT32。

# apk add grub-efi efibootmgr

接下来,为 BIOS 模式将 MBR 和 GRUB 二进制文件安装到磁盘

# grub-install /dev/vda

对于 EFI 模式

# grub-install --target=x86_64-efi --efi-directory=/boot

然后将此行添加到 /etc/default/grub

/etc/default/grub 的内容

# GRUB_CMDLINE_LINUX_DEFAULT="quiet rootfstype=ext4 modules=sd-mod,usb-storage,ext4"

GRUB 附带一个自动配置生成器,包括对设备上安装的其他操作系统的一些自动检测

# grub-mkconfig -o /boot/grub/grub.cfg

此脚本可以通过 /etc/default/grub 文件进行配置。有关可用选项的列表,请参阅 [1]

EFI 启动存根

要直接从主板的 UEFI 启动菜单启动,需要使用 UEFI shell 或 efibootmgr 创建一个启动条目。

efibootmgr

安装 efibootmgr

# apk add efibootmgr

创建一个启动条目。建议在脚本中执行此操作,因为 efibootmgr 不允许编辑条目。

add-bootentry 的内容

#!/bin/sh params="root=/dev/sdXZ rootfstype=ext4 rw \ initrd=\intel-ucode.img \ initrd=\initramfs-lts" efibootmgr --create --label "Alpine Linux" \ --disk /dev/sdX --part Y \ --loader /vmlinuz-lts \ --unicode "${params}" \ --verbose

其中 /dev/sdXY 包含 EFI 分区,/dev/sdXZ 包含根分区。如果您正在使用 linux-edge,请在脚本中将 lts 替换为 edge

注意:

内核包含指定块设备的 详尽列表。为了获得更强大的启动条目,建议使用持久性名称,例如 PARTUUID。

(可选)将新创建的条目设置为默认条目

# efibootmgr -n XXXX

其中 XXXX 是新条目的启动编号。

注意: 加载器和 initrd 文件参数是相对于 EFI 分区的。在默认安装中,alpine 将这些文件放置在 /boot/ 中,而 EFI 挂载到 /boot/efi/。您可以更新 fstab 以将 EFI 挂载到 /boot/,或者手动将它们复制到 /boot/efi/

使用 UKI

统一内核映像 (UKI) 仅在 UEFI 中受支持。可以直接启动到 UKI 中。UKI 是一个包含 initfs、内核和 cmdline 的单个文件。虽然这通常是为了启用 SecureBoot 而完成的,但完全可以跳过注册自定义密钥并保持 SecureBoot 关闭。

UEFI 安全启动 页面包含设置 UKI 的说明。此外,可以将 UKI 安装在大多数 UEFI 实现使用的默认回退路径中。通过将 UKI 安装到此路径,如果没有定义其他条目,系统将自动启动到其中。这可以通过将以下内容添加到 /etc/kernel-hooks.d/secureboot.conf 来自动化,作为内核钩子的一部分

/etc/kernel-hooks.d/secureboot.conf 的内容

# 对于 edge 内核,将 UKI 安装到默认 UEFI 路径中。 if [ "$1" == "edge" ]; then output_dir="/efi/EFI/Boot/" output_name="bootx64.efi" fi

bootx64.efi 仅适用于 x86_64 系统。对于其他架构,确切的名称会有所不同。

参见