系统构建--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程序。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值