Linux 启动流程详解:从开机到登录的完整过程¶
前言¶
按下电源键到出现登录提示符,这几十秒内发生了什么?理解启动流程不只是满足好奇心——当系统「卡住不动」时,知道它在哪一步卡住了,你才能在正确的位置按正确的键进入修复模式。
本文拆解从固件到登录的六个阶段,每一步都给出关键命令和排障入口。
启动流程全景¶
flowchart TD
A[BIOS/UEFI] -->|POST 自检 → 加载引导程序| B[GRUB2]
B -->|选择内核 → 加载 initramfs| C[内核启动]
C -->|初始化硬件 → 挂载根文件系统| D[initramfs]
D -->|切换根 → 启动 PID 1| E[systemd]
E -->|并行启动服务 → 达到 target| F[登录提示]
style A fill:#fce7f3,stroke:#db2777
style B fill:#fef3c7,stroke:#d97706
style C fill:#d1fae5,stroke:#059669
style D fill:#dbeafe,stroke:#2563eb
style E fill:#e0e7ff,stroke:#4f46e5
style F fill:#d1fae5,stroke:#059669 阶段一:BIOS/UEFI 固件¶
| Legacy BIOS | UEFI | |
|---|---|---|
| 分区表 | MBR | GPT |
| 引导程序位置 | 磁盘第一个扇区(446 字节) | ESP 分区(/boot/efi) |
| 引导程序格式 | 裸二进制 | .efi 可执行文件 |
| 安全启动 | 不支持 | Secure Boot |
| 多系统支持 | 困难 | 原生支持 |
# 查看当前是 BIOS 还是 UEFI
ls /sys/firmware/efi # 目录存在 → UEFI,不存在 → BIOS
# 查看 ESP 分区
lsblk -f | grep -i vfat
阶段二:GRUB2 引导程序¶
GRUB2 配置文件¶
| 文件 | 作用 |
|---|---|
/etc/default/grub | 用户可编辑的配置(内核参数、超时、默认启动项) |
/boot/grub/grub.cfg | 自动生成的最终配置(不要手动编辑) |
/etc/grub.d/ | 生成 grub.cfg 的脚本片段 |
# 修改配置后,必须重新生成 grub.cfg
sudo grub-mkconfig -o /boot/grub/grub.cfg # BIOS
sudo grub-mkconfig -o /boot/efi/EFI/<distro>/grub.cfg # UEFI
常用 GRUB 配置¶
# /etc/default/grub
GRUB_TIMEOUT=5 # 引导菜单等待秒数
GRUB_CMDLINE_LINUX="quiet splash" # 内核启动参数
GRUB_CMDLINE_LINUX_DEFAULT="" # 默认内核参数
临时修改内核参数(排障用)¶
在 GRUB 菜单按 e 编辑启动项:
# 常见临时参数:
single → 单用户模式(救援)
init=/bin/bash → 直接进 root shell(无需密码)
systemd.unit=emergency.target → systemd 紧急模式
阶段三:内核加载与 initramfs¶
内核做了什么?¶
- 解压自己
- 初始化 CPU、内存、中断
- 加载内置驱动
- 挂载 initramfs(临时根文件系统)
- 执行
/init(initramfs 中的第一个程序)
initramfs 是什么?¶
initramfs 是一个临时的小型根文件系统,包含:
- 必要的内核模块(磁盘驱动、文件系统驱动)
- 设备检测工具(
udev) - 磁盘解密工具(LUKS)
- 挂载真正根文件系统所需的一切
需要 initramfs 的典型场景
- 根文件系统在 LVM 上 → initramfs 加载 LVM 模块并激活 VG
- 根文件系统加密(LUKS) → initramfs 提示输入密码
- 根文件系统在 RAID 上 → initramfs 加载 RAID 驱动
- 根文件系统在 NVMe 上 → initramfs 加载 NVMe 驱动
# 查看当前内核的 initramfs
ls -lh /boot/initrd.img-*
# 重新生成 initramfs
sudo update-initramfs -u -k all # Debian/Ubuntu
sudo dracut --force # RHEL/Rocky
# 查看 initramfs 内容
lsinitramfs /boot/initrd.img-$(uname -r) | head -30
阶段四:systemd 启动¶
内核将控制权交给 /sbin/init(指向 systemd,PID=1):
# 查看启动耗时
systemd-analyze
# 查看每个服务的启动时间(找慢的)
systemd-analyze blame | head -15
# 查看启动关键链
systemd-analyze critical-chain
# 生成启动 SVG 图
systemd-analyze plot > boot.svg
启动到达的 Target¶
# 查看当前 target
systemctl get-default
# 常见 target
multi-user.target # 命令行多用户(服务器默认)
graphical.target # 图形界面
rescue.target # 单用户救援
emergency.target # 紧急模式(最小化)
救援与紧急模式¶
单用户/救援模式¶
在 GRUB 菜单按 e,在 linux 行末尾加 single 或 systemd.unit=rescue.target:
紧急模式¶
如果根文件系统挂载失败,systemd 会自动进入 emergency.target。或手动添加 systemd.unit=emergency.target 内核参数。
启动排障¶
卡在 GRUB 提示符¶
说明 GRUB 找不到 grub.cfg 或内核文件:
# 手动引导
grub> ls # 列出磁盘和分区
grub> set root=(hd0,msdos1) # 设根分区
grub> linux /vmlinuz root=/dev/sda1
grub> initrd /initrd.img
grub> boot
进入系统后重建 GRUB:
卡在 initramfs 阶段¶
通常是磁盘驱动或 LUKS/LVM 问题:
# initramfs 提示符下
blkid # 查看可用设备
lvm vgchange -ay # 激活 LVM
cryptsetup luksOpen ... # 解锁 LUKS
exit # 继续启动
总结¶
Linux 启动六个阶段,排障按顺序定位:
- BIOS/UEFI:硬件自检,找引导设备
- GRUB2:
/etc/default/grub+grub-mkconfig生成配置 - 内核 + initramfs:加载驱动、解密磁盘、挂载根
- systemd:
systemd-analyze blame找慢服务 - Target 到达:multi-user 或 graphical
- 登录:getty + login
排障关键字:GRUB按 e、内核参数 single/emergency、systemd-analyze、update-initramfs。🚀