基于Ramfs的Rootfs配置
1. 概述¶
RAMFS是Linux下的基于RAM的文件系统,效率较高。但它把rootfs都放在内存区,即使mount时指定了大小,也会导致占用的内存较大,并且RAMFS只能被root用户访问。
2. 基于alkaid平台配置Rootfs¶
基于alkaid平台配置Rootfs需要在已有配置的基础上进行配置。
2.1. 环境搭建¶
请参考环境搭建
2.2. ROOTFS分区配置¶
请参考系统分区
-
新增配置
示例:
cp /configs/defconfigs/ipc_m6_spinand.glibc-9.1.0-squashfs.016a.512x512.bga2_defconfig /configs/ipc/i6e/ipc_m6_spinand_ramfs.glibc-9.1.0-ramfs.squashfs.016a.512x512.bga2_defconfig
修改变量:
CONFIG_IMAGE_CONFIG: spinand.ramfs.partition.config
-
IPL IPL_CUST等bin档修改
对应文件:spinand.ramfs.partition.config
-
新增分区
对应文件:spinand.ramfs.partition.config
2.3. 模块与库的存放与加载¶
为了实现系统的快速启动, 需要将rootfs的大小裁剪。
缩减rootfs大小示例方案:
第一阶段将对应的模块(ko)与动态库(so)放置到rootfs分区,分别是/lib/modules/与/lib
第二阶段将对应的模块(ko)与动态库(so)放置到miservice分区,分别是/config/modules/与/config/lib
配置文件:boot_sequence.mk
注意:
-
第一阶段占用系统内存,建议存放系统启动必备文件
-
第二阶段占用flash空间
3. initramfs的基本配置¶
3.1. 配置kernel以支持init ramfs¶
开启BLK_DEV_INITRD
General setup --->
Initial RAM filesystem and RAM disk (initramfs/initrd) support --->
重新烧录kernel生成的image
3.2. 制作 Rootfs¶
守护进程需要指定为init,请将/linuxrc重命名为init。
-
重命名
mv $(OUTPUTDIR)/rootfs/linuxrc $(OUTPUTDIR)/rootfs/init
-
生成image
gen_initramfs_list.sh -o name -u 0 -g 0 dir
name: 生成的rootfs名字
dir: rootfs 文件根目录
gen_initramfs_list.sh: 生成rootfs的工具,详见linux/scripts
3.3. 启动系统¶
3.3.1. 从 IPL 快速启动¶
直接从IPL加载相应kernel跟rootfs到dram以节省加载uboot的时间,该方式需要对应的IPL档支持。
配置环境变量:
-
配置bootargs
rootfstype=ramfs initrd=ROOTFS_ADDR, ROOTFS_BLK_SIZE
ROOTFS_ADDR: rootfs加载地址
ROOTFS_BLK_SIZE: rootfs所占ramfs大小
-
配置环境变量
setenv initrd_high ROOTFS_ADDR
setenv initrd_size ROOTFS_BLK_SIZE
ROOTFS_ADDR: rootfs加载地址
ROOTFS_BLK_SIZE: rootfs所占ramfs大小
-
其它注意事项:
将守护进程重命名为init,可在rootfs.mk进行配置
## ramdisk/other use /linuxrc , ramfs use /init if [ "$(rootfs\$(FSTYPE))" = "ramfs" ]; then \\ mv $(OUTPUTDIR)/rootfs/linuxrc $(OUTPUTDIR)/rootfs/init ; \\ fi;
3.4.2. 从 Uboot 启动¶
从Uboot引导Kernel,需要配置相应的bootcmd来实现启动
配置环境变量:
-
配置bootargs
rootfstype=ramfs initrd=ROOTFS_ADDR, ROOTFS_BLK_SIZE init=/linuxrc
ROOTFS_ADDR: rootfs加载地址
ROOTFS_BLK_SIZE: rootfs所占ramfs大小
-
bootcmd 的配置
nor:
sf probe 0;sf read 0x22000000 ${sf_kernel_start} ${sf_kernel_size}; mxp r.info rootfs;sf read 0x23000000 ${sf_part_start} ${sf_part_size};bootm 0x22000000
nand:
nand read.e 0x22000000 KERNEL;nand read.e 0x23000000 rootfs 0x600000;bootm 0x22000000;nand read.e 0x22000000 RECOVERY;nand read.e 0x23000000 rootfs 0x600000;bootm 0x22000000