initrd.img 干了什么

我也是一边学一边把我简单理解的东西拿出来和大家分享,如有错误还希望大家指出。initrd.img 里的东西我还没有吃透。不过我觉得也没关系毕竟我写的是学习笔记而不是教程,有些解释不透的东西大家还希望大家给点思路。现在有些看不懂的东西先跳过,后面会慢慢研究的。

 

上篇文章(什么是 initrd.img) 提到 initrd.img有两种。一种是2.4版本内核以及之前的内核使用的,从2.5开始是另外一种initrd.img。2.6版的initrd.img的解压方式上文已经介绍了。2.4版本使用的initrd.img也需要先用zip方式解压得到 initrd文件,不过之后就不是cpio再进行解压了。这里获得到的initrd文件已经是个标准的image文件了(这个文件我们称为image-initrd),在linux下需要进行挂在,然后可以直接访问。这两种格式的initrd不只是打包方式不同,内部文件也有不同。下面介绍下2种文件的区别。

image-initrd

(1) boot loader(一般大家常用的是grub,关于它的介绍可以到网上搜索)把 initrd.img 初始化成一个设备 /dev/intrd。接着boot loader 把内核以及/dev/initrd的内容加载到内存。
(2) 在内核初始化过程中,内核把 /dev/initrd 设备的内容解压缩并拷贝到 /dev/ram0 设备上。
(3) 内核以可读写的方式把 /dev/ram0 设备挂载为原始的根文件系统。
(4) 如果 /dev/ram0 被指定为真正的根文件系统,那么内核不会执行(5)、(6)、(7)的操作,因为这下操作是为了帮内核加载最终的根文件系统做的工作。
(5) 执行 initrd 上的 /linuxrc 文件,linuxrc 通常是一个脚本文件,负责加载内核访问根文件系统必须的驱动, 以及加载根文件系统。
(6) /linuxrc 执行完毕,真正的根文件系统被挂载。
(7) 如果真正的根文件系统存在 /initrd 目录,那么 /dev/ram0 将从 / 移动到 /initrd。否则如果 /initrd 目录不存在, /dev/ram0 将被卸载。
(8) 在真正的根文件系统上进行正常启动过程 ,执行 /sbin/init。

linux2.4内核的 initrd 的执行是作为内核启动的一个中间阶段,也就是说 initrd 的 /linuxrc执行以后,内核会继续执行初始化代码。2.6 内核同时支持 image-initrd 和 cpip-initrd。而且 image-initrd处理流程也是这样的。

cpio-initrd

(1) boot loader 把内核以及 initrd 文件加载到内存的特定位置
(2) 内核判断initrd的文件格式,如果是cpio格式。
(3) 将initrd的内容释放到/rootfs中。(rootfs本身也是一个基于内存的文件系统。这样就省掉了ramdisk的挂载、卸载等)
(4) 执行initrd中的/init文件,执行到这一点,内核的工作全部结束,完全交给/init文件处理。也就是其实到了最后一步,内核就已经完成了自己所有的工作,直接移交给initrd 的/init。

cpio-initrd和image-initrd处理流程示意图
initrd.img 干了什么_第1张图片

图片来自ibm的一个培训网站。

 

这里是粗略的讨论到了initrd.img的启动过程,正要开始啃 cpio-initrd 中 /init 到底干了些什么。

你可能感兴趣的:(工作,linux,ibm,image,脚本,Linux/Unix,概念原理)