CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="../rootfs_min"
CONFIG_INITRAMFS_ROOT_UID=0
CONFIG_INITRAMFS_ROOT_GID=0
CONFIG_RD_GZIP=y
CONFIG_RD_BZIP2=y
CONFIG_RD_LZMA=y
CONFIG_RD_XZ=y
CONFIG_RD_LZO=y
CONFIG_RD_LZ4=y
CONFIG_INITRAMFS_COMPRESSION=".gz"
initramfs文件系统目录结构:
.
├── bin
├── dev
├── etc
├── home
├── lib
├── mnt
├── proc
├── rdinit
├── sbin
├── sys
├── tmp
├── usr
└── var
initramfs可以用busybox来制作。
rdinit是一个脚本程序,可以是其他名字,不一定非得叫rdinit。
rdinit脚本内容:
#!/bin/sh
/bin/mount -t proc proc /proc
/bin/mount -t sysfs sysfs /sys
/bin/mount -t devtmpfs devtmpfs /dev
/bin/mount /dev/mmcblk0p8 /mnt/update
/bin/upgrade.sh /mnt/update/update
/bin/umount /mnt/update
/bin/mount /dev/mmcblk0p6 /mnt/work
# 切换到真正的根文件系统并启动 init 进程
exec /sbin/chroot /mnt/work /sbin/init
脚本中内容可以自定义。此脚本先挂载了2个分区,做升级操作,然后切换到切换到真正的根文件系统。
initramfs作为临时文件系统,最后肯定要切换到真正的根文件系统。
启动参数不同方式设置优先级:uboot > DTS > 内核cmdline配置
启动参数中关键设置:rdinit=/rdinit
没有设置rdinit=/rdinit无法加载initramfs文件系统
在大多数嵌入式系统中rdinit=参数通过 U-Boot 的bootargs环境变量传递给内核。例如,在 U-Boot 命令行中可直接修改:
setenv bootargs 'earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 rdinit=/rdinit'
saveenv
parameter.txt 文件(针对 Rockchip 等平台):
在某些平台(如 RK3568),启动参数可能固化在parameter.txt文件中,该文件定义了分区布局和内核命令行参数。例如:
CMDLINE: ... rdinit=/rdinit ...
设备树节点中的chosen字段
内核启动参数可直接写入设备树的chosen节点中(需重新编译设备树):
dts
/ {
chosen {
bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 rdinit=/rdinit";
};
};
这种方式适用于需要固化启动参数的场景
配置内核中的CONFIG_CMDLINE:
CONFIG_CMDLINE="earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 rdinit=/rdinit"
内核中配置好cmdline后进行编译内核,内核会让选择哪个作为启动参数:
*
* Restart config...
*
*
* Boot options
*
Default kernel command string (CMDLINE) [earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 rdinit=/rdinit] earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 rdinit=/rdinit
Kernel command line type
> 1. Use bootloader kernel arguments if available (CMDLINE_FROM_BOOTLOADER) (NEW)
2. Extend bootloader kernel arguments (CMDLINE_EXTEND) (NEW)
3. Always use the default kernel command string (CMDLINE_FORCE) (NEW)
choice[1-3?]: