initramfsInitial RAM Filesystem)是一种在 Linux 系统启动初期被加载到内存中的临时根文件系统,它在内核启动后、挂载真正的根文件系统(如 /dev/mmcblk0p2, /dev/ubi0_5, NFS 等)之前使用。


一、简单理解

它的作用就像是一个“引导垫脚石”——帮助 Linux 内核在启动后完成一些必要操作,比如:

  • 加载设备驱动(比如挂载 UBI、EXT4、FAT 等所需模块);
  • 扫描分区表、识别存储设备;
  • 解密根文件系统(如果启用了加密);
  • 找到并挂载真正的根文件系统;
  • 最终把控制权交给真正的 /sbin/init 或系统管理器。

二、启动流程(简化版)

  1. Bootloader(如 U-Boot)加载 Linux 内核initramfs 到内存;
  2. 内核启动,并挂载 initramfs(而不是真实的根文件系统)为临时根;
  3. 执行 initramfs 里的 /init 脚本:
    • 初始化基本设备(如挂载 /proc, /sys, /dev
    • 加载额外驱动(如 mmc、ubi、网络)
    • 探测和挂载真正的根文件系统
  4. 切换根(pivot_root 或 switch_root)到真实根文件系统
  5. 启动真实系统的 /sbin/init

三、 与 initrd 区别?

特性 initrd initramfs
格式 压缩的 ext2/ext3 镜像 cpio 打包的文件系统镜像
挂载方式 作为块设备挂载 解压到内存并直接使用
内核处理方式 需要挂载 解包后在内存中作为根目录使用
支持压缩格式 通常 gzip 支持 gzip、lzma、xz、lz4 等
更现代 是,Linux 2.6 起取代 initrd

四、文件生成位置

当你使用 buildrootyocto、或手动编译 Linux 时,initramfs 通常生成为:

  • initramfs.cpio.gz
  • 或编译进内核(CONFIG_INITRAMFS_SOURCE

五、 一个典型 initramfs /init 脚本内容示例:

#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev

# 加载必要模块
modprobe ubi
modprobe ubifs

# 挂载真正的根文件系统
mount -t ubifs /dev/ubi0_0 /new_root

# 切换到真正的根文件系统
exec switch_root /new_root /sbin/init

六、 总结

优点
模块化启动,灵活适配各种根文件系统
支持动态加载驱动或识别硬件
在嵌入式系统中极其常用

理解和掌握 initramfs 可以帮助我们处理:

  • 动态挂载 UBI 分区
  • 替换 rootfs、logo 分区
  • 自定义开机流程等问题
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐