- 后端
- 文档
- 教程
【免费下载链接】system-design-101
Explain complex systems using visuals and simple terms. Help you prepare for system design interviews.
几乎每一位软件工程师都用过 Linux,但只有少数人真正理解它的启动流程是如何运转的。本文以 system-design-101 仓库中的 linux-boot-process-explained.md 为核心骨架,将开机过程中的固件、引导加载器、内核、systemd 与用户态初始化拆解为 8 个阶段,并结合仓库内相关的 Linux 知识文档,帮助读者建立从硬件加电到登录界面出现的完整心智模型——无论是排查启动故障、阅读内核日志,还是备战系统设计面试,这套流程都是必须掌握的基础功。
整体脉络:一次启动就是一次"接力赛"
Linux 启动流程本质上是一条接力链:固件 → 引导加载器 → 内核 → 用户空间。每一环只负责把控制权交给下一环,自己并不完成全部工作。原文档用 8 个 Step 概括了这一过程:
| 阶段 | 责任主体 | 核心动作 |
|---|---|---|
| Step 1 | BIOS/UEFI 固件 | 从非易失性存储器加载并执行 POST 自检 |
| Step 2 | BIOS/UEFI | 探测 CPU、内存、存储等连接设备 |
| Step 3 | BIOS/UEFI | 选择启动设备(硬盘 / 网络 / CD ROM) |
| Step 4 | 引导加载器(GRUB) | 弹出菜单,选择操作系统或内核 |
| Step 5 | Linux 内核 | 初始化完成,切换到用户空间,启动 systemd |
| Step 6 | systemd | 激活默认 target 及相关单元 |
| Step 7 | 启动脚本 | 执行启动脚本并配置运行环境 |
| Step 8 | 系统 | 呈现登录窗口,系统就绪 |
下面逐阶段展开,并补充每一步背后"为什么这样做"的原理。
Step 1:加电与 POST 自检——固件从非易失性存储器中醒来
按下电源键后,**BIOS(Basic Input/Output System,基本输入输出系统)或UEFI(Unified Extensible Firmware Interface,统一可扩展固件接口)**固件会从非易失性存储器(如主板上的 NOR Flash / SPI Flash)中被加载,并立即执行POST(Power On Self Test,加电自检)。
POST 的作用是快速验证 CPU、内存控制器、总线、显卡等核心硬件是否处于可工作状态。如果检测到致命故障(例如内存条未插好),系统通常会以蜂鸣声编码或屏幕错误信息的形式停机(halt),而不是继续引导。传统 BIOS 运行在 16 位实模式下,而现代 UEFI 运行在 32/64 位保护模式下,能访问更大的固件存储(如 FAT 分区中的 .efi 文件),这也是 UEFI 逐渐取代 BIOS 的原因之一。
Step 2:设备探测——盘点这台机器"有什么"
POST 通过之后,固件开始检测连接到系统的设备,包括:
- CPU:读取型号、缓存与特性位,用于后续初始化;
- RAM:探测内存容量、通道与 ECC 状态;
- 存储:识别 SATA/NVMe 硬盘、SSD、U 盘;
- 外设:键盘、鼠标、显卡、网卡等。
UEFI 在此阶段还会初始化其驱动栈(UEFI Driver),并可能通过 ACPI 表(高级配置与电源接口表)向操作系统描述硬件拓扑。这一步的结果会被记录在固件维护的设备列表中,供后续选择启动设备使用。
Step 3:选择启动设备——决定"从哪儿开始"
固件按照可配置的**启动顺序(Boot Order)**选择一个启动设备。原文档明确指出,这个设备可以是:
- 硬盘(Hard Drive):最常见,从引导扇区或 EFI 系统分区启动;
- 网络服务器(Network Server):即 PXE(Preboot eXecution Environment)网络引导,常用于无盘工作站、数据中心批量装机;
- CD ROM:传统安装介质,现在也常被 U 盘取代。
在传统 BIOS 机器上,固件读取硬盘第一个扇区(MBR,主引导记录)或卷引导记录;在 UEFI 机器上,固件则直接扫描 EFI 系统分区(ESP,通常是 FAT32)中的启动项。进入启动顺序设置的常见方式是按 Del / F2 / F12 等按键——不同主板厂商的按键不同。
Step 4:引导加载器接管——GRUB 的菜单与多内核支持
选定启动设备后,BIOS/UEFI 运行引导加载器(Boot Loader)。原文档点名的GRUB(GRand Unified Bootloader)是最主流的实现(当前广泛使用 GRUB 2)。
GRUB 提供了一份菜单,让用户选择:
- 启动哪个操作系统(多系统共存场景,如 Linux 与 Windows 双启动);
- 启动哪个内核(同一发行版可安装多个版本内核,回退到旧内核是排障的常用手段);
- 给内核传递什么启动参数(如
single进入单用户维护模式、nomodeset禁用显卡驱动等)。
GRUB 加载内核映像(vmlinuz-*)与初始内存盘(initrd/initramfs)到内存后,把控制权交给内核。initramfs 中包含了挂载真实根文件系统(rootfs)所需的驱动程序与工具,是内核能够"找到根分区"的关键。
Step 5:内核就绪,切换到用户空间——systemd 成为 1 号进程
内核(Kernel)完成初始化(内存管理、调度器、驱动、挂载 initramfs 并切换到真正的根文件系统)之后,系统进入用户空间(User Space)。原文档明确指出:
内核将systemd启动为第一个用户空间进程,由它来管理进程与服务、探测剩余硬件、挂载文件系统并运行桌面环境。
这里有两个关键机制值得展开:
第一,进程编号(PID)的约定。systemd 作为第一个用户空间进程,获得PID 1。PID 1 是所有用户态进程的祖先,承担"收养孤儿进程"和"接收内核转交的信号"的职责——这正是 Linux 上 PID 1 进程被杀死会导致系统崩溃(内核 panic)的原因。
第二,systemd 的职责分工。相比传统 SysVinit 顺序执行脚本的方式,systemd 采用并行启动与按需激活,显著缩短启动时间。它负责:
- 探测并初始化剩余硬件(配合 udev 设备管理);
- 按
/etc/fstab挂载文件系统(如/、/home、/tmp); - 启动各种守护进程(daemon):网络(NetworkManager/systemd-networkd)、日志(journald)、cron、SSH 等;
- 运行显示管理器(Display Manager)进而启动桌面环境。
与本文配套,仓库中的 5-important-components-of-linux.md 介绍了 Linux 的系统、内存、进程、网络、存储五大核心组件,可作为理解内核职责的背景知识;linux-file-system-explained.md 则讲解了 Filesystem Hierarchy Standard(FHS),可帮助你理解 Step 5 中"挂载文件系统"的对象与布局。
Step 6:systemd 激活默认 target——启动的"终点状态"
原文档指出:
systemd 默认激活default.target单元,同时也会执行其他分析(依赖)单元。
这是理解 systemd 引导模型的核心概念。systemd 不再使用 SysVinit 的"运行级别(runlevel 0–6)",而是用target 单元表示一组状态的集合,并通过**单元依赖图(dependency graph)**组织:
default.target:通常符号链接到graphical.target(图形多用户)或multi-user.target(命令行多用户);multi-user.target:非图形化的多用户运行环境,服务器场景最常见;rescue.target与emergency.target:维护与紧急模式,用于系统修复;reboot.target、poweroff.target:对应重启与关机。
systemd 会递归解析default.target依赖的所有单元(服务*.service、挂载*.mount、设备*.device、套接字*.socket等),在满足依赖顺序的同时最大化并行度。启动过程中可以随时用systemctl list-units、systemctl status、journalctl -b查看各单元的状态与日志,这也是排障"卡在启动哪一步"的核心手段。
Step 7:启动脚本与环境配置——把系统"调校"到可用状态
在 target 激活过程中,systemd 会执行一组启动脚本(startup scripts)并配置运行环境,包括但不限于:
- 设置主机名、时区、locale 等基础系统属性;
- 应用
/etc/sysctl.conf中的内核参数; - 初始化安全策略(如 SELinux/AppArmor 标签加载);
- 配置网络接口、防火墙规则与路由;
- 启动用户会话管理相关的服务(如 dbus、logind)。
习惯上,管理员自定义的启动逻辑可以放在/etc/rc.local(传统方式,需显式启用),或者更推荐写成独立的 systemd service 单元并声明依赖关系。这一阶段完成后,系统服务已就绪,但还缺少"人"的接入。
Step 8:登录窗口——系统就绪的信号
最后一步,系统向用户呈现登录窗口(Login Window):
- 图形环境:显示管理器(GDM / SDDM / LightDM 等)呈现图形登录界面,验证通过后启动桌面会话;
- 纯命令行:终端上呈现
login:提示符(由 getty / agetty 提供),通过 TTY 登录; - 远程登录:等待 SSH 服务接受连接。
用户认证通过后,PAM(可插拔认证模块)完成身份验证与会话初始化,用户得到 shell。至此,系统完全就绪——从按下电源键到可以交互,整条链路闭环。
总结:一条链路,三类故障排查入口
Linux 启动流程的 8 个阶段可以归结为三句核心结论:
- 硬件层(Step 1–3):固件负责自检、探测与选择启动设备,故障多表现为"无显示/蜂鸣/找不到启动介质";
- 内核层(Step 4–5):GRUB 加载内核与 initramfs,内核初始化后交出控制权,故障多表现为内核 panic 或挂载根文件系统失败;
- 用户空间层(Step 6–8):systemd 按依赖图激活 target、执行脚本、呈现登录界面,故障排查入口是
systemctl与journalctl。
结合本仓库的 linux-boot-process-explained.md、5-important-components-of-linux.md 与 linux-file-system-explained.md,你可以把"启动流程"与"内核五大组件""文件系统标准"这三块知识串成完整的 Linux 基础体系——这也是系统设计面试中考察操作系统基本功时最常见的话题组合。
- 后端
- 文档
- 教程
【免费下载链接】system-design-101
Explain complex systems using visuals and simple terms. Help you prepare for system design interviews.
相关推荐
system-design-101 图解:URL 的完整结构拆解——从 Scheme 到 Fragment 的每一段都有何用
system design 101 图解:URL 的完整结构拆解——从 Scheme 到 Fragment 的每一段都有何用 当你把一串字符敲进浏览器地址栏并按
后端文档教程System Design 101 系列:改变世界的 15 个开源项目——从 Linux 到 Kubernetes 的开源版图
System Design 101 系列:改变世界的 15 个开源项目——从 Linux 到 Kubernetes 的开源版图 开源软件是当代软件工程的地基:从
后端文档教程深入掌握 MCP Python SDK 的 Resolve 依赖注入:让工具参数只来自可信来源
深入掌握 MCP Python SDK 的 Resolve 依赖注入:让工具参数只来自可信来源 导读 本文围绕官方 Python SDK for Model C
后端文档教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考