Linux 系统启动过程详解
概述
Linux 的启动过程就像一辆老式汽车从熄火到轰鸣前进:从“钥匙转动”(开机)到“引擎点火”(内核加载),再到“油门踩下”(系统就绪)。整个过程高效、有序,通常只需几秒到几十秒。
Linux的启动不是魔法,而是模块化的设计:每个环节独立、可调试。理解这个过程,能帮助我们更好地诊断启动问题、优化系统性能,甚至在定制系统时游刃有余。这意味着如果遇到“开机黑屏”或“引导失败”,我们能快速定位问题。比如,优化 GRUB 可以加速 20% 的启动时间;精简 systemd 服务,能让服务器停止运行不必要的服务。
Linux 的启动过程通常分为几个关键阶段,从硬件初始化到用户空间的运行。需要注意的是,不同的 Linux 发行版(如 Ubuntu、CentOS)可能在细节上略有差异,但核心流程是相似的,尤其是现代系统多采用 systemd 作为初始化系统。
图1 linux系统启动过程 来自bytebytego.com
- 当我们打开电源时,BIOS(基本输入/输出系统)或 UEFI(统一可扩展固件接口)固件会从非易失性存储器加载并执行POST(开机自检)。
- BIOS/UEFI 检测连接到系统的设备,包括 CPU、RAM 和存储。
- 选择要从中启动作系统的启动设备。这可以是硬盘驱动器、网络服务器或 CD ROM。
- BIOS/UEFI 运行引导加载程序(GRUB),它提供了一个菜单来选择作系统或内核功能。
- 内核准备就绪后,我们现在切换到用户空间。内核启动 systemd作为第一个用户空间进程,它管理进程和服务,探测所有剩余硬件,挂载文件系统,并运行桌面环境。
- systemd激活默认值。默认情况下,系统启动时目标单元。其他分析单元也会执行。
- 系统运行一组启动脚本并配置环境。
- 用户将看到一个登录窗口。系统现已准备就绪。
1. BIOS/UEFI 阶段:硬件初始化
包含图1中的阶段①、阶段②和阶段③
一切从按下电源按钮**(Power On)开始。当计算机通电后,主板上的固件(Firmware)**会首先运行,固件会从非易失性存储器加载并执行 POST(Power On Self Test,开机自检 )。这取决于你的系统是使用传统的 BIOS(Basic Input/Output System)还是现代的 UEFI(Unified Extensible Firmware Interface,统一可扩展固件接口)。
- BIOS 的作用:BIOS 加载自非易失性内存(如 ROM),它会执行 POST(Power-On Self-Test)自检,检查硬件是否正常,包括 CPU、内存、硬盘等。然后,它会搜索可引导设备(如硬盘、USB),并加载第一个扇区(通常是 MBR - Master Boot Record)。
- UEFI 的优势:UEFI 是 BIOS 的升级版,支持更大的硬盘(超过 2TB)、更快的启动速度和图形界面。它使用 EFI 系统分区(ESP)来存储引导程序,而不是 MBR。UEFI 还会验证引导文件的签名,以增强安全性。
图1中阶段1和阶段2h是硬件层面的,Linux 系统本身还未介入。如果这里出问题,你可能看到黑屏或硬件错误提示。
2. Bootloader 阶段:引导加载器
包含图1中的阶段④
一旦 BIOS/UEFI 找到引导设备,它会将控制权交给 Bootloader。常见的 Bootloader 是 GRUB(Grand Unified Bootloader),尤其是 GRUB2。
GRUB 会读取配置文件(如 /etc/grub2.cfg 或 /boot/grub/grub.cfg),显示引导菜单,让用户选择内核版本或恢复模式。
然后,GRUB 加载 Linux 内核(通常是 /boot/vmlinuz-*)和初始 RAM 磁盘(initrd 或 initramfs),这是一个临时文件系统,用于加载必要的驱动(如磁盘驱动),以便内核能访问根文件系统。
Bootloader 是连接硬件和操作系统的桥梁。如果 GRUB 配置错误,系统可能无法启动。
3. Kernel 阶段:内核加载与初始化
包含图1中的阶段④
内核是 Linux 的核心,它被加载到内存中后开始执行。
内核首先解压自己,初始化硬件(如 CPU、内存管理)、加载模块,并挂载 initramfs。
然后,它会切换到根文件系统(rootfs),挂载 /sys、/proc 等虚拟文件系统,并启动第一个用户空间进程(PID 1)。
在这个阶段,你可能会看到内核消息滚动在屏幕上(如 dmesg 输出)。内核版本可以通过 uname -r 查看。
4. Init 阶段:系统初始化
包含图1中的阶段⑤⑥
现代 Linux 发行版多使用 systemd 作为 init 系统(传统的是 SysVinit 或 Upstart)。
Init 进程(/sbin/init 或 /lib/systemd/systemd)读取配置文件(如 /etc/inittab 或 systemd 的 unit 文件),并根据 runlevel(运行级别)或 target(目标)启动服务。
Runlevel 是 SysVinit 的概念,从 0(关机)到 6(重启),但在 systemd 中被 targets 取代,如 multi-user.target(多用户模式)或 graphical.target(图形界面)。
Systemd 会并行启动服务,如网络、文件系统检查、用户登录等,提高启动效率。它还会运行启动脚本,如 /etc/rc.d/* 或 systemd 的服务文件。
如果使用图形界面,这里会启动显示管理器(如 GDM、LightDM),引导到登录界面。
5. 用户空间:系统就绪
包含图1中的阶段⑦⑧
最后,系统进入用户空间,用户可以登录。Shell(如 bash)会加载配置文件(如 /etc/profile、~/.bashrc),设置环境变量。此时,系统完全可用,你可以运行命令、启动应用等。