基于Ramfs的Rootfs配置


1. 简介

本文介绍RAMFS的使用与配置。

RAMFS是linux下的基于ram的文件系统,所以ramfs会有比较高的效率。ramfs有一个缺陷就是占用许多的内存,因为把这个rootfs都放到内存区,即使你mount的时候指定了大小,同时它也只能被root用户访问。


2. 基于alkaid平台进行配置

该方法需要基于已有配置基础进行配置。


2.1. 环境搭建

alkaid 环境搭建请参考:alkaid环境搭建。

2.2. ROOTFS分区配置

详细的分区配置参考:系统分区

  1. 新增配置

    例子: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

  2. IPL IPL_CUST等bin档修改

    对应文件:nor.ramfs.partition.config

  3. 新增分区

    对应文件: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 即可配置相应驱动存放路径

其它:

  1. 第一阶段占用系统内存,建议存放系统启动必备文件

  2. 第二阶段占用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

  1. 重命名

    mv $(OUTPUTDIR)/rootfs/linuxrc $(OUTPUTDIR)/rootfs/init
    
  2. 生成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