Bootloader

之前在做 Alpine 迁移根分区的时候,遇到了引导程序无法正常工作的问题,于是做了各种实验,检查一下各种引导器的对系统的支持情况。

最主流的现代引导器:

  1. GRUB
  2. systemd-boot
  3. rEFInd (refind)

测试使用的操作系统:

  • Alpine Linux
  • Ubuntu

GRUB

GRUB Screenshot

大多数的 Linux 都默认使用了 GRUB,强大,通用,如果遇到问题,应该都能找到解决办法。

安装

grub-install

配置

更新引导程序

update-grub

systemd-boot

systemd-boot-gui

systemd-boot 是一个非常简单的引导程序,引导界面没有什么文字,boot选项在屏幕正中间,我个人非常喜欢。

安装

# 安装完成之后会自动设置 systemd-boot 为默认引导器,且会生成当前系统的引导项
apt install systemd-boot

# 把 systemd-boot 安装到 EFI 系统分区,并将其设置为默认引导加载程序。
bootctl install

配置

  1. /boot/efi/loader/entries/ 目录下创建引导项配置文件。例如,为你的 Linux 系统创建一个 linux.conf 文件

    sudo mkdir -p /boot/efi/loader/entries/
    sudo nano /boot/efi/loader/entries/linux.conf
  2. 写入以下内容:

    title   Linux
    linux   /vmlinuz-linux
    initrd  /initramfs-linux.img
    options root=UUID=<你的根分区UUID> rw

调整 systemd-boot

  1. 编辑 /boot/efi/loader/loader.conf 文件以设置默认引导项和超时时间:

    sudo nano /boot/efi/loader/loader.conf
  2. 写入以下内容:

    default  linux
    timeout  5

rEFInd (refind)

这命名很泽野弘之

refind-theme-regular

refind 可以做一个很好看的引导界面(但是默认的非常丑),同时配置相对简单,预设引导(默认不启用)足够用了。

安装

  1. 下载和解压

    wget https://sourceforge.net/projects/refind/files/latest/download -O refind.zip
    unzip refind.zip
    cd refind-*
  2. 安装

    sudo ./refind-install

配置

  1. rEFInd 的配置文件位于 /boot/efi/EFI/refind/refind.conf

    sudo nano /boot/efi/EFI/refind/refind.conf
  2. 配置引导条目

    menuentry "Linux" {
        volume <你的根分区UUID>
        loader /boot/vmlinuz-linux
        initrd /boot/initramfs-linux.img
        options "root=UUID=<你的根分区UUID> rw quiet"
    }

早期引导程序

早期引导程序对于现代 UEFI 和 GPT 的支持并不怎么好,所以不在本文的讨论范围内。

  • syslinux
  • LILO

Conclusion

Alpine Linux

对于 Alpine 来说,用 GRUB 以外的都是在增加复杂度,initramfs 应该有写入挂载根文件系统的条目,所以,换了引导器可能就没法启动了。

另外一点就是,Alpine 的启动内核在根分区(sda3)里面,并不在 EFI 分区,所以挂载根分区之前,应该无法从 bootloader 应该无法找到,所以你可能需要手动复制一份到 EFI 分区。

对于我的折腾,直到最后都没能从 systemd-boot 和 refind 启动,看来 Alpine 确实非常安全。对于安全的使用场景 使用 Alpine 来替换 FreeBSD 或许是个更好的选择。

你应该使用 systemd-boot 或 rEFInd 吗?

折腾引导程序带来的问题远比要解决的问题多,不建议更换引导器。

如果真的遇到了问题,你应该去修复它。

在本文之前,你应该了解下面的内容

  • BIOS

    • MBR
  • UEFI(EFI)

    • GPT

启动流程

1. First-stage boot loader

第一阶段引导加载程序的示例包括BIOS 、 UEFI 、 coreboot 、 Libreboot和Das U-Boot 。

BIOS和UEFI不仅可以从非易失性设备加载多个操作系统,还可以为加载的操作系统初始化系统硬件。

2. Second-stage boot loader

第二阶段引导加载程序的示例包括GRUB、 systemd-boot、 rEFInd。

本身不是操作系统,但能够正确加载操作系统并将执行转移给它;操作系统随后进行自身初始化并可能加载额外的设备驱动程序。第二阶段引导加载程序不需要驱动程序来进行其自身的操作,而是可以使用系统固件(例如 BIOS 或开放固件)提供的通用存储访问方法,尽管通常具有受限的硬件功能和较低的性能。 [ 12 ]

部分参考

https://en.wikipedia.org/wiki/Bootloader
https://www.reddit.com/r/unixporn/comments/aswmq2/refind_minimal_refind_theme_regular/