initramfs

在完成rootfs的构建之后,通过配置内核支持Initramfs,并设置好rootfs的路径即可编译出带有文件系统的vmliunx

initramfs简介

是什么

initramfs 即 initram file system,翻译成中文意思就是 初始 ram 文件系统,基于 tmpfs,是一种大小灵活,直接作用在内存中的文件系统。initramfs 包含的工具和脚本,在正式的根文件系统的初始化脚本 init 启动之前,就被挂载。initramfs 是可选的,内核编译选项默认开启 initramfs(initrd)。那么什么情况下考虑使用 initramfs 呢?

  • 加载模块,如三方驱动
  • 定制化启动系统
  • 制作一个很小的 rescue shell
  • 内核不能,但是用户态可以完成的命令

initramfs 在内核启动的早期提供用一个户态环境,用于完成在内核启动阶段不易完成的工作。initramfs 包含的工具可以解密抽象层(用于加密的文件系统),逻辑卷管理器,软件 RAID,蓝牙驱动程序等。

一个 initramfs 至少包含一个文件,即 /init,内核将这个文件执行起来的进程设置为 main init 进程,pid = 1。内核挂载 initramfs 时,文件系统的根分区并没有挂载,所以无法访问文件系统中的文件。大多数嵌入式设备可能需要一个 shell,那么也会在 initramfs 打包进一个 shell。如果还需要其他工具或者脚本,也可以打包进 initramfs,但注意,必须包含依赖,因为 initramfs 是一个能够独立运行的 ram 文件系统

如何工作

initramfs 和我们常见的文件系统类似,可能存在 /usr、/bin 等目录。里面包含着我们的工具和脚本。initramfs 需要使用 cpio 来归档,cpio 是一个有着古老历史的文件归档解决方案,类似于 linux 中常用的 tar,或者 windows 中的 zip,主要作用是将多个文件打包成一个文件(但是没有压缩)。使用 cpio,是因为其代码易于实现,而且能够兼容更多的设备。

归档之后,需要考虑 initramfs 文件的体积,要进一步压缩,减少内存或磁盘的占用。所有文件,工具,库,配置设置(如果适用)等都放入 cpio 归档后,使用 gzip 实用程序压缩 cipo 文件,并将其与linux 内核一起存储。引导加载程序(通常是 grub 或者 uboot)将在引导时将其提供给内核,以便内核知道需要一个 initramfs。

内核一旦检测到 initramfs,会创建一个 tmpfs 文件系统,提取 gzip 中存档的 initramfs,并存入 tmpfs 中,内核启动 tmpfs 文件系统中的 init 脚本。该脚本用于挂载实际的根文件系统,当完成根文件系统和其他的一些重要的文件系统的安装之后,init 脚本会切换至真实的根文件系统,并在系统上调用 / sbin / init 二进制文件,进行后续的启动过程。

initramfs配置

使用make menuconfig进入内核菜单后。

配置General setup —> [*]Initial RAM filesystem and RAM disk (initramfs/initrd) support。

配置General setup —> ()Initramfs source file(s) [注]在括号里写入构建的rootfs路径,绝对路径和相对路径均可。此处填写的是busybox编译的rootfs.cpio。

make后重新编译内核即可

与ramdisk区别

ramdisk是在一块内存区域中创建的块设备,用于存放文件系统。ramdisk的容量是固定的,不能象ramfs一样动态增长。ramdisk需要内核的文件系统驱动程序(如ext2)来操作其上的数据,而ramfs则是内核的天然特性,无需额外的驱动程序。ramdisk也象其他文件系统设备一样, 需要在块设备和内存中的磁盘高速缓存之间复制数据,而这种数据复制实际不必要的