1. 课程导论:什么是 initramfs?为什么需要 initramfs?initramfs 在 Linux 启动流程中的位置
1.1 什么是 initramfs?
initramfs(initial RAM filesystem)是一个在系统启动早期、挂载真正的根文件系统之前,由引导加载程序(如 GRUB)加载到内存中的临时根文件系统。它本质上是一个压缩的 cpio 归档文件,通常与内核镜像(vmlinuz)一同存放在 /boot 目录下。
initramfs 的核心作用是在内核启动初期提供一个最小化的用户空间环境,使得内核能够完成以下关键任务:
- 加载必要的硬件驱动(如磁盘控制器、文件系统驱动)
- 检测并初始化存储设备
- 解密或验证根文件系统(如 LUKS、dm-verity)
- 挂载真正的根文件系统并切换到它
关键区别:initramfs 与 initrd(initial RAM disk)不同。initrd 是一个独立的块设备镜像,需要额外的驱动支持;而 initramfs 直接基于 VFS(虚拟文件系统)和 tmpfs,无需块设备驱动即可工作,更轻量且灵活。
1.2 为什么需要 initramfs?
现代 Linux 系统之所以依赖 initramfs,主要源于以下三个根本原因:
| 原因 | 说明 | 典型场景 |
|---|---|---|
| 驱动模块化 | 内核将大量驱动编译为可加载模块(.ko),而非内置到内核镜像中 | SATA/NVMe 控制器驱动、文件系统驱动(ext4、btrfs) |
| 根文件系统多样性 | 根文件系统可能位于加密卷、LVM、RAID 或网络存储上 | LUKS 加密、LVM 逻辑卷、NFS 根文件系统 |
| 硬件抽象与延迟加载 | 内核无法预知所有硬件配置,需要用户空间工具探测并加载对应驱动 | udev 设备管理、固件加载、模块依赖解析 |
一句话总结:没有 initramfs,内核必须将所有可能用到的驱动和工具内置到内核镜像中,导致内核体积膨胀、维护困难;有了 initramfs,内核可以保持精简,而将硬件适配和根文件系统发现交给 initramfs 中的用户空间程序完成。
1.3 initramfs 在 Linux 启动流程中的位置
理解 initramfs 在启动流程中的位置,是掌握内核参数传递与启动调试的基础。下面通过一张流程图展示从按下电源键到用户登录的完整启动链路:
1.4 启动流程关键步骤详解
- BIOS/UEFI 阶段:硬件自检,从启动设备加载引导加载程序(如 GRUB)。
- Bootloader 阶段:GRUB 读取配置文件(
grub.cfg),将内核镜像(vmlinuz)和 initramfs 镜像加载到内存,并传递内核命令行参数。 - 内核初始化:内核解压并初始化核心子系统(内存管理、进程调度、中断等),然后挂载 initramfs 为临时根文件系统。
- initramfs 执行:内核执行 initramfs 中的
/init脚本(或init程序),该脚本负责加载驱动、检测设备、组装根文件系统。 - 根文件系统切换:initramfs 中的
switch_root或pivot_root将根文件系统切换到真正的存储设备上。 - 系统初始化:内核执行真正的根文件系统上的
/sbin/init(通常为 systemd),启动用户空间服务。
常见误区:很多初学者认为 initramfs 是内核的一部分。实际上,initramfs 是一个独立的用户空间环境,内核只负责将其挂载并执行其中的 init 程序。initramfs 中的工具(如 busybox、udev、cryptsetup)都是用户空间程序,与内核模块协同工作。
1.5 initramfs 与内核参数传递的关系
内核参数传递是 initramfs 启动调试的核心手段。当系统无法正常启动时,可以通过修改 GRUB 命令行添加调试参数,这些参数会被内核和 initramfs 中的脚本解析:
| 参数类别 | 示例 | 作用 |
|---|---|---|
| 内核参数 | quiet、debug、single |
控制内核日志级别、启动模式 |
| initramfs 参数 | root=/dev/sda1、rd.luks.name |
指定根文件系统位置、加密设备映射 |
| 调试参数 | rd.shell、rd.break、systemd.log_level=debug |
在 initramfs 中进入 shell、在指定阶段中断 |
课程预告:在后续章节中,我们将深入讲解如何通过 rd.break 在 initramfs 的特定阶段中断启动流程,进入交互式 shell 进行调试;以及如何通过 systemd.log_level=debug 获取详细的启动日志。
1.6 本章小结
- initramfs 是一个临时的内存根文件系统,用于在启动早期加载驱动和发现根文件系统。
- 必要性 源于驱动模块化、根文件系统多样性和硬件抽象需求。
- 位置 位于内核初始化之后、真正的根文件系统挂载之前,是启动流程中的关键桥梁。
- 内核参数传递 是控制 initramfs 行为和进行启动调试的核心机制。