操作系统启动流程 (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 秒