Linux 启动流程

引言

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 个主分区。

根据操作系统安装位置,引导流程分为两种情况:

  1. 操作系统在主分区:MBR 引导代码加载该主分区的卷引导记录(VBR) ,由 VBR 中的引导程序继续执行;
  1. 操作系统在逻辑分区: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 加载流程
  1. 加载 boot.img:BIOS/UEFI 将 MBR 中的 boot.img(GRUB2 第一阶段代码)加载到内存 0x7c00 地址执行;
  2. 加载 core.img:boot.img 通过 diskboot.img 模块读取硬盘中的 core.img(GRUB2 核心镜像),包含 lzma_decompress.img(解压缩程序)、kernel.img(GRUB2 内核)和各类功能模块;
  3. 切换到保护模式:实模式(1MB 地址空间)无法容纳核心镜像,lzma_decompress.img 调用real_to_prot函数切换到保护模式,突破内存寻址限制;
  4. 显示启动菜单:GRUB2 内核加载完成后,读取grub.cfg配置文件,显示内核版本列表(如 CentOS 的 3.10 内核),等待用户选择;
  5. 加载内核与 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自动挂载设备 → 进入运行级别 → 用户登录

理解这一流程,对于系统运维(如启动故障排查、内核参数调整)和底层开发(如驱动调试、进程管理)至关重要。

相关推荐
阿干tkl5 小时前
传统网络与NetworkManager对比
linux·网络
运维有小邓@6 小时前
USB 设备安全攻略:USB 设备管理方案与安全工具
网络
老蒋新思维6 小时前
创客匠人峰会洞察:私域 AI 化重塑知识变现 —— 创始人 IP 的私域增长新引擎
大数据·网络·人工智能·网络协议·tcp/ip·创始人ip·创客匠人
知识分享小能手7 小时前
CentOS Stream 9入门学习教程,从入门到精通,CentOS Stream 9 配置网络功能 —语法详解与实战案例(10)
网络·学习·centos
专业开发者7 小时前
Wi-Fi®:可持续的优选连接方案
网络·物联网
GIS数据转换器8 小时前
综合安防数智管理平台
大数据·网络·人工智能·安全·无人机
chem41119 小时前
魔百盒 私有网盘seafile搭建
linux·运维·网络
lang201509289 小时前
Sentinel核心:ClusterNode全局资源统计解析
网络·python·sentinel
Wang's Blog9 小时前
Elastic Stack梳理:深入解析Packetbeat网络抓包与Heartbeat服务监控
网络·elasticsearch·搜索引擎