第二部分:initrd文件探秘
kernel被GRUB加载经内存并执行后会进一步加载initrd文件,它是按照initrd文件中提供的init脚本一步步执行的,所以要掌握initrd文件的执行过程就必须要搞清楚init文件的内容和作用。下面我会重点介绍init文件。
1、首先什么是 initial ram disk (缩写
initrd)
它是由 bootloader 初始化的内存盘。在 linux
启动之前,bootloader 会将它(通常是
initrd.img-xxx...xxx 文件)加载到内存中。内核启动的时候会将这个文件解开,并作为根文件系
统使用。而启动阶段的驱动模块(如jbd)放在这些文件系统上,内核是无法读取文件系统的,从而只能通过Linux
initrd启动的虚拟文件系统来装载这些模块。这里有些人会问:
既然内核此时不能读取文件系统,那内核的文件是怎么装入内存中的呢?答案很简单,Grub是file-system
sensitive的,能够识别常见的文件系统。
2、设 计 initrd 的主要目的
目的是让系统的启动分为两个阶段。首先,带有最少但是必要的驱动(这些驱动是在配置内核时选择嵌入方式)的内核启动。然后,其它需要的模块将
从 initrd
中根据实际需要加载(使用udev机制,最重要的根文件系统所在硬盘的控制器接口module)。这样就可以不必将所有的驱动都编译进内核,而根据实际情况有选择地加载。对于启动较慢的设备
如 usb 设备等,如果将驱动编译进内核,当内核访问其上的文件系统时,通常设备还没有准备好,就会造成访问失败。所以,通常 在
initrd 中加载 usb
驱动,然后休眠几秒钟,带设备初始化完成后,再挂载其中的文件系统。
3、系统上安装的相关软件包
geekard@geekard-laptop:~$ dpkg -l \*ini\* |grep ii
ii busybox-initramfs 1:1.13.3-1ubuntu11
Standalone shell setup for initramfs
ii initramfs-tools 0.92bubuntu78 tools
for generating an initramfs
ii initramfs-tools-bin 0.92bubuntu78
binaries used by initramfs-tools
geekard@geekard-laptop:~$
BusyBox combines tiny versions of many common UNIX utilities into a
single small executable. It
provides minimalist replacements for the most common
utilities you would usually find on your desktop system (i.e., ls,
cp, mv, mount, tar, etc.). The
utilities in BusyBox generally have fewer options than
their full-featured GNU cousins; however, the options that are
included provide the expected
functionality and behave very much like their GNU
counterparts.
initramfs-tools-bin软件包提供initrd文件制作工具命令,但更好的方法是手动制作(下面我会详细介绍)。
4、initrd 的具体形式
目前有两种形式:cpio-initrd
和 image-initrd。
image-
initrd
的制作相对麻烦,处理流程相对复杂(内核空间->用户空间->内核空间
与初始化越来越多的在用户空间进 行的趋势不符),主要是2.4及以前的kernle使用,本文不对其进行介绍。
cpio-
initrd
的处理流程(内核空间->用户空间):
1.
boot loader 把内核以 及 initrd
文件加载到内存的特定位置。
2.
内核判断 initrd 的文件格式,如果 是 cpio
格式。
3.
将 initrd 的内容释放 到 rootfs
中。
4.
执行 initrd 中 的 /init 文件,执行到这一点,内核的工作全部结束,完全交给 /init 文件处 理。
cpio- initrd
的制作:
首先在一个目录中建立必要的文件及目录。例如:
song@ubuntu:/home/linux_src/initrd/debian_etch/initrd$
ls -l
总用量 5
drwxr-xr-x 2
song song 864 2007-05-01 21:37
bin
drwxr-xr-x 3
song song 160 2007-05-01 21:37
conf
drwxr-xr-x 4
song song 136 2007-05-01 21:37
etc
-rwxr-xr-x 1
song song 3233 2007-05-02 15:16
init
drwxr-xr-x