系统地梳理一下:
BIOS、Bootloader(如 GRUB)、Linux 内核之间的关系,以及它们在整个启动流程中是如何协同工作的。
🧱 一、基本概念与角色划分
模块 | 全称/含义 | 角色 |
---|---|---|
BIOS | Basic Input Output System | 主板固件程序,负责硬件初始化和引导操作系统 |
UEFI | Unified Extensible Firmware Interface | BIOS 的现代替代方案,功能更强大 |
Bootloader | 引导加载程序(如 GRUB2) | 负责加载操作系统内核到内存并运行 |
Linux Kernel | Linux 内核 | 操作系统核心,管理硬件资源和进程等 |
initramfs / initrd | Initial RAM Disk | 临时根文件系统,用于在挂载真正的根文件系统前加载驱动和模块 |
🔁 二、开机启动流程详解
下面是一个典型的 PC 启动流程(以 UEFI + GRUB2 + Linux 为例):
1️⃣ BIOS / UEFI 阶段
- 当你按下电源键后,CPU 开始执行固化在主板 ROM 中的代码(即 BIOS 或 UEFI 固件)。
- BIOS/UEFI 会进行:
- 加电自检(POST):检测硬件是否正常;
- 查找可启动设备(硬盘、U盘、光驱等);
- 读取启动设备的第一个扇区(MBR)或 UEFI 分区中的 Bootloader 信息;
- 跳转到 Bootloader 执行入口地址。
2️⃣ Bootloader 阶段(如 GRUB)
GRUB(Grand Unified Bootloader)是 Linux 系统中最常用的 Bootloader。它分为两个阶段(或三个阶段):
✅ GRUB Stage 1(boot.img)
- 位于 MBR 或 EFI 分区;
- 作用是加载 Stage 2。
✅ GRUB Stage 2(core.img)
- 加载
/boot/grub
下的配置文件和模块; - 显示启动菜单(如果你有多个系统或内核版本);
- 用户可以选择要启动的 Linux 内核(vmlinuz)和对应的 initramfs 文件。
✅ GRUB 加载的内容
vmlinuz
:编译后的 Linux 内核镜像(通常是压缩过的);initramfs
:初始 RAM 磁盘,包含必要的驱动和脚本,用来挂载真正的根文件系统;- 传递内核参数(如
root=/dev/sda1
、ro
、quiet
等);
3️⃣ Linux 内核启动阶段
GRUB 将控制权交给 Linux 内核(vmlinuz),内核开始执行:
🔹 解压内核
- 如果是压缩内核(zImage / bzImage),先解压。
🔹 初始化硬件
- 初始化 CPU、内存、中断控制器、时钟、PCI 总线等基础硬件。
🔹 挂载 initramfs
- initramfs 是一个临时的根文件系统,用于加载必要的驱动(比如 SATA、RAID、LVM、加密磁盘等);
- 一旦驱动加载完成,就会尝试挂载真正的根文件系统(rootfs)。
🔹 启动第一个进程:init
或 systemd
- 内核启动完成后,会执行
/sbin/init
(传统方式)或/usr/lib/systemd/systemd
(Systemd 系统); - 这个进程 PID=1,是所有后续进程的父进程。
4️⃣ 用户空间启动阶段(用户登录界面)
- systemd 或 SysVinit 系统开始启动服务(网络、图形界面、日志、SSH 等);
- 最终显示登录提示符或图形登录界面。
📦 三、结合内核编译过程来看
你在手动编译内核时,通常会执行以下命令:
make menuconfig # 配置内核选项
make -j$(nproc) # 编译整个内核
make modules # 编译模块
make dtbs # 编译设备树(嵌入式用)
make bzImage # 编译内核镜像(即 vmlinuz)
这些步骤生成的关键文件包括:
文件 | 路径 | 说明 |
---|---|---|
arch/x86/boot/bzImage | vmlinuz | 内核镜像文件,会被 GRUB 加载 |
System.map | 核心符号表,调试用 | |
.config | 当前使用的配置文件 | |
Module.symvers | 模块版本信息 | |
modules 目录下的 .ko 文件 | 内核模块,需要安装到 /lib/modules/<version>/ | |
initramfs | 通常由 dracut , mkinitcpio , update-initramfs 等工具生成 |
🔄 四、完整流程图(文字版)
[电源打开]
↓
[BIOS/UEFI 启动]
↓
[加载 Bootloader(GRUB)]
↓
[GRUB 加载 vmlinuz + initramfs]
↓
[vmlinuz 解压并启动 → 挂载 initramfs]
↓
[加载驱动 → 挂载真正的 rootfs]
↓
[启动 systemd 或 init → 初始化系统服务]
↓
[进入用户登录界面]
🎯 五、关键点总结
概念 | 作用 |
---|---|
BIOS/UEFI | 硬件初始化 + 调用 Bootloader |
GRUB | 加载 Linux 内核镜像(bzImage)和 initramfs |
Linux 内核(vmlinuz) | 真正的操作系统核心,负责硬件管理和进程调度 |
initramfs | 临时根文件系统,帮助挂载真实根文件系统 |
systemd / init | 第一个用户空间进程,启动服务和登录环境 |
💡 示例:手动添加新内核到 GRUB
当你自己编译了一个新的内核,你需要:
-
安装模块:
sudo make modules_install dtbs_install
-
安装内核和设备树:
sudo cp arch/x86/boot/bzImage /boot/vmlinuz-4.19.90-custom sudo cp arch/x86/boot/dts/*.dtb /boot/
-
更新 initramfs(例如使用 dracut 或 update-initramfs):
sudo update-initramfs -c -k 4.19.90-custom
-
更新 GRUB 配置:
sudo update-grub
这样重启后就能在 GRUB 菜单中看到你的新内核了!