initramfs 是什么

结论速览

  • initramfs 本质就是一套用于 Linux 启动阶段的目录和文件。
  • rootfs.cpio.gz 是打包产物:find 列文件、cpio 打包、gzip 压缩,三件事各管一段。
  • 内核拿到 initramfs 后解压展开到 RAM,形成 /,然后寻找并执行 /init。
  • initramfs 运行期间就是根文件系统,掉电即消失;ext4 rootfs 装在 eMMC/SD/SSD 上,长期保存、由内核挂载。
  • 两种放法:CONFIG_INITRAMFS_SOURCE 编进内核,或由 U-Boot 与 Kernel、DTB 一起加载到 RAM。

1. 本质

initramfs 本质上就是:

一套用于 Linux 启动阶段的目录和文件。

例如:

1
2
3
4
5
6
7
8
rootfs/
├── init
├── bin/
│ └── busybox
├── dev/
├── proc/
├── sys/
└── etc/

这些最开始只是 PC 上的普通文件和目录。

2. 为什么会出现 rootfs.cpio.gz

可以把目录打包:

1
2
cd rootfs
find . | cpio -o -H newc | gzip > rootfs.cpio.gz

其中:

1
2
3
4
5
6
7
8
9
10
11
find
↓
列出文件

cpio
↓
把这些文件打成一个 archive

gzip
↓
压缩 archive

因此:

1
2
3
4
5
6
7
8
9
rootfs/
↓
cpio
↓
rootfs.cpio
↓
gzip
↓
rootfs.cpio.gz

cpio 负责打包,gzip 负责压缩。

3. Kernel 如何使用 initramfs

Kernel 启动时获得 initramfs 后,会把里面的内容展开到 RAM。

过程:

1
2
3
4
5
6
7
8
9
rootfs.cpio.gz
↓
Kernel 解压
↓
在 RAM 中形成 /
↓
寻找 /init
↓
执行 /init

所以运行后看到的是:

1
2
3
4
5
6
/
├── init
├── bin/
├── dev/
├── proc/
└── sys/

4. initramfs 和 ext4 rootfs 的区别

initramfs:

1
2
3
4
5
6
7
文件包
↓
启动时解到 RAM
↓
运行期间作为 /
↓
掉电消失

ext4 rootfs:

1
2
3
4
5
6
7
eMMC / SD / SSD
↓
长期保存
↓
Kernel 挂载
↓
作为 /

因此 initramfs 很适合:

1
2
3
4
5
系统 bring-up
救援环境
安装环境
极简嵌入式系统
早期启动环境

5. initramfs 可以放在哪里

有两种常见方式。

5.1 编译进 Kernel

通过:

1
CONFIG_INITRAMFS_SOURCE

直接把 rootfs 嵌进内核镜像。

5.2 由 U-Boot 单独加载

例如:

1
2
3
Kernel
rootfs.cpio.gz
DTB

分别加载到 RAM,再由 U-Boot 启动 Linux。

两种方式最终效果类似:

1
2
3
4
5
Kernel 得到 initramfs
↓
展开
↓
执行 /init