引言
Linux 启动流程是硬件初始化、固件引导、内核加载与用户空间启动的有机结合,涉及 BIOS/UEFI、引导加载程序、内核进程、文件系统等多个关键组件。
本文将以 "三阶段框架" 为基础,拆解从上电到用户登录的每一个核心步骤,厘清各组件的协作机制与底层原理。

第一阶段:上电与固件初始化(硬件到引导准备)

当计算机接通电源后,系统首先完成硬件重置与固件初始化,为后续引导过程铺路,这一阶段分为上电重置 和BIOS/UEFI 固件执行两步。
1.1 上电重置:CPU 的初始指令执行

在 x86 架构系统中,上电后硬件会自动完成两项关键操作:
- 内存映射:将 1MB 地址空间的顶部 64KB(0xF0000~0xFFFFF)分配给 ROM(只读存储器),其中存储着 BIOS/UEFI 固件程序;
- 寄存器初始化:CPU 将代码段寄存器(CS)设为 0xFFFF,指令指针寄存器(IP)设为 0x0000,因此第一条执行指令指向 0xFFFF0 地址 ------ 恰好位于 ROM 的 BIOS/UEFI 代码区域;
- 指令跳转:0xFFFF0 地址处的 JMP 指令会引导 CPU 执行 ROM 中的固件初始化代码,正式启动 BIOS/UEFI 流程。
1.2 BIOS/UEFI 固件的核心工作
固件(BIOS 或 UEFI)是硬件与操作系统之间的桥梁,其核心职责包括:
- 硬件自检(POST):检测内存、硬盘、CPU、外设等硬件是否正常工作,若检测失败则通过蜂鸣码或屏幕提示报错;
- 固件初始化:加载固件自带的驱动程序,使固件能与硬件设备交互;
- 启动设备选择:根据预设启动顺序(如硬盘、USB、光盘)或用户手动选择,识别可启动介质;
- 引导加载程序加载:从启动介质的指定分区(如 MBR 扇区或 EFI 系统分区)读取引导加载程序(Bootloader)到内存,随后将系统控制权移交。
注:BIOS 是传统固件标准,UEFI 是现代替代方案,支持更大硬盘容量和更快启动速度,二者核心功能一致,但 UEFI 通过 EFI 系统分区(ESP)存储引导程序(.efi 文件),而非 BIOS 依赖的 MBR。
第二阶段:引导加载(从固件到内核的衔接)
引导加载程序(Bootloader)是衔接固件与 Linux 内核的关键组件,核心任务是找到并加载内核文件,主流实现为 GRUB2。这一阶段涉及 MBR/EBR/VBR 分区引导和 GRUB2 的具体执行流程。
2.1 MBR/EBR/VBR:分区引导的底层逻辑
固件移交控制权后,首先读取启动介质的主引导记录(MBR) ------ 位于硬盘第一个扇区(512 字节),分为两部分:
- 主引导代码(446 字节):存储简化版引导程序,负责查找操作系统所在分区;
- 分区表(64 字节):记录硬盘的主分区、扩展分区信息,最多支持 4 个主分区。
根据操作系统安装位置,引导流程分为两种情况:
- 操作系统在主分区:MBR 引导代码加载该主分区的卷引导记录(VBR) ,由 VBR 中的引导程序继续执行;
- 操作系统在逻辑分区:MBR 引导代码先查找扩展分区表,找到扩展引导记录(EBR) 所在分区,再将控制权移交 EBR 的引导程序。
2.2 GRUB2:主流引导加载程序详解
GNU GRUB2(Grand Unified Bootloader)是 Linux 系统默认的多系统引导程序,支持选择不同内核版本或操作系统,核心特性与加载流程如下:
2.2.1 GRUB2 核心特性
- 多系统支持:可在同一计算机中引导 Linux、Windows 等多个操作系统;
- 内核参数传递:启动时可向 Linux 内核传递自定义参数(如调试模式、根分区指定);
- 配置与安装:
生成配置文件:grub2-mkconfig -o /boot/grub2/grub.cfg(自动扫描系统内核与启动项);
安装到硬盘:grub2-install /dev/sda(将 GRUB2 引导代码写入 MBR 或 EFI 分区)。
2.2.2 GRUB2 加载流程
- 加载 boot.img:BIOS/UEFI 将 MBR 中的 boot.img(GRUB2 第一阶段代码)加载到内存 0x7c00 地址执行;
- 加载 core.img:boot.img 通过 diskboot.img 模块读取硬盘中的 core.img(GRUB2 核心镜像),包含 lzma_decompress.img(解压缩程序)、kernel.img(GRUB2 内核)和各类功能模块;
- 切换到保护模式:实模式(1MB 地址空间)无法容纳核心镜像,lzma_decompress.img 调用real_to_prot函数切换到保护模式,突破内存寻址限制;
- 显示启动菜单:GRUB2 内核加载完成后,读取grub.cfg配置文件,显示内核版本列表(如 CentOS 的 3.10 内核),等待用户选择;
- 加载内核与 initramfs:用户选择后,GRUB2 将 Linux 内核(/boot/vmlinuz)和初始 RAM 文件系统(/boot/initramfs)加载到内存,随后将控制权移交内核。
第三阶段:Linux 内核与用户空间启动(系统核心初始化)
内核接管控制权后,完成硬件初始化、进程创建、文件系统挂载,最终进入用户登录界面,这是启动流程的核心阶段,分为内核初始化 、进程创建 、文件系统挂载 、用户登录四大环节。
3.1 内核加载与初始化
内核(vmlinuz)是压缩的内核镜像,加载后首先完成:
- 内核解压:lzma_decompress.img 协助解压内核到内存;
- 硬件初始化:通过start_kernel()函数初始化 CPU、内存、中断控制器、存储设备等硬件,加载内核驱动;
- 内存管理初始化:mm_init()建立页表、虚拟内存映射;
- 中断系统初始化:trap_init()配置中断向量表,使系统能响应硬件中断;
- 虚拟文件系统(VFS)初始化:vfs_caches_init()搭建 rootfs(基于内存的临时文件系统)框架。
3.2 0 号与 1 号进程:系统进程的 "基石"
内核初始化完成后,通过rest_init()函数创建核心进程,形成系统进程树的根:
3.2.1 0 号进程(swapper/idle):创世进程
- 基本属性:PID=0,由内核代码静态定义(struct task_struct init_task = INIT_TASK(init_task)),无用户空间程序,不显示在ps进程列表中;
- 核心职责:
系统启动初期完成内核初始化(如调度器schedule_init()、内存管理mm_init());
通过kernel_thread()创建 1 号进程(init/systemd)和 2 号进程(kthreadd,内核线程管理器);
进程创建后蜕化为 idle 进程,当 CPU 无任务时运行,使 CPU 进入低功耗模式。
3.2.2 1 号进程(init/systemd):用户空间根进程
- 基本属性:PID=1,由 0 号进程 fork 创建,是所有用户空间进程的直接 / 间接父进程;
- 核心职责:
初始化用户空间:挂载真实根文件系统、启动系统服务(网络、日志、SSH 等);
收养孤儿进程:防止子进程成为僵尸进程;
系统启动关键:若 1 号进程终止,内核触发kernel panic(系统崩溃)。
3.2.3 init 进程的演变
1 号进程的实现随 Linux 发行版迭代升级,主要分为三代:
- SysV init:CentOS 5 及之前版本,配置文件/etc/inittab,按运行级别(runlevel 0-6)启动服务;
- Upstart:CentOS 6,兼容/etc/inittab,新增/etc/init/*.conf配置文件,支持事件驱动启动;
- Systemd:CentOS 7 及之后主流版本,配置文件位于/usr/lib/systemd/system/和/etc/systemd/system/,支持并行启动、按需加载,替代传统 init。
3.3 ramdisk:临时文件系统的过渡作用
1 号进程启动初期,真实根文件系统(如硬盘上的 ext4)尚未挂载,而访问硬盘需要驱动支持 ------ 为解决 "驱动在文件系统中,文件系统需要驱动访问" 的矛盾,内核引入ramdisk(内存文件系统) :
- 内核加载时,将initramfs(打包的 ramdisk 镜像)解压到内存,作为临时根文件系统;
- ramdisk 中包含/init程序,负责加载硬盘驱动、检测并挂载真实根文件系统;
- 真实根文件系统挂载完成后,/init启动真实文件系统中的 1 号进程(如/sbin/init或/usr/lib/systemd/systemd),ramdisk 完成过渡使命。
3.4 fstab:自动挂载文件系统
系统启动过程中,1 号进程会读取/etc/fstab配置文件,自动挂载硬盘分区、U 盘等存储设备,fstab每行包含 6 个字段,含义如下:
|-------------------|----------|------------------|------------------|--------------------|-----------------|
| 字段 1 | 字段 2 | 字段 3 | 字段 4 | 字段 5 | 字段 6 |
| 设备标识(UUID / 设备文件) | 挂载点(空目录) | 文件系统类型(ext4/xfs) | 挂载参数(如 defaults) | dump 备份设置(0 = 不备份) | 磁盘检查顺序(0 = 不检查) |
3.5 运行级别:系统启动状态控制
Linux 通过运行级别(runlevel) 定义系统启动后的状态,由 1 号进程管理:
- runlevel 0:关机状态;
- runlevel 1:单用户模式(维护模式,无网络,仅 root 登录);
- runlevel 3:多用户文本模式(无图形界面);
- runlevel 5:多用户图形模式(默认桌面环境);
- runlevel 6:重启状态。
Systemd 中用 "目标(target)" 替代传统运行级别,如multi-user.target对应 runlevel 3,graphical.target对应 runlevel 5。
3.6 用户登录:终端与身份验证
系统启动完成后,进入用户登录阶段,Linux 支持多种终端类型和登录方式:
3.6.1 终端类型
- /dev/console:控制台终端,内核输出信息直接显示于此;
- /dev/tty1~tty6:虚拟终端,通过Ctrl+Alt+F1~F6切换,tty1 通常为图形终端,tty2~tty6 为文本终端;
- /dev/pts/N:伪终端,SSH 连接、图形界面下的终端模拟器(如 GNOME Terminal)均使用伪终端。
3.6.2 登录方式
- 命令行登录:通过 tty2~tty6 或 SSH,输入用户名和密码验证;
- 图形登录:通过 tty1 的图形界面(如 GNOME、KDE),选择用户并输入密码登录。
登录成功后,系统为用户创建 shell 进程(如 bash),用户可通过 shell 执行命令,Linux 启动流程正式完成。
总结:Linux 启动流程全景图
Linux 启动的本质是 "硬件→固件→引导程序→内核→用户空间" 的控制权逐步移交过程,核心链路可概括为:
上电重置 → BIOS/UEFI自检与引导 → GRUB2加载内核与initramfs → 内核初始化(start_kernel)→ 0号进程创建1/2号进程 → ramdisk挂载真实根文件系统 → 1号进程(systemd/init)启动系统服务 → fstab自动挂载设备 → 进入运行级别 → 用户登录
理解这一流程,对于系统运维(如启动故障排查、内核参数调整)和底层开发(如驱动调试、进程管理)至关重要。