Skip to content

操作系统启动流程 (Boot Process)

一、整体启动流程概览

计算机从按下电源键到 OS 完全运行,要经历以下几个阶段:

┌─────────────────────────────────────────────────┐
│ 阶段 1: 硬件上电与 CPU 复位                       │
│   按下电源 → ATX 启动 → CPU 复位                 │
├─────────────────────────────────────────────────┤
│ 阶段 2: 固件阶段 (BIOS / UEFI)                   │
│   POST 自检 → 硬件初始化 → 找启动设备            │
├─────────────────────────────────────────────────┤
│ 阶段 3: 引导加载器 (Bootloader)                  │
│   GRUB / systemd-boot / BOOTMGR 等               │
├─────────────────────────────────────────────────┤
│ 阶段 4: 内核加载与初始化                          │
│   加载内核镜像 → 解压 → 内核初始化               │
├─────────────────────────────────────────────────┤
│ 阶段 5: 用户空间启动 (init)                      │
│   init / systemd 启动系统服务                     │
├─────────────────────────────────────────────────┤
│ 阶段 6: 用户登录 / GUI                           │
│   登录管理器 → Shell / 桌面                      │
└─────────────────────────────────────────────────┘

二、阶段 1: 硬件上电与 CPU 复位

1.1 电源启动

  • 按下电源键
  • ATX 电源 启动,向主板各部分供电
  • PS_ON# 信号 由电源管理芯片控制
  • 各路电压稳定后,主板向 CPU 发出 PWRGOOD 信号
  • CPU 收到 PWRGOOD 后开始执行

1.2 CPU 复位

  • CPU 内部所有寄存器恢复初始值
  • CS:IP = 0xF000:0xFFF0(实模式,20 位地址)
  • 物理地址 = 0xFFFFFFF0 (4GB 空间顶部)
  • 跳转到固件第一条指令
  • 早期 x86 从 0xFFFFFFF0 开始,现代 CPU 复位地址可在固件配置

1.3 关键时序

T+0ms:   按下电源
T+100ms: ATX 各路电源稳定
T+200ms: PWRGOOD 信号有效,CPU 复位释放
T+200ms: CPU 从 0xFFFFFFF0 开始执行
T+???:   POST 自检开始

三、阶段 2: 固件阶段 (BIOS / UEFI)

2.1 BIOS vs UEFI

维度 BIOS (Legacy) UEFI
全称 Basic I/O System Unified Extensible Firmware Interface
模式 16 位实模式 32/64 位保护模式/长模式
启动方式 MBR (512 字节) GPT + ESP + .efi
最大磁盘 2 TB 9.4 ZB
启动速度 慢 快(并行初始化)
图形界面 文本 GUI(支持鼠标)
安全启动 无 Secure Boot
启动阶段 SEC→PEI→...→BDS 简化(SEC→PEI→DXE→BDS→TSL→RT)

2.2 UEFI 启动阶段 (Phases)

┌────────────────────────────────────────┐
│ SEC (Security)                          │
│   CPU 初始化、最小内存、安全验证         │
│   → 移交到 PEI                         │
├────────────────────────────────────────┤
│ PEI (Pre-EFI Initialization)            │
│   内存初始化、CPU 详细初始化            │
│   → 移交到 DXE                         │
├────────────────────────────────────────┤
│ DXE (Driver Execution Environment)      │
│   驱动执行:PCIe、SATA、网络、USB        │
│   → 移交到 BDS                         │
├────────────────────────────────────────┤
│ BDS (Boot Device Selection)             │
│   选择启动设备                          │
│   → 移交到 TSL                         │
├────────────────────────────────────────┤
│ TSL (Transient System Load)             │
│   加载启动项(boot###)                 │
│   → 加载 .efi 程序                    │
├────────────────────────────────────────┤
│ RT (Runtime)                            │
│   OS 运行后,固件仍在后台提供服务        │
└────────────────────────────────────────┘

2.3 关键动作

POST (Power-On Self-Test):

  • 检测 CPU、内存、显卡、硬盘、键盘等
  • 屏幕显示厂商 Logo
  • 错误时蜂鸣报警

硬件初始化:

  • CPU 微码加载
  • 内存训练
  • PCIe 链路训练
  • SATA/NVMe 控制器初始化
  • USB 控制器初始化
  • 网卡初始化(可远程唤醒)

查找启动设备:

  • 读取 CMOS 的启动顺序
  • 在每个设备上找引导扇区
  • UEFI:遍历启动项,从 ESP 找 .efi 文件

2.4 关键地址

地址 含义
0xFFFFFFF0 CPU 复位后第一条指令(BIOS 顶部)
0x00007C00 MBR 加载到的内存地址
0x00080000~0x0009FFFF 传统 BIOS 数据区(中断向量表等)
ESP 分区 UEFI 启动分区(FAT32)

四、阶段 3: 引导加载器 (Bootloader)

4.1 Bootloader 的职责

  • 加载内核镜像到内存
  • 设置启动参数(命令行、设备树)
  • 切换到保护模式/长模式
  • 跳转到内核入口

4.2 Linux 主流 Bootloader

Bootloader 特点 适用
GRUB 2 Linux 主流,功能最丰富,图形菜单 PC、服务器
systemd-boot 简洁,与 systemd 集成 UEFI 系统
LILO 老牌,已被 GRUB 取代 老 Linux
SYSLINUX / ISOLINUX 轻量,从 ISO/U 盘启动 应急、Live CD
rEFInd 美观的 UEFI 启动管理器 桌面多系统
GRUB Legacy 老 GRUB,已废弃 旧系统
Clover / OpenCore macOS 引导(黑苹果) Hackintosh
Das U-Boot 嵌入式主流,支持 ARM/MIPS 嵌入式
RedBoot 嵌入式,小巧 老嵌入式
Barebox U-Boot 的简化版 嵌入式
EDK II / TianoCore UEFI 参考实现 UEFI 开发

4.3 GRUB 详解 (Linux 主流)

GRUB 2 (GRand Unified Bootloader 2):

  • 配置文件:/boot/grub/grub.cfg(自动生成)或 /etc/default/grub
  • 手动生成:update-grub (Debian) 或 grub2-mkconfig (RHEL)
  • 可识别多个 OS:Windows、Linux、BSD

GRUB 工作流程:

1. BIOS/UEFI 加载 GRUB stage1 (512 字节,MBR)
2. stage1 加载 stage1.5 (在 MBR 后预留区)
3. stage1.5 加载 stage2 (在 /boot/grub)
4. stage2 读 grub.cfg,显示菜单
5. 用户选择/超时默认,加载对应 OS
6. 加载内核 (vmlinuz) + initramfs
7. 移交控制权给内核

UEFI GRUB:

  • GRUB 直接作为 .efi 文件放在 ESP 分区
  • EFI/ubuntu/grubx64.efi 或 EFI/fedora/grubx64.efi
  • 通过 UEFI 启动项 (Boot####) 调用

GRUB 关键功能:

  • 图形化菜单
  • 命令行模式 (按 c 进入)
  • 救援模式
  • 多 OS 启动
  • 加密启动 (LUKS)
  • 网络启动 (PXE + TFTP)
  • 串口控制台

4.4 systemd-boot

  • UEFI 专用,简洁轻量
  • 配置文件:/boot/loader/entries/*.conf
  • 内核与 initramfs 直接放在 ESP
  • 与 systemd-boot 配套使用 loader.conf + entries

示例 entry:

title   Ubuntu 24.04
linux   /vmlinuz-6.8.0-31-generic
initrd  /initrd.img-6.8.0-31-generic
options root=UUID=xxxx ro quiet splash

4.5 嵌入式 Bootloader

U-Boot 流程:

1. ROM 加载 SPL (Secondary Program Loader)
2. SPL 初始化 DRAM,加载 U-Boot 主体
3. U-Boot 从 Flash/SD/eMMC 加载内核和 dtb
4. 跳转到内核 (zImage/Image)

U-Boot 命令:

# 在 U-Boot 命令行
setenv bootargs root=/dev/mmcblk0p2 rootwait
load mmc 0:1 0x80008000 zImage
load mmc 0:1 0x82000000 dtb
bootz 0x80008000 - 0x82000000

五、阶段 4: Linux 内核启动

5.1 内核启动的完整流程

┌─────────────────────────────────────────┐
│ 1. Bootloader 跳转到入口(head.S/head_64.S)│
│    - 设置基本段寄存器、清 BSS            │
│    - 解压内核(若 zImage)              │
│    - 进入保护模式/长模式                │
├─────────────────────────────────────────┤
│ 2. start_kernel() (init/main.c)        │
│    - 早期平台初始化                    │
│    - lockdep、RCU、调度器初始化         │
│    - 中断、定时器、内存管理初始化       │
│    - VFS、信号、进程管理初始化          │
├─────────────────────────────────────────┤
│ 3. rest_init()                         │
│    - 创建 kernel_init 线程 (PID 1 容器)│
│    - 创建 idle 进程 (PID 0)            │
│    - 调度器接管                        │
├─────────────────────────────────────────┤
│ 4. kernel_init (init/main.c)            │
│    - SMP 启动其他 CPU                   │
│    - 加载 initramfs (临时根文件系统)   │
│    - 寻找真正的根设备                  │
│    - 切换到真正的根文件系统            │
│    - 执行 /sbin/init 或 /init          │
├─────────────────────────────────────────┤
│ 5. init 进程启动                       │
│    PID 1,所有进程的祖先                 │
│    接管整个用户空间                    │
└─────────────────────────────────────────┘

5.2 关键阶段详解

(1) 入口点 head.S / head_64.S

  • x86_64:arch/x86/kernel/head_64.S
  • ARM64:arch/arm64/kernel/head.S
  • 负责:
  • 设置基本段寄存器
  • 清零 BSS 段
  • 解压内核(若用 zImage)
  • 启用分页
  • 跳转到 start_kernel()

(2) start_kernel()

调用 100+ 个初始化函数,关键的有:

函数 作用
setup_arch() 架构相关初始化(CPU、内存映射)
setup_per_cpu_areas() per-CPU 数据
boot_cpu_init() 启动 CPU 初始化
mm_init() 内存管理初始化
sched_init() 调度器初始化
init_IRQ() 中断初始化
time_init() 定时器初始化
vfs_caches_init() VFS 缓存初始化
signal_init() 信号初始化
rest_init() 启动 idle 和 init 进程

(3) kernel_init 线程

  • PID 1,所有用户态进程的祖先
  • 关键任务:
  • do_basic_setup():加载剩余驱动
  • prepare_namespace():挂载根文件系统
  • free_initmem():释放 init 段内存
  • run_init_process():执行 /sbin/init 或 /init

(4) initramfs / initrd

为什么需要:

  • 根文件系统可能不在本地盘(网络、SAN、加密)
  • 内核模块可能需要从根文件系统加载
  • 复杂存储(RAID、LVM、LUKS)需要先组装

initramfs vs initrd:

  • initrd (Initial RAM Disk):旧式,基于 ramdisk,固定大小
  • initramfs (Init RAM File System):新式,基于 tmpfs (cpio 归档),大小灵活

initramfs 工具:

  • dracut (RHEL/Fedora)
  • initramfs-tools (Debian/Ubuntu)
  • mkinitcpio (Arch)
  • booster (现代轻量替代品)

(5) PID 1 进程

Linux 内核启动 init 程序:

  • 传统 SysV init:依次启动服务
  • systemd(现代主流):并行启动、按需激活、依赖管理
  • OpenRC:Gentoo 等使用
  • runit:Void Linux 使用
  • s6:轻量替代
  • dinit:新兴轻量 init

5.3 内核启动日志(典型)

[    0.000000] Linux version 6.8.0-31-generic
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz root=UUID=xxx ro quiet splash
[    0.000000] BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
[    0.004000] Memory: 16384000K/16777216K available
[    0.050000] SMP: Total of 8 processors activated
[    0.100000] Freeing unused kernel memory: 4096K
[    0.200000] Run /init as init process
[    0.300000] systemd[1]: Starting systemd 255...
[    1.500000] systemd[1]: Reached target Multi-User System
[    1.600000] systemd[1]: Startup finished in 1.5s

六、阶段 5: 用户空间启动 (init)

6.1 传统 SysV init (老式)

运行级别 (Runlevel):

Runlevel 含义
0 关机
1 / S 单用户模式
2 多用户,无网络
3 多用户,命令行
5 多用户,图形界面
6 重启

启动流程:

  • /etc/inittab 决定默认 runlevel
  • 执行 /etc/rc.d/rc<runlevel>.d/ 下的脚本
  • 按 S/K 开头分类(Start/Kill)
  • 串行执行,慢

6.2 systemd (现代主流)

特点:

  • 并行启动(快)
  • 按需激活
  • 统一的服务管理(systemctl)
  • 依赖管理
  • 日志(journalctl)
  • cgroup 资源管理
  • 配置文件:/etc/systemd/system/、/lib/systemd/system/

systemd 启动流程:

1. systemd 作为 PID 1 启动
2. 加载配置文件
3. 触发 default.target (通常是 multi-user.target 或 graphical.target)
4. 并行启动所有依赖服务
5. 到达目标状态后,启动 login

核心概念:

  • Unit (单元):systemd 管理的对象
  • .service:服务
  • .target:目标(类似 runlevel)
  • .mount:挂载点
  • .socket:Socket
  • .timer:定时器
  • .path:路径监控
  • .device:设备
  • .swap:Swap
  • .scope:外部进程
  • .slice:cgroup 切片
  • 依赖:Requires=、Wants=、After=、Before=
  • 目标:multi-user.target(命令行)、graphical.target(图形)
  • 日志:journalctl
  • cgroup 资源管理:systemd-cgtop、systemd-cgroup

常用命令:

systemctl status nginx           # 查看状态
systemctl start nginx            # 启动
systemctl stop nginx             # 停止
systemctl restart nginx          # 重启
systemctl enable nginx           # 开机自启
systemctl disable nginx          # 关闭自启
systemctl list-units             # 列出所有 unit
systemctl list-unit-files        # 列出所有 unit 文件
systemctl daemon-reload          # 重新加载配置
journalctl -u nginx              # 查看 nginx 日志
journalctl -xe                   # 查看系统日志
systemctl reboot                 # 重启
systemctl poweroff               # 关机

systemd-bootchart:可视化启动时间分析

6.3 init 系统的对比

init 时代 特点 发行版
SysV init 1983- 串行、慢 老 RHEL、老 Debian
systemd 2010- 并行、快、按需 现代主流(几乎所有)
OpenRC 2007- 兼容 SysV,快、稳定 Gentoo、Alpine、Devuan
runit 现代 简单、快、UNIX 风格 Void Linux
s6 2010s 极小、模块化、UNIX 风格 极客
dinit 2018- 轻量、C 写的现代 init 嵌入式、新发行版

6.4 主流 Linux 发行版的 init 系统

发行版 init 系统
Ubuntu 16+ systemd
Debian 8+ systemd (替代 SysV)
RHEL/CentOS 7+ systemd
Fedora 15+ systemd
openSUSE systemd
Arch Linux systemd
Manjaro systemd
Alpine OpenRC
Gentoo OpenRC (可选 systemd)
Devuan SysV init (反 systemd)
Void Linux runit
Artix OpenRC/runit/s6
MX Linux SysV init
AntiX SysV init / runit

七、阶段 6: 用户登录与桌面

7.1 命令行登录

  • getty 启动 tty
  • login 程序提示用户输入用户名密码
  • PAM 认证
  • 启动用户 shell (bash、zsh)

7.2 图形登录

  • 显示服务器:
  • X11 (Xorg):老牌
  • Wayland:现代
    • 合成器:Mutter (GNOME)、KWin (KDE)、Sway (平铺)
  • 显示管理器 (Display Manager):
  • GDM (GNOME)
  • LightDM (Ubuntu、XFCE)
  • SDDM (KDE)
  • 登录管理器 (Login Manager):
  • GDM、LightDM、SDDM 提供登录界面
  • 输入用户名密码
  • 启动桌面会话 (GNOME、KDE Plasma、XFCE)

7.3 桌面环境启动

1. Display Manager 认证用户
2. 设置 XAUTHORITY / Wayland 权限
3. 启动用户的桌面会话
   - GNOME:gnome-shell
   - KDE Plasma:startkde
   - XFCE:startxfce4
4. 启动 panel、dock、文件管理器等
5. 用户进入桌面

八、各种 Linux 发行版的启动特点

8.1 Ubuntu

  • Bootloader:GRUB 2
  • Init:systemd
  • Initramfs:initramfs-tools
  • Display Manager:GDM
  • 启动时间:5-10 秒(SSD)
  • 配置:
  • /etc/default/grub
  • /etc/grub.d/
  • update-grub

8.2 RHEL / CentOS / Rocky / Alma

  • Bootloader:GRUB 2
  • Init:systemd
  • Initramfs:dracut
  • Display Manager:GDM
  • 特殊:
  • LVM 默认 启用
  • LUKS 可选
  • SELinux 强制模式
  • kdump 内核崩溃转储
  • tuned 系统调优 daemon
  • 命令:grub2-mkconfig -o /boot/grub2/grub.cfg

8.3 Fedora

  • Bootloader:GRUB 2
  • Init:systemd
  • Initramfs:dracut
  • Display Manager:GDM
  • 特色:
  • 最早集成 systemd 的发行版
  • 默认启用 Btrfs
  • 早期用 Wayland
  • rpm-ostree 原子化升级(Silverblue/Kinoite)

8.4 Arch Linux

  • Bootloader:GRUB / systemd-boot / rEFInd(任选)
  • Init:systemd
  • Initramfs:mkinitcpio 或 booster
  • 特色:
  • 安装时由用户自己配置所有环节
  • 学习启动流程的最佳环境
  • grub-mkconfig 或 bootctl install

8.5 Alpine

  • Bootloader:syslinux / GRUB / U-Boot(嵌入式)
  • Init:OpenRC
  • Initramfs:mkinitfs
  • 特色:
  • musl libc + BusyBox
  • 容器友好
  • 嵌入式首选

8.6 国产发行版

发行版 Bootloader Init 备注
Deepin GRUB systemd 桌面美化、DTK 自启
UOS GRUB systemd 国产化、签名验证
openEuler GRUB systemd 服务器、云
Anolis OS GRUB systemd 龙蜥、阿里云
麒麟 GRUB systemd 党政军

8.7 嵌入式 Linux

  • Bootloader:U-Boot (主流) / Barebox / RedBoot
  • Init:systemd / BusyBox init / OpenRC
  • Initramfs:BusyBox 模式
  • 典型场景:
  • 树莓派:树莓派 GPU 固件 → start.elf → kernel
  • OpenWrt:u-boot → kernel → procd init
  • Android:bootloader (lk) → kernel → init (Android init)
  • Yocto/Buildroot 自定义

九、特殊启动模式

9.1 单用户模式 (Single User Mode)

  • 用途:系统救援、密码重置、修复配置
  • 进入方式:
  • 启动菜单按 e 编辑 GRUB,加 single 或 init=/bin/bash
  • 启动时 Ctrl+S(部分发行版)
  • 救援盘启动

9.2 救援模式 (Rescue Mode)

  • GRUB 救援:grub rescue>
  • 内置救援内核
  • Live CD/USB
  • 启动到内存文件系统,不挂载原系统

9.3 紧急模式 (Emergency Mode)

  • systemd 提供的"极简模式"
  • 仅启动必要服务
  • 适合修复 fstab、网络等关键问题
  • systemd.unit=emergency.target

9.4 PXE 网络启动

1. 客户端 BIOS/UEFI 配置 PXE
2. 发送 DHCP 请求
3. DHCP 服务器分配 IP,提供 TFTP 服务器地址
4. 客户端从 TFTP 下载 PXELINUX/iPXE
5. PXELINUX 加载内核和 initramfs
6. 通过 NFS/HTTP/FTP 加载根文件系统
  • 适合无盘系统、批量部署
  • 工具:Cobbler、Foreman、FOG

9.5 安全启动 (Secure Boot)

  • UEFI 启动链验证
  • 内核、initramfs、bootloader 都有数字签名
  • 防止 bootkit 攻击
  • Linux 主流发行版都支持

9.6 加密启动 (LUKS + TPM)

  • 启动分区可加密 (LUKS)
  • 配合 TPM 自动解锁
  • 安全启动 + 加密 + 远程认证 = "measured boot"

9.7 容器启动

容器 ≠ VM,共享宿主机内核,启动极快:

# 容器启动
docker run -d nginx
# 1. dockerd 接收请求
# 2. 通过 containerd 创建容器
# 3. runC 设置 namespace + cgroup
# 4. 执行容器 entrypoint
# 整个过程 < 1 秒

启动层次对比:

启动方式 启动时间 内核
物理机 1-3 分钟 独立
虚拟机 30-60 秒 独立
容器 < 1 秒 共享
Serverless 毫秒级 共享

9.8 无盘启动

  • iSCSI、AoE、NFS 根文件系统
  • 适合云、数据中心

十、启动过程的性能优化

10.1 内核启动优化

  • defconfig + 裁剪:只编译需要的驱动
  • PREEMPT_RT 替代方案 (不推荐影响启动)
  • 内核模块异步加载
  • 减少 initcall 数量
  • initramfs 优化:只放必要的工具

10.2 systemd 启动优化

# 分析启动时间
systemd-analyze
systemd-analyze blame          # 哪个服务最慢
systemd-analyze critical-chain # 关键链
systemd-analyze plot > plot.svg # 生成时间线

# 优化方法
1. 禁用不需要的服务:systemctl disable xxx
2. 合并服务
3. 使用 socket activation 按需启动
4. 用 systemd-analyze blame 找瓶颈

10.3 启动速度对比

优化项 节省时间
替换为 systemd 10-30 秒
禁用不需要服务 1-5 秒
优化 initramfs 1-3 秒
用 SSD 5-15 秒
用 UFS 4.0 / NVMe 2-5 秒
裁剪内核 0.5-2 秒
极限优化(Embedded) 0.5-2 秒

最快记录:Linux 极限启动 < 100 ms(嵌入式定制)


十一、各平台启动流程对比

11.1 x86 PC 启动

CPU 复位 → BIOS/UEFI → POST → 找启动设备 →
MBR/GPT → GRUB → 加载内核 → init →
systemd → 用户登录

11.2 ARM (手机/嵌入式)

ROM Code → BootROM(芯片内置) → SPL →
U-Boot → 内核 + dtb → init →
systemd / Android init → 启动应用

11.3 Android 启动

Boot ROM (PBL) → ABL (Qualcomm) / LK →
Linux Kernel → Android Init (init.rc) →
zygote → System Server → Launcher (UI)

Android 特有:

  • init.rc:Android 特有的 init 脚本
  • zygote:进程孵化器,预加载 framework
  • System Server:系统服务
  • ART/Dalvik:Android Runtime
  • HAL (Hardware Abstraction Layer):硬件抽象层
  • HAL/Trusty TEE:安全相关

11.4 macOS 启动

EFI → boot.efi → kernelcache (prelinked kernel) →
launchd (PID 1) → WindowServer / LoginWindow →
GUI 登录

11.5 Windows 启动

BIOS/UEFI → BOOTMGR → winload.exe → ntoskrnl.exe →
smss.exe (Session Manager) → csrss.exe +
winlogon.exe → userinit.exe → 桌面

Windows 特有:

  • BCD (Boot Configuration Data):替代老的 boot.ini
  • winload.exe:加载器
  • smss.exe:Session Manager SubSystem
  • csrss.exe:Client/Server Runtime
  • winlogon.exe:登录

十二、关键启动工具与文件

12.1 关键文件位置

文件/目录 作用
/boot/ 启动文件目录
/boot/vmlinuz-* 压缩的内核镜像
/boot/initrd.img-* / /boot/initramfs-* 初始 RAM 文件系统
/boot/grub/grub.cfg GRUB 配置文件(自动生成)
/boot/efi/ UEFI 的 ESP 挂载点
/etc/default/grub GRUB 用户配置
/etc/grub.d/ GRUB 脚本
/etc/fstab 文件系统挂载表
/etc/systemd/system/ systemd 配置
/etc/init.d/ SysV init 脚本(legacy)
/var/log/boot.log 启动日志(若启用)
/proc/cmdline 当前内核启动参数
/proc/1/ PID 1 进程信息

12.2 关键启动参数 (kernel cmdline)

# 通过 GRUB 编辑可临时修改
# 或 /etc/default/grub 永久修改

root=UUID=xxx         # 根文件系统位置
ro                    # 启动时只读挂载根
rw                    # 读写
init=/sbin/init       # 指定 init 程序
quiet                 # 减少启动信息
splash                # 显示启动画面
nomodeset             # 禁用内核 KMS(显卡故障时)
acpi=off              # 禁用 ACPI
mem=4G                # 限制内存
single / 1            # 单用户模式
init=/bin/bash        # 直接进 bash
systemd.unit=rescue.target
systemd.unit=multi-user.target

12.3 启动相关工具

# 查看启动日志
dmesg
journalctl -b
journalctl -b -1     # 上次启动

# 内核信息
uname -a
cat /proc/cmdline
cat /proc/version

# 启动分析
systemd-analyze
systemd-analyze blame
systemd-analyze critical-chain

# 启动配置
grub-mkconfig / grub2-mkconfig
update-grub
bootctl
efibootmgr           # UEFI 启动项管理

# 重启到 UEFI
systemctl reboot --firmware-setup

# 救援模式
systemctl rescue

十三、启动故障排查

13.1 常见启动问题

故障 原因 解决
开机黑屏 显卡驱动、BIOS 设置 nomodeset、刷 BIOS
启动停在 GRUB GRUB 配置错、文件系统错 用 Live CD 修复
Kernel panic 内核/驱动 bug 加 single / 旧内核
找不到根文件系统 UUID 错、fstab 错 用旧内核、init=/bin/bash
启动卡在 init init 程序坏、依赖服务失败 rescue.target
文件系统只读 异常关机后 fsck 失败 fsck 修复
忘记 root 密码 - GRUB 加 init=/bin/bash
启动后服务都没启动 systemd 配置错 rescue.target + 日志
启动超级慢 启动项太多、磁盘慢 优化、SSD
时间不同步 没有网络时间同步 chrony / systemd-timesyncd

13.2 救援流程

1. 准备 Live USB
2. 从 USB 启动
3. mount 原系统到 /mnt
4. mount --bind /dev /mnt/dev
5. mount --bind /proc /mnt/proc
6. mount --bind /sys /mnt/sys
7. chroot /mnt
8. 在原系统中修复
   - 修复 GRUB
   - 修改 /etc/fstab
   - 重置密码
   - 重新装内核
   - 修复网络配置
9. exit
10. reboot

13.3 重置 root 密码

# 1. GRUB 菜单按 e
# 2. 找到 linux/linux16/linuxefi 行
# 3. 把 ro 改成 rw,在行末加 init=/bin/bash
# 4. Ctrl+X 启动
# 5. 进入 bash,执行:
mount -o remount,rw /
passwd root
# 6. 重启
exec /sbin/init

十四、Linux 启动与其他 OS 的对比

步骤 Linux Windows macOS
固件 BIOS/UEFI BIOS/UEFI EFI (Apple)
Bootloader GRUB / systemd-boot BOOTMGR boot.efi
加载器 内核镜像(zImage) winload.exe kernelcache
内核 Linux NT Kernel XNU (Mach+BSD)
用户态 1 systemd smss.exe launchd
GUI 启动 GDM/LightDM/SDDM winlogon loginwindow
桌面 GNOME/KDE/XFCE Explorer.exe Finder/Dock

十五、启动过程的安全

15.1 启动链安全

固件 (BIOS/UEFI) → Bootloader → 内核 → init → 服务 → 应用
   ↓                 ↓            ↓       ↓       ↓
  Secure Boot     GRUB 签名    内核签名 签名    AppArmor

15.2 安全启动 (Secure Boot)

  • UEFI 验证 bootloader 签名
  • bootloader 验证内核签名
  • 内核验证模块签名
  • 完整信任链

15.3 测量启动 (Measured Boot)

  • 启动每个组件时记录到 TPM PCR
  • 远程证明系统状态
  • 防止物理篡改

15.4 加密启动

  • LUKS 全盘加密
  • 启动时输入密码 / TPM 解锁
  • 保护静态数据

15.5 防止 Evil Maid

  • 启动前用 USB Live 检查 bootloader
  • 启用 Secure Boot
  • TPM + BitLocker / dm-verity

十六、核心要点速记

  • 6 大阶段:硬件→固件→Bootloader→内核→init→登录
  • CPU 复位后跳到 0xFFFFFFF0
  • MBR 加载到 0x7C00,魔数 0x55AA
  • UEFI 是现代标准,比 BIOS 强大
  • GRUB 2 是 Linux 主流 bootloader
  • 内核启动入口:head.S → start_kernel() → rest_init() → kernel_init
  • initramfs 由 dracut / initramfs-tools 生成
  • PID 1 = init,所有进程祖先
  • systemd 是现代主流 init,SysV 已淘汰
  • systemctl start/stop/enable/disable/status 最常用
  • systemd-analyze 分析启动时间
  • GRUB 编辑按 e + 加 single 或 init=/bin/bash 进救援
  • 重置密码:GRUB 编辑 + init=/bin/bash + passwd
  • Live CD + chroot 是万能修复手段
  • Secure Boot 防止 bootkit 攻击
  • 容器启动 < 1 秒,共享宿主机内核
  • 嵌入式启动:ROM → SPL → U-Boot → 内核
  • Android 启动:Boot ROM → bootloader → kernel → init.rc → zygote
  • 最快 Linux 启动可 < 100ms(嵌入式)
  • 典型 Linux 桌面启动 5-30 秒
  • 典型服务器启动 10-60 秒