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 在启动流程中的位置,是掌握内核参数传递与启动调试的基础。下面通过一张流程图展示从按下电源键到用户登录的完整启动链路:

Linux 启动流程与 initramfs 位置 Linux 启动流程与 initramfs 位置 BIOS / UEFI Bootloader (GRUB) 内核 (vmlinuz) initramfs initramfs 内部流程 1. 加载硬件驱动 (模块) 2. 检测存储设备 (udev) 3. 解密/组装根文件系统 4. 挂载真正的根文件系统 根文件系统 (/) systemd (PID 1) 关键阶段说明 ① 内核解压后,挂载 initramfs 为 临时根文件系统 ② initramfs 中的 init 脚本执行 内核参数传递点 Bootloader → 内核命令行 内核 → initramfs 环境变量

1.4 启动流程关键步骤详解

  1. BIOS/UEFI 阶段:硬件自检,从启动设备加载引导加载程序(如 GRUB)。
  2. Bootloader 阶段:GRUB 读取配置文件(grub.cfg),将内核镜像(vmlinuz)和 initramfs 镜像加载到内存,并传递内核命令行参数。
  3. 内核初始化:内核解压并初始化核心子系统(内存管理、进程调度、中断等),然后挂载 initramfs 为临时根文件系统。
  4. initramfs 执行:内核执行 initramfs 中的 /init 脚本(或 init 程序),该脚本负责加载驱动、检测设备、组装根文件系统。
  5. 根文件系统切换:initramfs 中的 switch_root 或 pivot_root 将根文件系统切换到真正的存储设备上。
  6. 系统初始化:内核执行真正的根文件系统上的 /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 行为和进行启动调试的核心机制。