制作initrd的教程
一.背景: 从initrd这个名称我们可以猜测它是一个用来加载init的ramdisk。 如果我们要使用inird,那它的作用是什么呢? 这里举例一个场景: linux内核在加载完成后最后一步是要执行用户态的init进程,但是读init的话,需要能访问硬盘(flash),我们知道linux很多设备驱动是以模块的形式存在的
一.背景:
从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
更多推荐
所有评论(0)