基于Ramfs的Rootfs配置
1. 简介¶
本文介绍RAMFS的使用与配置。
RAMFS是linux下的基于ram的文件系统,所以ramfs会有比较高的效率。ramfs有一个缺陷就是占用许多的内存,因为把这个rootfs都放到内存区,即使你mount的时候指定了大小,同时它也只能被root用户访问。
2. 基于alkaid平台进行配置¶
该方法需要基于已有配置基础进行配置。
2.1. 环境搭建¶
alkaid 环境搭建请参考:alkaid环境搭建。
2.2. ROOTFS分区配置¶
详细的分区配置参考:系统分区
-
新增配置
例子:cp /configs/ipc/i6e/nor.glibc-9.1.0-squashfs.013a.128.bga /configs/ipc/i6e/nor.glibc-9.1.0-ramfs.013a.128.bga
修改变量:
BOARD:013A-fastboot
IMAGE_CONFIG: nor.ramfs.partition.config
-
IPL IPL_CUST等bin档修改
对应文件:nor.ramfs.partition.config
-
新增分区
对应文件:nor.ramfs.partition.config
2.3. 模块与库的存放与加载¶
为了实现系统的快速启动, 需要将rootfs的大小裁剪,以下提供一种方案来缩减rootfs大小。
目前规划快启分为两个阶段:第一阶段与第二阶段
第一阶段:
将对应的模块(ko)与动态库(so)放置到rootfs分区,分别是/lib/modules/与/lib
第二阶段:
将对应的模块(ko)与动态库(so)放置到miservice分区,分别是/config/modules/与/config/lib
配置文件:boot_sequence.mk
例如:/release/ipc/i6e/013A-fastboot/bootscript/nor/boot_sequence.mk
只需要配置:MODULES_1st MODULES_2nd LIBS_1st LIBS_2nd 即可配置相应驱动存放路径
其它:
-
第一阶段占用系统内存,建议存放系统启动必备文件
-
第二阶段占用flash空间
3. initramfs的基本配置¶
介绍ramfs制作的细节。
3.1. 配置kernel¶
配置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 快速启动¶
直接从IPU加载相应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进行配置
## 4. ramdisk/other use /linuxrc , ramfs use /init if [ "$(rootfs$(FSTYPE))" = "ramfs" ]; then \ mv $(OUTPUTDIR)/rootfs/linuxrc $(OUTPUTDIR)/rootfs/init ; \ fi;
3.3.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