一、目的
本文主要讲述linux3.10文件系统初始化过程的第二阶段:加载initrd。
initrd是一个临时文件系统,由bootload负责加载到内存中,里面包含了基本的可执行程序和驱动程序。在linux初始化的初级阶段,它提供了一个基本的运行环境。当成功加载磁盘文件系统后,系统将切换到磁盘文件系统并卸载initrd。
如果是嵌入式设备,那么最终的文件系统就是initrd。
二、cpio文件格式
initrd常用的的文件格式是cpio,cpio格式记录了文件系统的结构和内容。
cpio格式具体定义如图1所示:
cpio格式的文件由段组成,最后一个段比较特殊,文件名为”TRAILER!!!”。
每个段都由文件头、文件名和文件体组成;文件名和文件体的长度由文件头中的name_len和body_len指定,并且文件名和文件体需要按指定字节对齐,所以尾部包含padding。
文件头共110个字节,头6个字节固定为070701,剩下字节的含义分别为:索引节点号、文件模式、用户id、组id、链接数、时间戳、文件体长度、主设备号、次设备号、设备号、文件名长度、保留字段。
其他详细情况请参见init/initramfs.c文件,这里不再描述。
图1
三、initrd文件实例
为了更直观的理解cpio格式的initrd文件,下面看一个实例。
在ubuntu环境中,boot目录下存放着经过压缩的cpio格式文件initrd。
将boot目录下的initrd文件拷贝到任意目录下,重名为为initrd.gz,并且使用gunzip解压。
这样我们就得到了一个cpio格式的initrd文件,使用vi查看文件内容如图2所示(由于文件太大,只展示了部分内容):
简单分析后显示该文件包含了script/nfs-top目录、script/nfs-top/ORDER文件、script/nfs-top/udev文件、run目录、标志cpio结束的TRAILER!!!文件。
图2
四、解压initrd文件
initrd经过gunzip解压后,可以使用cpio工具解压cpio格式的文件。命令如下:
[cpp] view plaincopy
- root: cpio-idmv < initrd
解压成功后,使用ls命令查看initrd文件内容如图3所示:
bin和sbin目录下包含基本的可执行程序;conf和etc目录下是配置文件;lib目录下是可执行程序使用的动态库;scripts目录下是脚本程序;init程序。initrd必须提供一个init程序,linux在加载完initrd后,会跳转到init程序,由init程序负责后面的初始化工作。
图3
五、总结
本文详细介绍了cpio格式的initrd文件,以及解压后各个目录的含义。initrd文件系统提供了init程序,在linux初始化阶段的后期会跳转到init程序,由该程序负责加载驱动程序和挂载磁盘文件系统以及其他的初始化工作。