摘要:本文深入解析现代 Linux 发行版(基于 GRUB2 + systemd)从按下电源键到登录界面的完整启动流程,涵盖 BIOS/UEFI、引导加载程序、内核初始化及 systemd 启动四个核心阶段。
一、启动流程总览
现代 Linux 系统的启动过程可分为四个连贯阶段,各阶段环环相扣,任何一环出错都会导致启动失败。
二、第一阶段:BIOS/UEFI 初始化与 POST 自检
2.1 触发条件
启动流程由以下两种操作触发:
- 冷启动
- 热启动:通过 GUI 界面或
reboot 命令重新启动系统
2.2 POST(Power-On Self Test)硬件自检
系统通电后,BIOS(Basic Input/Output System)或 UEFI(Unified Extensible Firmware Interface)固件首先接管控制权,执行全面的硬件完整性检查。
POST 检测的核心硬件包括:
自检结果处理:
- 硬件故障:屏幕显示错误信息(如 “Hard Disk Error”),或在严重故障(如内存缺失)时通过蜂鸣器发出告警音
- 硬件正常:自检通过,BIOS/UEFI 根据预设的 Boot Sequence(启动顺序) 查找可引导设备
2.3 定位引导程序
BIOS/UEFI 发现可引导设备后,读取该设备的启动扇区:
- 传统 BIOS:读取磁盘第一个扇区的 MBR(Master Boot Record,主引导记录,512 字节)
- UEFI 模式:读取 GPT(GUID Partition Table) 分区表中的 EFI 系统分区
随后从中定位并加载 Bootloader(引导加载程序,如 GRUB2)。
三、第二阶段:GRUB2 引导加载程序
3.1 引导程序演进
Linux 生态中主要出现过三代引导程序:
| | |
|---|
| | |
| | Grand Unified Bootloader 第一代 |
| GRUB2 | 当前主流 | |
3.2 GRUB2 核心功能
GRUB2 被加载到主内存(RAM)后,提供两大核心能力:
1. 操作系统/内核选择菜单
- 展示不同版本的 Linux 内核(系统升级后会保留历史内核)
- 支持通过键盘快捷键(如
e 键)临时编辑内核启动参数
2. 加载内核与临时文件系统选择内核版本
用户选定启动项后,GRUB2 执行以下操作:
- 加载 initrd(Initial RAM Disk) 或 initramfs(Initial RAM Filesystem)
- initramfs 是 initrd 的现代化继任者,效率更高
- 包含启动必需的驱动模块和工具(如磁盘控制器驱动、文件系统驱动)
- 执行 linuxrc 脚本,探测硬盘及大容量存储设备,加载相应内核模块
配置文件路径:/boot/grub2/grub.cfg(由 grub2-mkconfig 工具自动生成,不建议手动编辑)
四、第三阶段:内核初始化
内核初始化过程
4.1 内核解压与接管
内核是 Linux 系统的核心枢纽,负责硬件资源管理与进程调度。GRUB2 加载内核后:
- 内核从压缩状态(通常为
bzImage 格式)自解压
4.2 挂载根文件系统与启动 init
内核阶段的关键任务链条如下:
┌─────────────────┐ ┌─────────────────────┐ ┌──────────────────┐│ 基于 initrd/ │ --> │ 挂载真实根文件系统 │ --> │ 启动 init 进程 ││ initramfs 中的 │ │ (挂载点 "/" ) │ │ (PID = 1) ││ linuxrc 探测结果│ │ │ │ │└─────────────────┘ └─────────────────────┘ └──────────────────┘
关键概念说明:
- 根文件系统(/):用户可见的所有目录与文件的顶层挂载点,是系统运行的基础
- init 进程:内核启动的第一个用户空间进程,进程标识符固定为 PID 1
- 派生关系:系统中所有其他守护进程均由 init 进程直接或间接派生
4.3 补充:/etc/fstab 与分区挂载
init 进程启动后,会根据 /etc/fstab 文件配置,自动挂载系统中定义的其他磁盘分区(如 /home、/var 等)。
五、第四阶段:systemd 系统初始化
5.1 systemd 的定位
systemd 是现代 Linux 发行版中 SysVinit 的替代方案,作为 所有 Linux 进程的父进程(PID 1),承担以下职责:
5.2 运行目标(Target)详解
systemd 使用 target 概念替代传统 SysVinit 的 runlevel(运行级别),通过 /etc/systemd/system/default.target 文件定义系统默认启动状态。
| | |
|---|
poweroff.target | | |
rescue.target | | |
multi-user.target | | |
graphical.target | | |
reboot.target | | |
5.3 常用管理命令
# 查看当前系统目标systemctl get-default# 切换运行目标(示例:切换到多用户文本模式)sudo systemctl isolate multi-user.target# 设置默认启动目标(永久生效)sudo systemctl set-default graphical.target# 传统 init 命令兼容(仍需 sudo 权限)sudo init 3 # 切换到文本模式sudo init 6 # 重启系统sudo init 0 # 关机
5.4 启动完成
systemd 完成以下工作后,启动流程结束:
- 按依赖关系启动所有必要的守护进程(网络服务、日志服务、显示管理器等)
- 系统呈现登录界面(图形化桌面或命令行提示符),等待用户认证
六、全流程回顾
用户操作 固件/软件层 核心动作┌──────────┐ ┌─────────────┐ ┌────────────────────┐│ 按下电源 │ ----> │ BIOS/UEFI │ ----> │ POST 硬件自检 │└──────────┘ └─────────────┘ │ 定位启动设备 │ └─────────┬──────────┘ │ ┌─────────▼──────────┐ │ 读取 MBR/GPT │ │ 加载 GRUB2 │ └─────────┬──────────┘ │ ┌─────────▼──────────┐ │ GRUB2 菜单 │ │ 加载内核 + initramfs │ └─────────┬──────────┘ │ ┌─────────▼──────────┐ │ 内核自解压 │ │ 挂载真实根文件系统 │ │ 启动 init (PID 1) │ └─────────┬──────────┘ │ ┌─────────▼──────────┐ │ systemd 接管 │ │ 启动守护进程 │ │ 进入 target 目标 │ └─────────┬──────────┘ │ ┌─────────▼──────────┐ │ 登录界面/Shell 提示符 │ │ 系统就绪 │ └────────────────────┘
七、常见问题排查速查
参考资料
GRUB2 官方文档 - GNU GRUB Manual 2.12 - GNU 项目官方维护的 GRUB2 完整手册,涵盖安装配置与故障排查
UEFI 规范 - Unified Extensible Firmware Interface Specification - UEFI 论坛发布的固件接口标准规范(当前版本 2.10)
《鸟哥的 Linux 私房菜》基础学习篇 - 台湾资深 Linux 教育者鸟哥编写的经典中文教程,第 19 章详细讲解开机流程与引导加载程序
版本说明:本文基于 GRUB2 + systemd 架构编写,适用于 RHEL/CentOS 7+、Ubuntu 15.04+、Debian 8+、Fedora 等现代发行版。传统 SysVinit 或 GRUB Legacy 系统的启动流程略有差异。