InitRamdisk & InitRamfs,gzip & cpio

转载于 https://blog.csdn.net/ooonebook/article/details/52624481

一、rootfs
rootfs,Root FileSystem,是指根文件系统,对应/目录节点。
rootfs又分为虚拟rootfs和真实rootfs。

虚拟rootfs由内核自己创建和加载,仅仅存在于内存之中(后续的InitRamfs也是在这种基础上实现),其文件系统是tmpfs类型或者ramfs类型。
真实rootfs则是指根文件系统存在于存储设备上,内核在启动过程中会在虚拟rootfs上挂载这个存储设备,然后将/目录节点切换到这个存储设备上,这样存储设备上的文件系统就会被作为根文件系统使用(后续InitRamdisk是在这种基础上实现),其文件系统类型更加丰富,可以是ext2、yaffs、yaffs2等等类型,由具体的存储设备的类型决定。

二、InitRamdisk & InitRamfs
InitRamdisk和InitRamfs技术都是使用ram的区域来作为根文件系统。
1、差异如下:
(1)实现原理上的差异
InitRamdisk,初始化内存盘INITRD(INITial Ram Disk)技术,利用ramdisk的技术,将系统一部分内存区域实现为/dev/ram,把/dev/ram作为作为一个存储设备,最终将根目录切换到/dev/ram的挂载,实现将/dev/ram作为根文件系统的目的。从原理上属于真实rootfs。
InitRamfs,将一个包含有根文件系统的文件、目录、节点的cpio压缩的描述包直接释放到虚拟rootfs的内存区域中,后续都是由rootfs来作为系统的根文件系统使用,无需块设备参与。

(2)文件系统上的差异
InitRamdisk,使用ext2格式的文件系统。
InitRamfs,使用kernel内核直接支持的ROOTFS格式的文件系统。

(3)数据传输流上的差异
InitRamdisk,需要经过ext2文件系统和/dev/ram设备;
InitRamfs,直接通过ROOTFS文件系统进行;

(4)初始化进程init的区别
InitRamdisk,使用根文件系统下的/linuxrc来作为init进程;
InitRamfs,使用根文件系统下的/init来作为init进程;

(5)内核支持版本上的差异
InitRamdisk,由kernel 2.4版本上开始支持;
InitRamfs,由kernel 2.6版本上开始支持;

(6)镜像的差异和制作方式上的差异会在后面说明

2、优缺点
(1)InitRamfs的优势
InitRamfs省去了创建/dev/ram、挂接文件系统和切换根目录的操作,启动过程更会简单和快速。
同时,InitRamfs比InitRamdisk更简单快速,而Kernel对InitRamfs的内部处理也更为简单。

(2)InitRamfs的缺点
InitRamfs使用的是cpio包,包含了文件、目录、节点的描述语言包,为了描述一个文件、目录、节点,要增加很多额外的描述文字开销。这样使得cpio包比相应的image文件大很多。

三、名词、类型说明
因为网上对于initrd有很多种名词,因为在这里做解释和统一说明。
前面已经说过了InitRamdisk和InitRamfs,同时InitRamfs又分为独立式InitRamfs和集成式InitRamfs。
1、InitRamdisk
老式块设备的initrd,对应init ramdisk的镜像,格式ext2。
网上的名词:image-initrd,也可能直接用initrd来表示InitRamdisk,具体需要根据文章自己进行判断。

2、独立式InitRamfs
是指将InitRamfs的压缩包与kernel Image独立开来,对应initramfs压缩包,是一个cpio格式压缩的独立文件。
网上的名词:cpio-initrd(本质上是属于InitRamfs类型)

3、集成式InitRamfs
是指将InitRamfs的cpio压缩包集成到kernel Image中,该cpio格式压缩的文件会被被链接进了内核中特殊的数据段.init.ramfs上,其中全局变量__initramfs_start和__initramfs_end分别指向这个数据段的起始地址和结束地址。内核启动时会对.init.ramfs段中的数据进行解压,然后使用它作为临时的根文件系统。
网上的名词:initramfs(本质上确实是属于InitRamfs类型,但是是其中的一种类型)

四、InitRamdisk & InitRamfs的制作
1、InitRamdisk
(1)通用命令如下:
  genext2fs -b 4096 -d rootfs ramdisk
  gzip -9 -f ramdisk
  mkimage -n “My Rootfs” -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img
<1> genext2fs用于将目录生成ext2格式的ramdisk。
  -b是指制作的ramdisk大小为4096K字节;
  -d是指要制作成ramdisk的根文件系统目录;
  ramdisk则是指要生成ramdisk的名称;
<2> gzip将该ramdisk以最优方式压缩为ramdisk.gz
<3> 第三个步骤由uboot使用,mkimage命令将压缩了的ramdisk根文件系统二进制文件ramdisk.gz转换成u-boot能够辨认的二进制文件ramdisk.img,并指定ramdisk.img的名字为“My Rootfs”,处理器体系架构为arm,操作系统类型为linux,程序类型为ramdisk,程序由gzip压缩,不需要指定ramdisk的链接起始地址和入口地址。使用FIT方式可以跳过这步。

2、独立式InitRamfs
(1)通用命令如下,进入到rootfs对应目录下,执行:
  find . | cpio -H newc -o > …/rootfs.cpio
  gzip …/rootfs.cpio
<1> 通过find命令获取当前目录下的所有文件,然后通过cpio -H newc -o 添加压缩到rootfs.cpio中;
<2> 通过gzip将rootfs.cpio进行压缩;
生成的rootfs.cpio.gz就是InitRamfs使用的镜像。

3、集成式InitRamfs
(1)在对应平台的config文件中添加如下:
CONFIG_INITRAMFS_SOURCE=“源rootfs的路径”;
然后执行make命令生成kernel镜像即可,对应的InitRamfs的cpio包会被编译到kernel镜像里面。

五、InitRamdisk & InitRamfs的使用
以下步骤需要保证rootfs下的必须存在的目录以及可执行文件已经存在,如busybox已经安装,/dev/console已经创建等等。
1、InitRamdisk
(1)需要kernel中打开的宏
  CONFIG_BLK_DEV_RAM=y
  CONFIG_BLK_DEV_INITRD=y
  CONFIG_BLK_DEV_MD=y

(2)因为InitRamdisk是使用/dev/ram来作为真是根文件系统的方式,所以需要在cmdline中指定根文件系统root=/dev/ram,这里使用的是通过dts的bootargs来传递cmdline,所以修改如下:
bootargs = “console=ttySAC0,115200n8 root=/dev/ram rw rootwait ignore_loglevel earlyprintk”;

2、独立式InitRamfs
(1)需要kernel中打开的宏
  CONFIG_BLK_DEV_RAM
  CONFIG_BLK_DEV_INITRD
无需配置/dev/ram,通过FIT方式将生成的InitRamfs的cpio包和kernel Image打包到一起。uboot解析到FIT之后会将InitRamfs的cpio包的地址传递给kernel的(方式和InitRamdisk的方式一致)。

3、集成式InitRamfs
(1)需要kernel中打开的宏
  CONFIG_BLK_DEV_RAM
  CONFIG_BLK_DEV_INITRD
无需配置/dev/ram,kernel起来之后,会通过数据段.init.ramfs找到initramfs的位置,rootfs应该就可以正常使用了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值