ITEEDU

linux2.6 内核kernel对 Initrd 的处理流程

linux2.6 内核支持两种格式的 initrd,一种是前面 linux2.4 内核那种传统格式的文件系统镜像-image-initrd,它的制作方法同 Linux2.4 内核的 initrd 一样,其核心文件就是 /linuxrc。

另外一种格式的 initrd 是 cpio 格式的,这种格式的 initrd 从 linux2.5 起开始引入,使用 cpio 工具生成,其核心文件不再是 /linuxrc,而是 /init。

尽管 linux2.6 内核对 cpio-initrd和 image-initrd 这两种格式的 initrd 均支持,但对其处理流程有着显著的区别,下面分别介绍 linux2.6 内核对这两种 initrd 的处理流程。

cpio-initrd 的处理流程

  • 1. boot loader 把内核以及 initrd 文件加载到内存的特定位置。
  • 2. 内核判断initrd的文件格式,如果是cpio格式。
  • 3. 将initrd的内容释放到rootfs中。
  • 4. 执行initrd中的/init文件,执行到这一点,内核的工作全部结束,完全交给/init文件处理。

image-initrd的处理流程

  • 1. boot loader把内核以及initrd文件加载到内存的特定位置。
  • 2. 内核判断initrd的文件格式,如果不是cpio格式,将其作为image-initrd处理。
  • 3. 内核将initrd的内容保存在rootfs下的/initrd.image文件中。
  • 4. 内核将/initrd.image的内容读入/dev/ram0设备中,也就是读入了一个内存盘中。
  • 5. 接着内核以可读写的方式把/dev/ram0设备挂载为原始的根文件系统。
  • 6. .如果/dev/ram0被指定为真正的根文件系统,那么内核跳至最后一步正常启动。
  • 7. 执行initrd上的/linuxrc文件,linuxrc通常是一个脚本文件,负责加载内核访问根文件系统必须的驱动, 以及加载根文件系统。
  • 8. /linuxrc执行完毕,常规根文件系统被挂载
  • 9. 如果常规根文件系统存在/initrd目录,那么/dev/ram0将从/移动到/initrd。否则如果/initrd目录不存在, /dev/ram0将被卸载。
  • 10. 在常规根文件系统上进行正常启动过程 ,执行/sbin/init。

通过上面的流程介绍可知,Linux2.6内核对image-initrd的处理流程同linux2.4内核相比并没有显著的变化, cpio-initrd的处理流程相比于image-initrd的处理流程却有很大的区别,流程非常简单。

cpio-initrd同image-initrd的区别与优势

cpio-initrd的制作方法更加简单 ,而传统initrd的制作过程比较繁琐,后面有详细介绍。

cpio-initrd的内核处理流程更加简化

通过上面initrd处理流程的介绍,cpio-initrd的处理流程显得格外简单,通过对比可知cpio-initrd的处理流程在如下两个方面得到了简化:

1. cpio-initrd并没有使用额外的ramdisk,而是将其内容输入到rootfs中,其实rootfs本身也是一个基于内存的文件系统。这样就省掉了ramdisk的挂载、卸载等步骤。

2. cpio-initrd启动完/init进程,内核的任务就结束了,剩下的工作完全交给/init处理;而对于image-initrd,内核在执行完 /linuxrc进程后,还要进行一些收尾工作,并且要负责执行真正的根文件系统的/sbin/init。

cpio-initrd的职责更加重要

cpio-initrd不再象image-initrd那样作为linux内核启动的一个中间步骤,而是作为内核启动的终点,内核将控 制权交给cpio-initrd的/init文件后,内核的任务就结束了,所以在/init文件中,我们可以做更多的工作,而不比担心同内核后续处理的衔 接问题。当然目前linux发行版的cpio-initrd的/init文件的内容还没有本质的改变,但是相信initrd职责的增加一定是一个趋势。