一.背景:

从initrd这个名称我们可以猜测它是一个用来加载init的ramdisk。

如果我们要使用inird,那它的作用是什么呢?

这里举例一个场景:

linux内核在加载完成后最后一步是要执行用户态的init进程,但是读init的话,需要能访问硬盘(flash),我们知道linux很多设备驱动是以模块的形式存在的,在系统启动完毕后再加载ko文件。但是如果 我们的init在读取前必须能够正常读取硬盘以及文件系统,由于linux内核下的硬盘和系统类型众多,不可能都放在内核中,只能以模块的形式存在,所以这时候要么linux内核中已经包含的硬盘驱动 以及文件系统 ,可以直接读取init,要么需 要加载一个initrd来先加载硬盘和文件系统 模块再读取init.

 

1.内核中包含硬盘驱动及文件系统,不需要initrd即可以直接加载用户态init

2.内核中不包含硬盘驱动 或者文件系统,但他们以模块的形式存在于initrd中,通过先加载initrd到内存中,再加载驱动及文件系统 模块,最后加载用户态init

这里我们就可以知道,内核镜像中是因为没有硬盘驱动以及文件系统驱动,所以需要借助带有硬盘及文件系统模块的initrd来完成加载用户态init,那为什么内核镜像中不能包含硬盘驱动有文件系统 驱动呢?答案是可以的,如果内核是用在单一的硬件上且不会变更,完全可以把驱动放在内核中,不需要initrd.但是内核镜像是需要保证在不同的设备的保持兼容性,又不能太臃肿,所以把硬盘和文件系统驱动存放在initrd中,可以根据不同的硬盘和文件系统来制作对应的initrd, 而内核不需要重复编译。

 

二.创建Linux initrd的 流程:

1、格式化一个Ramdisk;

2、加载文件系统内容到Ramdisk;

3、将Ramdisk作为根文件系统。

 

Linux初始RAM磁盘(initrd)是在系统引导过程中挂载的一个临时根文件系统,用来支持两阶段的引导过程。initrd文件中包含了各种可执行程序和驱动程序,它们可以用来挂载实际的根文件系统,然后再将这个initrd RAM磁盘卸载,并释放内存。在很多嵌入式Linux系统中,initrd就是最终的根文件系统

 

 

三.配置Linux内核

1)Initial RAM filesystem and RAM disk (initramfs/initrd) support

使内核支持以ramdisk文件系统作为根文件系统启动。

从menuconfig下图所在位置配置,或者直接在配置文件添加CONFIG_BLK_DEV_INITRD=y

2)RAM block device support

使内核支持虚拟块设备节点,选中这个,/dev/目录下才会出现ramX的虚设块设备节点,,才能将这个节点作为根文件系统挂载。

从menuconfig下图所在位置配置,或者直接在配置文件添加CONFIG_BLK_DEV_RAM=y

3)Default RAM disk size (kbytes)

ramdisk默认大小,这个大小应该适配你制作的ramdisk的大小。

从menuconfig下图所在位置配置,或者直接在配置文件添加CONFIG_BLK_DEV_RAM_SIZE=4096

4)Second extended fs support(可选)

从menuconfig下图所在位置配置,或者直接在配置文件添加CONFIG_EXT2_FS=y

 

四.制作initrd

在ohos下的initrd启动配置文件在/productdefine/common/deivce/产品名.json中使能enable_ramdisk.

以RK3568为例

{

    "device_name": "产品名称",

    "device_company": "芯片厂家",

    "target_os": "ohos",

    "target_cpu": "arm",

    "kernel_version": "",

    "device_build_path": "device/board/设备厂家/产品名称",

    "enable_ramdisk": true,   //是否支持ramdisk二级启动

    "build_selinux": true    // 是否支持selinux权限管理

}

 

productdefine/common/products/产品名称.json

{

  "product_name": "产品名称",

  "product_company" : "设备厂家",

  "product_device": "产品名称",

  "version": "2.0",

  "type": "standard",

  "parts":{

    "ace:ace_engine_standard":{},

    "ace:napi":{},

    ...

    "xts:phone_tests":{}

  }

}

 

./build.sh —product-name  产品名称

在编译后的out/产品名称/package/phone/images 目录下可以发现ramdisk.img

ohoh的init会读取.cfg文件加载硬件服务的进程,hap的孵化进程,以及修改一些预设置配置信息

 

五.如果需要将内核,initrd打包成一个文件

/mkbootimg --kernel zImage --ramdisk ramdisk.img --cmdline "console=ttyS0,115200n8 " -o boot.img

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐