根文件系统(三)——initramfs文件系统制作
什么是initramfs文件系统?在 根文件系统分类 章节中讲述了内核会去挂载一个特殊的rootfs,然后再通过解析"root=xxx"命令行,去挂载 /dev/xxx 真正的根文件系统,那么,我们是否可以直接使用这个rootfs当做最终的根文件系统呢?当然可以,这便是 initramfs 内嵌式文件系统,它是一种ramfs文件系统,既可以当做最终的根文件系统,也可作为临时过渡的文件系统。关于in
什么是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包。
更多推荐
所有评论(0)