Skip to content

开机流程 ​

本章导语 ​

按下电源键到看到登录提示符,中间发生的事情远比"屏幕亮一下"复杂:固件(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 手册,见文末参考资料。

学习目标 ​

学完本章两页内容后,你应当能够:

  1. 画出完整启动链:固件 → 引导加载器 → 内核 → initramfs → PID 1,每一步的输入输出是什么,失败时的典型症状长什么样。
  2. 区分 BIOS 与 UEFI:说清 MBR/GPT、引导代码位置、NVRAM 启动项、ESP 分区各自的角色,以及为什么新机器几乎一边倒选择 UEFI。
  3. 读懂磁盘布局:在真实机器上用 lsblk、fdisk -l、efibootmgr 判断当前是 UEFI 还是 Legacy 模式,找到 ESP 并确认它被挂载到 /boot/efi。
  4. 修改 GRUB 配置:知道不能直接编辑 grub.cfg,要改 /etc/default/grub 与 /etc/grub.d/,再用三系对应的命令(update-grub / grub2-mkconfig / grub-mkconfig)重新生成。
  5. 完成引导救援:在 GRUB 菜单丢失或系统无法启动时,用 Live USB 进入 chroot,执行 grub-install(BIOS 与 UEFI 的目标参数不同)与配置重建,恢复启动。
  6. 理解三系 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/UbuntuArchRHEL/CentOS/Rocky
默认 bootloaderGRUB2用户选择(常见 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-grubsudo grub-mkconfig -o /boot/grub/grub.cfgsudo grub2-mkconfig -o /boot/grub2/grub.cfg
安装到磁盘grub-install /dev/sdagrub-install --target=x86_64-efi ...grub2-install /dev/sda
典型 ESP 挂载点/boot/efi/boot(ESP 直接作为 /boot,Arch Wiki 推荐)/boot/efi
双系统菜单更新update-grub 自动探测 Windowsgrub-mkconfig 或 os-probergrub2-mkconfig

三条最值得注意的差异逻辑:

  1. Arch 把 bootloader 选择权交给用户。安装介质上没有"默认装 GRUB"这一步——你可以选 GRUB(功能最全,双系统友好)、systemd-boot(极简,只认 EFI 分区下的内核,配置是纯文本 entry 文件)或 rEFInd(自动扫描,macOS 风格)。这直接影响 ESP 布局:systemd-boot 场景下 ESP 常被直接挂为 /boot,而 Debian/RHEL 的惯例是单独的 /boot/efi 挂载点,同一块磁盘搬到不同发行版时"找不到 EFI 分区"多半源于此。

  2. 生成配置的命令与输出路径两处不同。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 再敲命令。

  3. 内核与 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 文件,重装它不会动你的系统分区。

参考资料 ​

相关页面 ​

基于 Apache License 2.0 许可发布