initramfs使用及bootargs(cmdline)配置

内核配置

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文件系统

1 通过 Bootloader(如 U-Boot)设置环境变量

在大多数嵌入式系统中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 ...

2 通过设备树(DTS)配置

设备树节点中的chosen字段
内核启动参数可直接写入设备树的chosen节点中(需重新编译设备树):

dts

/ {
  chosen {
    bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 rdinit=/rdinit";
  };
};

这种方式适用于需要固化启动参数的场景

3 内核配置

配置内核中的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?]:

你可能感兴趣的:(Linux开发基础,疑难杂症,Linux文件系统,linux,bootargs,设备树,initramfs,cmdline)