在现代计算机架构中,Linux 系统的启动是一场从底层硬件到上层应用的精确接力。 本文以主流 64位(x86_64)架构、UEFI 固件、GPT 分区表、systemd 为核心,深度拆解 Linux 四阶段启动内幕。

阶段一:硬件与固件层(UEFI 初始化)
按下电源键后,主板上的 UEFI 固件 最先激活,硬件层控制权开始流转。
整个过程分为三步:
硬件自检(POST):UEFI 对 CPU、内存、PCIe 总线、外接设备逐一加电自检,排查硬件故障,确认所有组件状态正常。
读取 NVRAM 启动项:UEFI 读取主板非易失性存储器中保存的启动变量。每个启动项是精确的寻址指针,记录了:物理硬盘 UUID + ESP 分区 UUID + 引导文件路径。
解析 ESP 分区:UEFI 原生支持 FAT32 文件系统,根据 NVRAM 指针直接访问硬盘 ESP 分区,定位到引导加载器文件(例如 /EFI/ubuntu/grubx64.efi)。
多系统小贴士:单块硬盘建议只保留一个全局 ESP 分区,各系统的
.efi引导文件可存放在各自子目录,由 NVRAM 统一调度,避免分区表混乱。
阶段二:引导加载器(Bootloader / GRUB2)
UEFI 把控制权移交给 ESP 分区里的引导加载器,主流发行版默认使用 GRUB2。
此时 CPU 已经运行在 64 位长模式(Long Mode)下,过程分为三步:
加载核心文件:GRUB2 内置 ext4、xfs 等常见文件系统驱动,从 /boot 目录读取压缩内核映像(vmlinuz)和初始内存文件系统(initramfs.img),解压到物理内存。
传递启动参数:GRUB2 把根分区位置(如 root=UUID=xxxxxx)、内核日志级别、运行模式等参数打包传递给内核。
跳转内核入口:GRUB2 完成使命后退出,CPU 控制权跳转到内核的 64 位物理入口点(通常位于 arch/x86/boot/compressed/head_64.S)。
阶段三:内核态初始化(Kernel / initramfs)
此时 CPU 进入特权级最高的 Ring 0 状态,Linux 内核正式唤醒,接管全部硬件资源。
整个初始化过程分为四步:
核心初始化:内核调用核心函数 start_kernel(),完成中断描述符表初始化、内核页表建立、物理内存分配器初始化等底层准备工作。
挂载临时根文件系统:为了保持内核体积精简,绝大多数硬件驱动都作为独立模块存放在硬盘上。内核先挂载 GRUB2 提前载入内存的临时根文件系统 initramfs,打破“无驱动读不了硬盘,不读硬盘拿不到驱动”的死锁。
加载驱动组装存储栈:
内核读取并加载 NVMe/SATA 驱动,识别硬盘块设备;
运行 initramfs 内的用户态工具(lvm、cryptsetup 等),激活 LVM 逻辑卷、解密加密根分区。
切换真实根分区:成功挂载真实物理根分区后,内核执行 switch_root 动作,把硬盘根分区挂载为系统根目录 /,销毁释放 initramfs 临时内存空间。
阶段四:用户态管理(systemd 调度)
内核底层准备工作完成后,退居幕后,启动系统第一个用户态进程(Ring 3 状态,PID=1)。
现代 Linux 发行版默认该进程是 /lib/systemd/systemd,负责拉起所有上层应用,过程分为三步:
并发启动服务:彻底替代传统 SysVinit 串行启动模式,systemd 根据服务依赖关系图实现最大化并行启动,充分利用多核 CPU 性能,大幅缩短开机时间。
套接字激活机制:systemd 预先为所有服务创建通信管道(Socket)。即使被依赖的服务 A 未完全启动,依赖它的服务 B 也可并发启动并发送请求,请求会暂存在 Socket 缓冲区,等服务 A 就绪后立即处理,进一步提升启动效率。
达到预设运行目标:systemd 按照配置的目标单元(Target)拉起所有后台服务:
multi-user.target:多用户纯命令行模式,适合服务器、嵌入式设备场景;
graphical.target:图形界面模式,额外拉起显示管理器(GDM/GDM3等),最终呈现用户登录桌面。
总结
Linux 启动流程是一条由 UEFI(固件) → GRUB2(引导) → Kernel/initramfs(内核) → systemd(用户态) 构成的严密控制链。 每个阶段都为下一阶段清理环境、准备资源,最终把硬件平台交付给上层用户应用。