开机流程与 GRUB¶
本文你会学到:
- 从按下电源到登录提示的完整开机流程
- BIOS 与 UEFI 的区别与判断方法
- MBR 与 GPT 分区表的原理与兼容性
- GRUB2 的两级引导机制与配置文件
- initramfs 的作用与核心驱动加载
- Linux 内核启动参数与 GRUB 编辑入口
- systemd 与运行级别(target)的对应关系
- Root 密码遗忘时的救援启动方法
- 常见启动问题的诊断与恢复策略
完整开机流程¶
graph TD
A[按下电源] --> B[BIOS / UEFI\nPOST 硬件自检]
B --> C[读取第一个可开机设备的 MBR / GPT]
C --> D[Boot Loader\nGRUB2 Stage 1]
D --> E[GRUB2 Stage 2\n读取 grub.cfg 显示菜单]
E --> F[加载内核文件\n/boot/vmlinuz-x.x.x]
F --> G[解压并挂载 initramfs\n临时根文件系统]
G --> H[内核侦测硬件\n加载驱动模块]
H --> I[释放 initramfs\n挂载真实根文件系统]
I --> J[启动第一个进程\n/sbin/init → systemd PID=1]
J --> K[执行 default.target\n通常为 multi-user 或 graphical]
K --> L[登录提示]
classDef firmware fill:transparent,stroke:#0288d1,color:#adbac7,stroke-width:2px
classDef boot fill:transparent,stroke:#f57c00,color:#adbac7,stroke-width:2px
classDef kernel fill:transparent,stroke:#388e3c,color:#adbac7,stroke-width:2px
classDef init fill:transparent,stroke:#7b1fa2,color:#adbac7,stroke-width:2px
class A,B firmware
class C,D,E boot
class F,G,H,I kernel
class J,K,L init
BIOS 与 UEFI 的区别¶
当你的系统无法启动时,首先需要确认自己的固件类型——不同固件的排错路径完全不同。
| 特性 | 传统 BIOS | UEFI |
|---|---|---|
| 运行模式 | 16 位实模式 | 32/64 位保护模式 |
| 引导区 | MBR(主引导记录,446 字节) | GPT + EFI 系统分区(ESP) |
| 最大磁盘 | 2 TB(MBR 分区表限制) | 理论 > 8 ZB |
| 安全启动 | 不支持 | 支持 Secure Boot |
| 开机速度 | 较慢 | 更快(可直接加载内核) |
| Shell 环境 | 无 | 有 EFI Shell,可执行 .efi 文件 |
| 判断依据 | /sys/firmware/efi 目录**不存在** |
/sys/firmware/efi 目录**存在** |
Boot Loader 与多重引导¶
Boot Loader 安装在磁盘最前面的 MBR(仅 446 字节),它做三件事:
- 提供菜单:让你选择要启动哪个操作系统或内核版本
- 加载内核:将内核文件读入内存并执行
- 转交控制权:将引导交给另一个 Boot Loader(用于多重引导)
为什么要先装 Windows 再装 Linux?
Windows 的 Boot Loader 不具备控制权转交功能,如果先装 Linux 后装 Windows,Windows 会覆盖 MBR,导致 Linux 的 GRUB 被破坏。反过来,GRUB2 可以识别并转交给 Windows 的 Boot Loader,实现双系统共存。
GRUB2 引导加载器¶
目录结构¶
不要直接修改 grub.cfg
/boot/grub2/grub.cfg 是由脚本自动生成的,直接修改会在下次执行 grub2-mkconfig 时被覆盖。正确做法是修改 /etc/default/grub,然后重新生成。
/etc/default/grub 常用参数¶
生成 grub.cfg¶
修改 /etc/default/grub 后,**必须**重新生成 grub.cfg 才能生效:
安装与修复 GRUB¶
GRUB 损毁(常见于重装 Windows 后)时,需要从 Live CD 进入 chroot 环境后重新安装:
常用内核启动参数¶
在 GRUB 菜单中按 e 进入编辑,找到以 linux 开头的行,在行末追加参数:
initramfs —— 内核的临时根文件系统¶
为什么需要 initramfs¶
这里有个先有鸡还是先有蛋的问题:
- 内核要读取 SATA 磁盘上的驱动程序,才能挂载根文件系统
- 而 SATA 驱动程序就存放在根文件系统的
/lib/modules/里
为了打破这个死循环,Boot Loader 在加载内核的同时,还会加载一个**临时的内存文件系统**(initramfs)。它包含最必要的驱动模块(SATA、SCSI、RAID、LVM 等),让内核能够顺利挂载真正的根文件系统,之后再释放这块内存。
常用操作¶
systemd 启动流程¶
内核完成硬件初始化后,启动的第一个进程是 systemd(PID = 1)。它读取 /etc/systemd/system/default.target 来决定启动目标:
graph LR
A[内核交权给 systemd] --> B[sysinit.target\n挂载文件系统\n启动 udev]
B --> C[basic.target\n防火墙 / 音效 / SELinux]
C --> D[multi-user.target\n网络 / SSH / 数据库等服务]
D --> E{default.target\n是哪个?}
E -->|multi-user| F[getty.target\n文字登录提示]
E -->|graphical| G[gdm.service\n图形登录界面]
classDef stage fill:transparent,stroke:#0288d1,color:#adbac7,stroke-width:1px
classDef choice fill:transparent,stroke:#f57c00,color:#adbac7,stroke-width:2px
classDef end_ fill:transparent,stroke:#388e3c,color:#adbac7,stroke-width:1px
class A,B,C,D stage
class E choice
class F,G end_
systemd 与传统 SysV runlevel 的对应关系:
| SysV runlevel | systemd target | 说明 |
|---|---|---|
| 0 | poweroff.target |
关机 |
| 1 | rescue.target |
单用户救援模式 |
| ⅔/4 | multi-user.target |
多用户文字模式 |
| 5 | graphical.target |
图形界面 |
| 6 | reboot.target |
重启 |
恢复 root 密码¶
RHEL 8 / 9 方法(rd.break)¶
- 重启,GRUB 菜单出现时按
e进入编辑 - 找到以
linux开头的行,在行末追加rd.break(删除rhgb quiet) - 按
Ctrl+X启动,进入switch_root环境 - 执行以下命令:
SELinux 重标记不可跳过
如果系统启用了 SELinux,修改密码后必须执行 touch /.autorelabel。否则 SELinux 会因为 /etc/shadow 的安全上下文被破坏而拒绝登录。重标记过程会让系统重启时多花几分钟,属于正常现象。
Debian / Ubuntu 方法(recovery mode)¶
- GRUB 菜单选择 Advanced options → recovery mode
- 在恢复菜单中选择 root — Drop to root shell prompt
- 执行:
内核模块管理¶
查看与检查¶
加载与卸载¶
持久化配置¶
黑名单(禁止加载)¶
系统救援¶
救援模式 vs 紧急模式¶
使用 Live CD 修复¶
当系统完全无法启动时,从 Live CD 进行 chroot 修复:
发行版差异¶
| 项目 | 值 |
|---|---|
| GRUB 命令 | grub-install、update-grub、grub-mkconfig |
| 主配置文件 | /boot/grub/grub.cfg |
| initramfs 工具 | update-initramfs |
| BIOS 包名 | grub-pc |
| UEFI 包名 | grub-efi-amd64 |
| UEFI 启动项路径 | /boot/efi/EFI/debian/ |
| 项目 | 值 |
|---|---|
| GRUB 命令 | grub2-install、grub2-mkconfig |
| BIOS 配置文件 | /boot/grub2/grub.cfg |
| UEFI 配置文件 | /boot/efi/EFI/redhat/grub.cfg |
| initramfs 工具 | dracut |
| BIOS 包名 | grub2-pc |
| UEFI 包名 | grub2-efi-x64 |
| 备注 | RHEL 9 实验性支持 systemd-boot(BLS 格式) |