系统构建--initramfs的制作和使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rikeyone/article/details/88389756

经过前文的介绍,我们知道initramfs可以直接编译到内核中,只需要在

CONFIG_INITRAMFS_SOURCE="../rootfs"
CONFIG_INITRAMFS_ROOT_UID=0
CONFIG_INITRAMFS_ROOT_GID=0

本文主要介绍如何制作和加载独立的initramfs,首先需要保证内核选项使能:

CONFIG_BLK_DEV_INITRD=y

制作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程序。

猜你喜欢

转载自blog.csdn.net/rikeyone/article/details/88389756