分类: LINUX
2010-12-26 16:55:12
1、initrd.img文件:
参考: 和
1) 什么是initrd?
initrd的英文含义是 boot loader initialized RAM disk,即由bootloader初始化的内存盘。在linux内核启动前,bootloader会将存储介质中的initrd文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的initrd文件系统。在bootloader配置了initrd的情况下,内核启动被分成了两个阶段:第一个阶段先执行initrd文件系统中的“某个文件”,完成加载驱动模块等任务;第二个阶段才会执行真正的根文件系统中的/sbin/init进程。
第一阶段启动的目的是为第二阶段的启动扫清一切障碍,最主要的是加载根文件系统存储介质的驱动模块,根文件系统可以存储在包括IDE、SCSI、USB在内的多种介质上,如果将这些设备的驱动都编译进内核,可以想象内核会多么庞大、臃肿。
2)initrd的本质:
initrd.img是一个gzip和 cpio双重打包的文件,如果你把他解开就会发现,其实它包含了一个微型的根文件系统:
--------------------------------------------------------
mkdir /myinitrd
cd /myinitrd
cp /boot/initrd.img-2.6.22-14-generic .
zforce *
gunzip initrd.img-2.6.22-14-generic.gz
cpio -i -F initrd.img-2.6.22-14-generic
ls
---------------------------------------------------------
可以看到,该目录下包含了一些bin命令目录,etc脚本目录及lib模块目录等等。内核在启动的时候,会将initrd.img-2.6.22-14-generic解压到内存,建立一个临时的用户环境,利用这些工具处理一些必须在这个阶段完成的任务,如加载根设备驱动等等。
重新打包可以这样做:
---------------------------------------------------------
find . | cpio -o -H newc | gzip -9 > ../initrd.gz
---------------------------------------------------------
ubuntu上建议用户使用update-initramfs来维护和生成initrd.img,高级用户可以使用mkinitramfs在内核编译完成后得到该文件。以前的标准工具mkinitrd似乎不再被使用。其实这些工具就是一些脚本。
我们可以通过grub或者lilo给内核传递参数,告诉它应该使用哪一个initrd.img文件: