Linux 系统的启动过程是一个精密且环环相扣的链式流程,从按下电源键到最终进入用户登录界面,主要经历了以下五个核心阶段。
🚀 阶段一:BIOS/UEFI 固件初始化
这是启动流程的物理起点,由主板上的固件负责,与操作系统无关。
- 加电自检 (POST):计算机通电后,固件(BIOS 或其继任者 UEFI)首先执行 POST,检测 CPU、内存、显卡等核心硬件是否正常。
- 初始化硬件:设置系统时钟、中断,并初始化键盘、鼠标等基本外设。
- 选择启动设备:固件根据预设的启动顺序(如硬盘、U盘、网络),查找并锁定第一个可用的启动设备。
BIOS vs UEFI
- BIOS:传统固件,使用 MBR 分区表,支持硬盘最大 2TB,启动过程为串行,速度较慢。
- UEFI:现代固件,使用 GPT 分区表,支持超大硬盘,启动更快,并提供安全启动(Secure Boot)等高级功能。
🎛️ 阶段二:引导加载程序 (Bootloader)
固件将控制权交给引导加载程序,它充当了固件与操作系统内核之间的桥梁。Linux 系统中最主流的引导加载程序是 GRUB (GRand Unified Bootloader)。
- 加载位置 :
- BIOS 模式:从硬盘的第一个扇区(主引导记录 MBR)加载 GRUB。
- UEFI 模式:从专门的 EFI 系统分区(ESP)中加载 GRUB。
- 核心任务 :
- 显示启动菜单:提供一个界面,允许用户选择要启动的内核版本或操作系统(在双系统环境中非常有用)。
- 加载内核与 initramfs :根据用户选择,将 Linux 内核镜像(
vmlinuz)和一个临时的根文件系统镜像(initramfs或initrd)加载到内存中。 - 移交控制权:将 CPU 的控制权正式移交给 Linux 内核。
🐧 阶段三:Linux 内核初始化
内核被加载到内存后,开始接管系统,并进行全面的初始化。
- 硬件探测与驱动加载:内核识别 CPU、内存、硬盘、网络设备等所有硬件,并加载相应的驱动程序。
- 挂载 initramfs :内核首先挂载
initramfs。这是一个临时的根文件系统,其中包含了挂载真实根文件系统所必需的驱动和工具(例如 LVM、RAID 或特定文件系统的驱动)。 - 挂载真实根文件系统 :利用
initramfs中的工具,内核根据启动参数找到并挂载硬盘上真正的根文件系统(/)。 - 启动 init 进程 :完成根文件系统的挂载后,内核启动用户空间的第一个进程------
init进程(其进程 ID 恒为 1)。
⚙️ 阶段四:init 系统与服务管理
init 进程是所有其他用户空间进程的"鼻祖",负责启动和管理系统服务。现代 Linux 发行版(如 CentOS 7+, Ubuntu 16.04+)普遍采用 systemd 作为默认的 init 系统,它取代了传统的 SysVinit。
systemd的核心概念 :- 目标 (Target) :
systemd使用"目标"来替代传统SysVinit的"运行级别 (Runlevel)"。例如:multi-user.target:对应运行级别 3,即多用户命令行模式,是服务器的常用模式。graphical.target:对应运行级别 5,即多用户图形界面模式。
- 并行启动 :
systemd能够并行启动多个服务,显著加快了系统的启动速度。
- 目标 (Target) :
- 核心任务 :
systemd根据默认的目标(可通过systemctl set-default命令设置),依次启动网络、SSH、防火墙、定时任务等一系列系统服务和守护进程。
🖥️ 阶段五:用户登录
当所有必要的系统服务都已启动,系统便进入了等待用户交互的状态。
- 启动登录程序 :
- 命令行模式 :启动
getty进程,在终端上显示登录提示符。 - 图形界面模式 :启动显示管理器(如
gdm或lightdm),呈现图形化的登录界面。
- 命令行模式 :启动
- 用户认证 :用户输入用户名和密码后,系统通过
/etc/passwd和/etc/shadow文件进行验证。 - 进入系统:验证通过后,系统加载用户的 shell 环境或桌面环境,用户便可开始使用系统。
