启动加载器
启动加载器是一个负责启动计算机的计算机程序。如果它还提供一个包含多个启动选项的交互式菜单,那么它通常被称为启动管理器。本页展示了您需要执行的基本步骤,如果您出于任何原因想要切换启动加载器或应用一些手动配置。
以下启动加载器在 Alpine Linux 中可用。
Syslinux
是 Alpine 中使用的默认轻量级启动加载器。rEFInd
是一个易于使用的 EFI 启动菜单,允许启动在可用分区上找到的不同操作系统。GRUB
是一个标准的 Linux 启动加载器。EFI 启动存根
允许直接从支持 UEFI 的主板或其他启动加载器启动 Linux。- Gummiboot 可以用于 UEFI 安全启动。
rEFInd
对于 (U)EFI 系统,refind 软件包可以提供一个图形化的 EFI 启动菜单,允许启动在可用分区上找到的操作系统。截至目前,refind 在 testing 仓库中可用。可以按照 指南 安全地安装它。
以下命令安装 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 的内容
此示例文件定义了三个条目
- 第一个条目使用从运行脚本时 /proc/cmdline 的内容派生的选项,除非脚本是从紧急系统运行的,在这种情况下,refind-install 尝试从 /etc/default/grub 中的选项进行转换。
- 第二个条目提供与第一个条目相同的启动选项,但添加了 single,这会导致大多数发行版启动到单用户维护模式。
- 最后一个条目从列表中减去大多数选项,仅留下 ro root=rootfs,其中 rootfs 是已识别的根 (/) 文件系统。此选项可能在某些需要不寻常选项的系统上无法启动,但如果它确实启动,它通常会以详细的启动消息执行此操作,这在调试启动问题时可能很有帮助。
下面是 rEFInd 为具有 Btrfs 文件系统的系统自动创建的示例 /boot/refind_linux.conf,其布局在下面作为 blkid
输出给出
/boot/refind_linux.conf 的内容
来自 Busybox 的 blkid
输出如下。
/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 的默认启动参数配置第一个(默认)启动菜单行。假设可启动分区挂载在 /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
配置文件中的路径需要相对于内核所在的分区。如果 /boot 位于其自己的单独分区上,则需要从路径中删除
\boot
。还有第二个配置文件 refind.conf,它位于 EFI 分区内。该配置文件是不言自明的,必须手动编辑。有关更多信息,请参阅 refind 网站。
以下说明假设 esp 分区按如下所示挂载
/etc/fstab 的内容
如果您的设置与上述不同,请相应地调整以下文件中的路径。
对于默认的 alpine sys 模式安装,一个用于 双启动 Alpine Linux 和 Windows 的示例 refind.conf 将是
/boot/efi/EFI/refind/refind.conf 的内容
如果您使用 btrfs 文件系统,对于上述 /etc/fstab 设置,Alpine Linux 的必要启动条目如下
/boot/efi/EFI/refind/refind.conf 的内容
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 的内容
最后,将 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 附带一个自动配置生成器,包括对设备上安装的其他操作系统的一些自动检测
# grub-mkconfig -o /boot/grub/grub.cfg
此脚本可以通过 /etc/default/grub 文件进行配置。有关可用选项的列表,请参阅 [1]。
EFI 启动存根
要直接从主板的 UEFI 启动菜单启动,需要使用 UEFI shell 或 efibootmgr 创建一个启动条目。
efibootmgr
安装 efibootmgr
# apk add efibootmgr
创建一个启动条目。建议在脚本中执行此操作,因为 efibootmgr 不允许编辑条目。
add-bootentry 的内容
其中 /dev/sdXY 包含 EFI 分区,/dev/sdXZ 包含根分区。如果您正在使用 linux-edge,请在脚本中将 lts
替换为 edge
内核包含指定块设备的 详尽列表。为了获得更强大的启动条目,建议使用持久性名称,例如 PARTUUID。
(可选)将新创建的条目设置为默认条目
# efibootmgr -n XXXX
其中 XXXX
是新条目的启动编号。
使用 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 的内容
bootx64.efi 仅适用于 x86_64
系统。对于其他架构,确切的名称会有所不同。