什么是initramfs文件系统?

       在 根文件系统分类 章节中讲述了内核会去挂载一个特殊的rootfs,然后再通过解析"root=xxx"命令行,去挂载 /dev/xxx 真正的根文件系统,那么,我们是否可以直接使用这个rootfs当做最终的根文件系统呢?当然可以,这便是 initramfs 内嵌式文件系统,它是一种ramfs文件系统,既可以当做最终的根文件系统,也可作为临时过渡的文件系统。关于initramfs 的前世今生不在这讲述,这里只讲述如何制作使用它!

怎么制作initramfs文件系统?

       在 最小根文件系统 章节中讲述了根文件系统制作,本文在此基础上制作initramfs。之前在 根文件系统分类 中提到过,内核挂载了特殊rootfs后会将CPIO归档包释放到rootfs中,再执行rootfs中的init进程。

       所以,我们需要做:

        1)在自己制作的rootfs根目录下添加init进程。

        2)将自己制作的rootfs归档成cpio包。

        3)将这个cpio归档包放到内核能找到的地方或告诉内核去哪找这个包。

(1)添加 init 软链接

       之前使用busybox制作的根文件系统中存在init进程,在 /sbin/ 目录下:

       可以看见/sbin/init是一个软链接,指向/bin/busybox,因此我们要在rootfs根目录下添加一个init软链接,指向/sbin/init或/bin/busybox,进入rootfs目录执行:

                ln -s ./bin/busybox init

        即可生成指向/bin/busybox的init软链接。

(2)将rootfs归档成cpio包

        在归档之前需要使用改变整个rootfs的所有权,使用chown(hikchown)命令,执行:

                sudo hikchown root.root -R ./*

        然后再cpio归档,也可以归档后压缩,执行

        归档: find ./rootfs | sudo cpio -H newc -o > ./rootfs.cpio

        归档和压缩:find ./rootfs | sudo cpio -H newc -o | gzip -9 -n > ./rootfs.cpio.gz

(3)配置内核参数和指定grub参数

        进入内核源码顶层目录,执行make menuconfig,将以下配置项勾上

有两种方式启动initramfs:

        1)将cpio包追加到内核尾部

        将cpio包拷贝到内核源码顶层目录,然后配置上图中initramfs source file选项

                ./xxx.cpio

        然后重新编译内核,即可将cpio包附加到内核尾部,内核启动之后会将cpio包释放到特殊rootfs(系统自建rootfs)。

        2)设置grub参数指定cpio.gz包

        将上述配置的initramfs source file选项路径去掉,或者删除./xxx.cpio包。

        将cpio.gz包拷贝到内核同目录下,设置grub参数 initrd /rootfs.cpio.gz 即可,也就是将下图 # 符号去掉。

        注意:这里使用的是cpio.gz包,也就是cpio归档后再gzip压缩!grub是X86里的引导配置文件,如果是arm,则修改Uboot启动参数。

        重新启动系统即可看见自己制作的根文件系统啦!

        提醒:initramfs 文件系统是基于内存的文件系统,因此在根文件系统上修改或添加文件无法保存,想要修改必须在自己制作的rootfs中修改后重新添加到内核尾部或替换原来的rootfs.cpio.gz包。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐