< 返回
Debian 系统启动流程详解
2026-02-23 17:34
作者:技术部
阅读量:4
Debian 从 Debian 8(jessie)开始默认使用 systemd 作为 init 系统,启动流程已经高度结构化、并行化、可追踪。理解这个流程对排查开机慢、服务启动失败、rescue mode、自定义启动项、内核参数调整 等都非常关键。
以下按时间顺序拆解整个启动链路,从按下电源到出现登录提示(或图形界面)。
1. 固件阶段(Firmware / BIOS 或 UEFI)
- 执行:开机 → 主板固件(BIOS 或 UEFI)从 ROM 加载并运行
- 主要工作:
- Power-On Self-Test(POST):检查 CPU、内存、显卡、主板等硬件基本可用性
- 枚举硬件设备、初始化时钟、内存控制器等
- 读取固件设置中的 Boot Order(启动顺序)
- 找到第一个可引导设备(通常是 EFI 系统分区或传统 MBR 磁盘的第一个扇区)
Debian 常见注意点:
- UEFI 模式下需要 EFI 系统分区(FAT32,挂载在 /boot/efi)
- Secure Boot 开启时,需使用已签名的 shim + grub + 内核(Debian 默认提供 signed 版本)
2. 引导加载器阶段(Bootloader)
Debian 默认使用 GRUB2(GRand Unified Bootloader)。
- UEFI 路径:固件 → EFI/BOOT/BOOTX64.EFI(shim) → grubx64.efi → grub.cfg
- Legacy BIOS 路径:MBR(第一扇区) → stage1 → /boot/grub → grub.cfg
GRUB 主要做的事:
- 显示启动菜单(可按 Shift / Esc 强制显示)
- 加载用户选择的内核(vmlinuz-)和 initramfs(initrd.img-)
- 传递内核命令行参数(cmdline):root=、quiet、splash、ro、systemd.unit=rescue.target 等
- 把控制权交给内核
Debian 特色:
- 内核和 initramfs 通常放在 /boot
- 更新内核后自动运行 update-grub 生成新 grub.cfg
- 可通过 /etc/default/grub 调整超时、默认项、隐藏菜单等
3. 内核初始化阶段(Kernel + initramfs)
- 内核解压并加载到内存
- 执行内核自解压代码 → 进入内核启动流程
关键步骤:
- 早期解压 & 初始化:CPU、内存管理、中断、调度器、控制台
- 加载 initramfs(临时根文件系统,cpio + gzip/xz 压缩)
- 包含必要的模块(存储控制器、文件系统、RAID、LVM、加密等)
- 运行 /init 脚本(通常是 systemd 或 busybox init)
- initramfs 阶段主要工作:
- 加载模块(modprobe)
- 组装 RAID / LVM / dm-crypt
- 挂载真实根文件系统(switch_root)
- 切换到真实根(pivot_root 或 switch_root)
- 内核执行 /sbin/init(在 Debian 中是 /lib/systemd/systemd 的符号链接)
Debian 常见问题点:
- initramfs 缺少模块 → 无法挂载根分区(常见于手动编译内核、迁移磁盘)
- update-initramfs -u -k all 修复
4. systemd 初始化阶段(用户空间 PID 1)
systemd 以 PID 1 身份启动,是所有进程的祖先进程。
systemd 启动大阶段(按依赖顺序,非严格串行):
| 阶段(Target) |
主要内容 |
是否必须等待 |
典型依赖关系 / 说明 |
| sysinit.target |
基本系统初始化(swap、时钟、加载模块等) |
是 |
最早的同步点 |
| basic.target |
基础系统就绪(日志、tmpfs、设备等) |
是 |
大部分服务的前提 |
| local-fs.target |
本地文件系统挂载(/、/var、/usr 等) |
是 |
fstab 中的本地 fs |
| swap.target |
激活交换分区/文件 |
可选 |
— |
| cryptsetup.target |
解密加密分区(LUKS) |
可选 |
— |
| remote-fs.target |
远程文件系统(NFS、CIFS 等) |
可选 |
— |
| network.target |
网络基本就绪(不保证在线) |
— |
很多服务“Want”而非“Require” |
| multi-user.target |
完整多用户文本模式(服务器默认目标) |
— |
大多数服务器在这里结束 |
| graphical.target |
图形界面(桌面环境默认目标) |
— |
桌面安装时 default.target → graphical.target |
default.target 是开机最终目标,通常是:
- 服务器 → multi-user.target(别名 /etc/systemd/system/default.target)
- 桌面 → graphical.target
并行化是 systemd 的核心优势:
- 依赖关系(Requires / Wants / After / Before)
- socket activation(按需启动)
- 设备触发(udev 事件)
5. 启动完成 & 登录阶段
- 到达 default.target 后,systemd 认为启动基本完成
- 启动 getty(控制台登录提示)或 display-manager(gdm / sddm / lightdm 等)
- 出现登录界面 / tty1 提示符
查看启动时间与瓶颈(最常用诊断命令):
- systemd-analyze → 总体时间
- systemd-analyze blame → 每个单元耗时排序
- systemd-analyze critical-chain → 最长依赖链
- systemd-analyze plot > boot.svg → 可视化 SVG 图
总结:Debian systemd 启动流程简要链路
电源 → Firmware (BIOS/UEFI) → GRUB → Kernel + initramfs → switch_root → /lib/systemd/systemd (PID 1) → sysinit.target → basic.target → local-fs.target → multi-user.target/graphical.target → getty / display-manager → 登录提示
掌握关键点:
- 想改启动目标:systemctl set-default multi-user.target
- 进 rescue / emergency:内核参数加 systemd.unit=rescue.target 或 emergency.target
- 想看详细日志:journalctl -b -1(上一次启动)
- 启动卡住:systemd-analyze blame + journalctl -b -p err
有具体想深入的部分(initramfs 定制、grub 救援、systemd 单元依赖关系、加速启动技巧、服务器最小化启动等),欢迎继续评论区留言,一起探讨。