网宝
新闻中心 / / 正文

Debian 系统启动流程详解

2026-02-23 17:34
技术部
← 返回

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 主要做的事

  1. 显示启动菜单(可按 Shift / Esc 强制显示)
  2. 加载用户选择的内核(vmlinuz-)和 initramfs(initrd.img-
  3. 传递内核命令行参数(cmdline):root=、quiet、splash、ro、systemd.unit=rescue.target 等
  4. 把控制权交给内核

Debian 特色

  • 内核和 initramfs 通常放在 /boot
  • 更新内核后自动运行 update-grub 生成新 grub.cfg
  • 可通过 /etc/default/grub 调整超时、默认项、隐藏菜单等

3. 内核初始化阶段(Kernel + initramfs)

  • 内核解压并加载到内存
  • 执行内核自解压代码 → 进入内核启动流程

关键步骤

  1. 早期解压 & 初始化:CPU、内存管理、中断、调度器、控制台
  2. 加载 initramfs(临时根文件系统,cpio + gzip/xz 压缩)
    • 包含必要的模块(存储控制器、文件系统、RAID、LVM、加密等)
    • 运行 /init 脚本(通常是 systemd 或 busybox init)
  3. initramfs 阶段主要工作
    • 加载模块(modprobe)
    • 组装 RAID / LVM / dm-crypt
    • 挂载真实根文件系统(switch_root)
    • 切换到真实根(pivot_root 或 switch_root)
  4. 内核执行 /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 单元依赖关系、加速启动技巧、服务器最小化启动等),欢迎继续评论区留言,一起探讨。

QQ客服 提交工单