开机流程
本章导语
按下电源键到看到登录提示符,中间发生的事情远比"屏幕亮一下"复杂:固件(BIOS 或 UEFI)先自检并决定从哪块磁盘的哪个扇区读代码,接着引导加载器(GRUB)登场——它要找到内核、把内核和 initramfs 搬进内存、按你在内核命令行里留下的参数启动它;内核初始化完驱动与挂载点,再拉起 PID 1(systemd),由它按依赖顺序拉起网络、日志、SSH 等服务,最后在 tty 上打出 login:。这条链上任何一环断掉,机器都停在半路:GRUB 菜单没了、内核 panic、fstab 写错导致根文件系统挂不上——每种症状对应链上不同的位置,而排障能力本质上就是"沿着这条链反向定位断点"的能力。
本章两页:BIOS 与 UEFI讲清两种固件模式的差异,重点解释 UEFI + NVRAM + EFI 系统分区(ESP) 这套三位一体的机制为什么是现代机器的默认;GRUB 引导程序讲清 GRUB 的配置层级(源文件 → 生成的 grub.cfg)、三系更新命令的差异,以及引导失败时的完整救援流程(Live USB + chroot)。两页合起来覆盖"为什么开不了机"和"开不了机怎么办"两大主题。
本页以 Debian/Ubuntu、Arch、RHEL/CentOS/Rocky 三大发行版家族为主线对照讲解。三系在内核与 systemd 层几乎无差异,真正的分歧集中在默认 bootloader与引导分区布局上,详见下方速览表。内容参考自 Arch Wiki 与 GNU GRUB 手册,见文末参考资料。
学习目标
学完本章两页内容后,你应当能够:
- 画出完整启动链:固件 → 引导加载器 → 内核 → initramfs → PID 1,每一步的输入输出是什么,失败时的典型症状长什么样。
- 区分 BIOS 与 UEFI:说清 MBR/GPT、引导代码位置、NVRAM 启动项、ESP 分区各自的角色,以及为什么新机器几乎一边倒选择 UEFI。
- 读懂磁盘布局:在真实机器上用
lsblk、fdisk -l、efibootmgr判断当前是 UEFI 还是 Legacy 模式,找到 ESP 并确认它被挂载到/boot/efi。 - 修改 GRUB 配置:知道不能直接编辑
grub.cfg,要改/etc/default/grub与/etc/grub.d/,再用三系对应的命令(update-grub/grub2-mkconfig/grub-mkconfig)重新生成。 - 完成引导救援:在 GRUB 菜单丢失或系统无法启动时,用 Live USB 进入 chroot,执行
grub-install(BIOS 与 UEFI 的目标参数不同)与配置重建,恢复启动。 - 理解三系 bootloader 差异:Debian/Ubuntu、RHEL/CentOS/Rocky 默认 GRUB2,Arch 默认由用户选择(GRUB、systemd-boot 或 rEFInd),并知道这些选择如何影响 ESP 布局。
子页导读
本章由两页构成,建议按顺序阅读,每页约 12–15 分钟:
BIOS 与 UEFI — 固件层的选择。从"为什么 BIOS 的 2 TB/4 分区限制在今天成了问题"讲起,对照 BIOS 与 UEFI 在分区表(MBR vs GPT)、引导方式(嵌入 MBR 的引导代码 vs NVRAM 指向 ESP 内的
.efi文件)、Secure Boot 支持上的差异;重点解释 NVRAM 启动项(efibootmgr查看/增删的那张表)与 EFI 系统分区(必须 FAT32、通常 100–512 MB、挂载于/boot/efi)为什么缺一不可;最后给出三系在安装时的分区建议与常见混合模式(CSM/Legacy-on-UEFI)陷阱。本页解决"我该用什么模式装系统、为什么装完找不到启动项"。GRUB 引导程序 — 引导加载器本体。先讲 GRUB 的两级结构(
boot.img/core.img或grubx64.efi→ 读取grub.cfg→ 加载内核与 initramfs),拆解配置的三层来源(/etc/default/grub定义变量、/etc/grub.d/*生成菜单项、最终汇总写出grub.cfg),给出三系重新生成配置的命令差异,演示 GRUB 菜单按e临时修改内核参数(进救援模式/单用户模式的标准入口),最后给出引导失败的完整救援脚本:Live USB → 挂载分区 →chroot→grub-install(区分 BIOS 的--target=i386-pc与 UEFI 的--target=x86_64-efi)→ 重建配置 → 重启。本页解决"GRUB 菜单没了/引导出错怎么救"。
三系差异速览
开机流程本身(固件 → 内核 → systemd)三系完全一致,差异集中在 bootloader 默认选型与配置路径上:
| 主题 | Debian/Ubuntu | Arch | RHEL/CentOS/Rocky |
|---|---|---|---|
| 默认 bootloader | GRUB2 | 用户选择(常见 GRUB / systemd-boot) | GRUB2 |
| 引导配置源 | /etc/default/grub、/etc/grub.d/ | 同左(GRUB);systemd-boot 用 loaderentries/ | /etc/default/grub、/etc/grub.d/ |
| 生成的配置 | /boot/grub/grub.cfg | /boot/grub/grub.cfg | /boot/grub2/grub.cfg |
| 重新生成命令 | sudo update-grub | sudo grub-mkconfig -o /boot/grub/grub.cfg | sudo grub2-mkconfig -o /boot/grub2/grub.cfg |
| 安装到磁盘 | grub-install /dev/sda | grub-install --target=x86_64-efi ... | grub2-install /dev/sda |
| 典型 ESP 挂载点 | /boot/efi | /boot(ESP 直接作为 /boot,Arch Wiki 推荐) | /boot/efi |
| 双系统菜单更新 | update-grub 自动探测 Windows | grub-mkconfig 或 os-prober | grub2-mkconfig |
三条最值得注意的差异逻辑:
Arch 把 bootloader 选择权交给用户。安装介质上没有"默认装 GRUB"这一步——你可以选 GRUB(功能最全,双系统友好)、systemd-boot(极简,只认 EFI 分区下的内核,配置是纯文本 entry 文件)或 rEFInd(自动扫描,macOS 风格)。这直接影响 ESP 布局:systemd-boot 场景下 ESP 常被直接挂为
/boot,而 Debian/RHEL 的惯例是单独的/boot/efi挂载点,同一块磁盘搬到不同发行版时"找不到 EFI 分区"多半源于此。生成配置的命令与输出路径两处不同。Debian/Ubuntu 封装了
update-grub脚本(本质是grub-mkconfig -o /boot/grub/grub.cfg的快捷方式);RHEL 系二进制名带2(grub2-mkconfig、grub2-install),且配置在/boot/grub2/目录下。照抄另一系的路径会得到No such file or directory——救援时先ls /boot/看实际是grub还是grub2再敲命令。内核与 initramfs 的位置决定 chroot 后要做什么。三系都把内核放在
/boot(或 ESP,取决于布局),initramfs 生成工具分别是update-initramfs/mkinitcpio/dracut。救援时如果连内核都损坏了,grub-install修好菜单也进不了系统——需要一并重建 initramfs,GRUB 页会给出三系对应命令。
常见问题
进入子页前最常被问到的四个问题:
Q:我怎么知道机器是 UEFI 还是 Legacy BIOS 启动? 最可靠的运行时判断是看 /sys/firmware/efi 目录是否存在:存在即 UEFI 模式启动,不存在即 Legacy。另一种验证是 efibootmgr -v——能正常列出启动项就是 UEFI;报 EFI variables are not supported 则是 Legacy。装系统前先确认这一点,否则会在 GPT/MBR 与 ESP 配置上做无用功。详见 BIOS 与 UEFI。
Q:UEFI 一定需要单独分一个 EFI 系统分区吗? 是的,而且必须是 FAT32(多数固件只认 FAT)。UEFI 不像 BIOS 那样读 MBR 前 446 字节的引导代码,它是在一块格式化为 FAT 的分区里按路径找 \EFI\<厂商或 bootloader 名>\xxx.efi 执行——这个分区就是 ESP(EFI System Partition)。常见容量 100–512 MB 足够(要容纳所有操作系统的 .efi 文件与备份),安装器一般自动创建并挂到 /boot/efi。
Q:为什么我改了 /etc/default/grub 菜单没变化? 因为 GRUB 实际读取的是生成出来的 grub.cfg,改源文件后必须执行三系对应的重新生成命令(见上表"重新生成命令"一行)。永远不要直接编辑 grub.cfg——它文件头就写着"Do not edit this file",下次重新生成会被覆盖。
Q:双系统 Windows 后 Linux 启动项消失了怎么办? Windows 更新常会抢占 NVRAM 启动顺序,把 Windows Boot Manager 放回第一。修复分两层:先用 efibootmgr 看 Linux 启动项是否还在(在则调顺序 efibootmgr -o),不在则进 Live USB chroot 后重新 grub-install,让 GRUB 重新写入 NVRAM。UEFI 下 GRUB 本身就是 EFI 分区里的一个 .efi 文件,重装它不会动你的系统分区。
参考资料
- Arch Wiki - UEFI — wiki.archlinux.org
- Arch Wiki - GRUB — wiki.archlinux.org
- Arch Wiki - systemd-boot(Arch 常见替代选择) — wiki.archlinux.org
- Arch Wiki - Install guide 的分区与引导章节 — wiki.archlinux.org
- GNU GRUB 手册 — gnu.org
- 鸟哥的私房菜 - 开机流程分析 — linux.vbird.org
- RHEL 9 - 在 UEFI 模式下安装 GRUB — docs.redhat.com
- Debian 手册 - 系统启动 — debian.org
man efibootmgr、man grub-install、man grub-mkconfig、man dracut