< 返回

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

    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 单元依赖关系、加速启动技巧、服务器最小化启动等),欢迎继续评论区留言,一起探讨。

    联系我们
    返回顶部