Linux 系统从按下电源到出现登录提示符(或图形界面),中间经历了非常清晰且分层的启动过程。理解这个流程,能帮助你:
- 知道系统“卡在哪里”时应该看哪部分日志
- 明白 initramfs、GRUB、systemd 各自负责什么
- 知道如何修复“开机黑屏”“进不了系统”“卡在某个服务”等常见问题
以下是 2025–2026 年主流 Linux 发行版(使用 systemd + GRUB2 / systemd-boot)的完整启动流程,按阶段拆解。
1. BIOS / UEFI → 固件阶段(开机瞬间)
| 阶段 | 执行主体 | 主要任务 | 关键输出 / 可观察现象 |
|---|---|---|---|
| Power-On Self-Test (POST) | 主板固件(BIOS 或 UEFI) | 检查硬件(CPU、内存、显卡、存储等) | 主板蜂鸣声、LOGO画面、硬件错误提示 |
| 查找可引导设备 | BIOS / UEFI | 按 Boot Order 顺序找第一个可引导介质 | — |
| 读取引导记录 | — | 读取磁盘第一个扇区(MBR 512 字节)或 EFI 分区中的 .efi 文件 | 进入引导加载器 |
现代服务器与大多数新电脑都使用 UEFI 模式:
- 启动分区是 FAT32 格式的 EFI System Partition(通常挂载在 /boot/efi)
- 引导文件是 .efi 可执行文件(而非传统 MBR 的 446 字节引导代码)
2. 引导加载器阶段(Bootloader)
目前主流有两种引导加载器:
| 引导加载器 | 主要发行版支持 | 配置文件位置 | 配置文件格式 | 2026 年趋势 |
|---|---|---|---|---|
| GRUB2 | Ubuntu、Debian、Fedora、Rocky/Alma 等几乎全部 | /boot/grub/grub.cfg(自动生成) | grub 脚本语言 | 仍然占主导 |
| systemd-boot | Fedora Silverblue、Ubuntu Core、Arch(可选) | /boot/loader/entries/*.conf | 纯文本 .conf | 不可变系统越来越流行 |
GRUB2 典型启动流程:
- 固件加载 /boot/grub/x86_64-efi/grubx64.efi(或 core.img)
- GRUB 读取 /boot/grub/grub.cfg
- 显示菜单(或直接倒计时)
- 用户选择(或默认)内核版本 + initramfs
- 加载内核(vmlinuz-x.x.x)与初始内存盘(initrd.img / initramfs-x.x.x.img)
- 把控制权交给内核(exec kernel)
3. 内核解压 + initramfs 执行阶段
内核被加载到内存后,第一件事是解压自己,然后挂载 initramfs(initial ram filesystem)作为根文件系统。
initramfs 的核心作用:
- 包含最精简的用户空间工具(busybox 或 dracut 生成的微型系统)
- 加载必要的存储驱动(NVMe、RAID、LVM、加密 dm-crypt)
- 挂载真实的根文件系统(/)
- 切换根(switch_root)到真实根分区
initramfs 常见卡住场景:
- 找不到根分区(UUID 写错、磁盘顺序变了)
- LUKS 加密分区要密码但键盘驱动没加载
- RAID 阵列组装失败
- initramfs 里缺少文件系统驱动(btrfs、zfs、xfs 等)
现代发行版多使用 dracut(Fedora/RHEL 系)或 mkinitcpio(Arch)生成 initramfs。
4. 切换到真实根文件系统 → PID 1 启动
initramfs 完成任务后执行 switch_root,把控制权交给真实根分区里的 /sbin/init(符号链接到 systemd)。
systemd 成为 PID 1(所有进程之父),从此刻开始才是我们熟悉的“系统启动”。
5. systemd 启动阶段(最重要、最可观测的部分)
systemd 把启动过程分为多个 target(类似旧 SysV 的 runlevel),主流流程如下:
| 阶段 / Target | 主要工作内容 | 可观察现象 / 日志关键词 | 常见卡住原因 |
|---|---|---|---|
| initrd → sysinit.target | 挂载 /sys、/proc、/dev、设置主机名、加载模块 | journalctl -b -u systemd-udevd | 设备驱动加载失败 |
| basic.target | 设置时间、日志、tmpfs 挂载、基本服务 | journalctl -b -u systemd-tmpfiles-setup | — |
| multi-user.target | 启动大多数系统服务(网络、ssh、cron、docker 等) | journalctl -b -u NetworkManager | 服务启动超时、依赖循环、配置文件错误 |
| graphical.target(桌面版) | 启动显示管理器(gdm、sddm、lightdm) | journalctl -b -u gdm | 显卡驱动问题、Wayland/Xorg 冲突 |
systemd 的启动顺序由单元文件(.service / .target / .mount 等)之间的 Wants、Requires、After、Before 关系决定。
systemd-analyze 系列命令是分析启动速度与瓶颈的神器:
- systemd-analyze → 显示总启动时间
- systemd-analyze blame → 列出每个单元耗时(最有用)
- systemd-analyze critical-chain → 显示最长路径上的瓶颈
- systemd-analyze plot > boot.svg → 生成启动时间线 SVG 图
6. 启动完成标志
- 出现登录提示符(console)或图形登录界面
- systemd-journald 记录 "Reached target multi-user.target" 或 "graphical.target"
- systemctl is-system-running 返回 running
新手快速记忆版启动流程口诀
电源 → 固件(BIOS/UEFI) → 引导加载器(GRUB / systemd-boot) → 内核 + initramfs(加载驱动、找根分区) → switch_root → 真实根文件系统 → systemd(PID 1)启动 → sysinit → basic → multi-user / graphical → 登录提示符 / 桌面
常见卡住位置与排查口诀
- 卡在 GRUB 菜单或 "loading initial ramdisk" → 看 /boot 分区是否损坏、内核文件是否存在
- 卡在 initramfs(emergency mode) → 键盘输入 root 密码 → journalctl -xb、lsblk、cat /etc/fstab
- 卡在某个服务启动([ OK ] Started xxx) → Ctrl+C 跳过或进 rescue mode → systemctl status xxx
- 开机黑屏但能进 rescue → 改内核参数 rd.break=pre-mount / rd.shell(强制进 initramfs 调试)
理解了这个流程,你就拥有了“系统启动时发生了什么”的完整地图,后续无论是修复引导、优化启动速度、分析卡死、制作自定义 initramfs,都会变得有迹可循。