Bootloader
之前在做 Alpine 迁移根分区的时候,遇到了引导程序无法正常工作的问题,于是做了各种实验,检查一下各种引导器的对系统的支持情况。
最主流的现代引导器:
- GRUB
- systemd-boot
- rEFInd (refind)
测试使用的操作系统:
- Alpine Linux
- Ubuntu
GRUB
大多数的 Linux 都默认使用了 GRUB,强大,通用,如果遇到问题,应该都能找到解决办法。
安装
grub-install
配置
更新引导程序
update-grub
systemd-boot
systemd-boot 是一个非常简单的引导程序,引导界面没有什么文字,boot选项在屏幕正中间,我个人非常喜欢。
安装
# 安装完成之后会自动设置 systemd-boot 为默认引导器,且会生成当前系统的引导项
apt install systemd-boot
# 把 systemd-boot 安装到 EFI 系统分区,并将其设置为默认引导加载程序。
bootctl install
配置
在
/boot/efi/loader/entries/
目录下创建引导项配置文件。例如,为你的 Linux 系统创建一个linux.conf
文件sudo mkdir -p /boot/efi/loader/entries/ sudo nano /boot/efi/loader/entries/linux.conf
写入以下内容:
title Linux linux /vmlinuz-linux initrd /initramfs-linux.img options root=UUID=<你的根分区UUID> rw
调整 systemd-boot
编辑
/boot/efi/loader/loader.conf
文件以设置默认引导项和超时时间:sudo nano /boot/efi/loader/loader.conf
写入以下内容:
default linux timeout 5
rEFInd (refind)
这命名很泽野弘之
refind 可以做一个很好看的引导界面(但是默认的非常丑),同时配置相对简单,预设引导(默认不启用)足够用了。
安装
下载和解压
wget https://sourceforge.net/projects/refind/files/latest/download -O refind.zip unzip refind.zip cd refind-*
安装
sudo ./refind-install
配置
rEFInd 的配置文件位于
/boot/efi/EFI/refind/refind.conf
sudo nano /boot/efi/EFI/refind/refind.conf
配置引导条目
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/