本文主要是介绍系统构建--initramfs的制作和使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
经过前文的介绍,我们知道initramfs可以直接编译到内核中,只需要在
CONFIG_INITRAMFS_SOURCE="../rootfs"
CONFIG_INITRAMFS_ROOT_UID=0
CONFIG_INITRAMFS_ROOT_GID=0
本文主要介绍如何制作和加载独立的initramfs,首先需要保证内核选项使能:
CONFIG_BLK_DEV_INITRD=y
github仓库:https://github.com/rikeyone/qemu-linux-system.git
制作initramfs
cd rootfs
find . | cpio -H newc -ov --owner root:root > ../initramfs.cpio
cd ..
gzip initramfs.cpio
最后会生成一个initramfs.cpio.zip的压缩包文件,这个就是我们想要的initramfs,可以使用qemu进行测试。
qemu加载
qemu-system-arm -M vexpress-a9 \-smp 4 \-m 1024m \-kernel linux-4.0/arch/arm/boot/zImage \-append "rdinit=/linuxrc console=ttyAMA0 loglevel=8" \-dtb linux-4.0/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \-initrd rootfs/initramfs.cpio.gz \-nographic
关键是传入“rdinit=/linuxrc”的cmdline,以及对应的qemu选项“-initrd rootfs/initramfs.cpio.gz”。
u-boot加载
如果我们在实际硬件上使用,并且使用uboot作为bootloader,那么还需要对initramfs加上uboot header:
mkimage -A arm -O linux -T ramdisk -d initramfs.cpio.gz ramdisk.img
然后在uboot中加载该image到特定地址后,传入内核参数:
rdinit=/linuxrc initrd=addr,size
注意
当我们使用initramfs时,默认是把其中的内容填充到内核自带的rootfs中的,因此可以不用指定如下参数:
root=XXX
但是需要确保其中有init程序用于支持后续系统的初始化,为了确保init存在,需要加入:
rdinit=/linuxrc
指定init程序。
这篇关于系统构建--initramfs的制作和使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!