一、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文件系统进行
(3)初始化进程init的区别
InitRamdisk,使用根文件系统下的/linuxrc来作为init进程
InitRamfs,使用根文件系统下的/init来作为init进程
(4)内核支持版本上的差异
InitRamdisk,由kernel 2.4版本上开始支持
InitRamfs,由kernel 2.6版本上开始支持
(5)镜像的差异和制作方式上的差异会在后面说明
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 -