initrd.img初次体会

我们知道,当linux内核解压在内存以后下面的事情就由initrd.img来处理。那么具体都处理什么呢?

最近我将initrd.img的cpio档解压出来研究了一番。那么在这个归档里首先有bin,sbin,这些就是用busybox编译出来替代linux原工具程序的,做个嵌入式的都不会陌生。可谓短小精悍却功能强大,我就不必多说了。那么我主要说一下里面的几个重要的地方。比如init,这个是贯穿整个启动过程的。它就是主线。里面分别去执行相关的脚本文件。它的大致过程是建立/dev,/sys,/proc目录,然后运行udev脚本把硬件信息注册到相关的结构里,那些硬件结构的初始化应该是由bios首先登记的,这些我以前看的资料里有所提及。随后把控制台准备好,以便下面输出运行信息。根据环境变量(那些值有的是grub命令行获取的,有的是根据硬件确定的)执行一定的脚本程序,为挂载文件系统做准备。那么下面肯定是挂载文件系统。这里要强调有的时候我们会设置resume这个环境变量,它的主要作用是挂载根文件系统失败时会用resume的值再次尝试挂载,第二次失败那么就没办法了。比如脚本文件里有这么两行可以体现:

activate_vg "$ROOT"
activate_vg "$resume"

挂载成功后一些扫尾工作也是用脚本程序,最后寻找根文件系统中几个init,比如/bin/init,/sbin/init,/usr/bin/init./usr/sbin/init,/etc/init等。找到后就进入用户空间了,如果找不到会出现panic。那么在归档里的体现就是脚本文件夹scripts,大部门脚本程序都在里面。functions文件主要是定义几个函数,供脚本程序不停地调用。当然根文件系统,udev设备都离不开驱动和库,这就是/lib文件夹里的内容。那么剩下的是/conf和/etc,这里面基本都是运程过程中需要的配置文件。这就是initrd.img的归档基本内容。一般PC机上的initrd基本可以满足所有的启动要求,但是我们熟练以后可以删除掉一些不必要的,以提高归档大小和启动速度。

总之,我们抓住init这个启动文件作为线索,跟踪进入它的每一条脚本命令,仔细研究那些脚本文件,会有一些收获的。

你可能感兴趣的:(initrd.img初次体会)