什么是initrd?
-------------------------------------------------
initrd = init ramdisk,是一个启动时存在于内存的文件系统。 initrd的最初的目的是为了把kernel的启动分成两个阶段:在kernel中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的 方式放在initrd中,这样就在启动过程中可以从initrd所mount的根文件系统中装载需要的模块。这样的一个好处就是在保持kernel不变的 情况下,通过修改initrd中的内容就可以灵活的支持不同的硬件。在启动完成的最后阶段,根文件系统可以重新mount到其他设备上。
Linux启动一定要用initrd么?
-------------------------------------------------
如果把需要的功能全都编译到内核中(非模块方式),只需要一个内核文件即可。initrd能够减小启动内核的体积并增加灵活性,如果你的内核以模块方式支 持某种文件系统(例如ext3, UFS),而启动阶段的驱动模块放在这些文件系统上,内核是无法读取文件系统的,从而只能通过initrd的虚拟文件系统来装载这些模块。这里有些人会 问: 既然内核此时不能读取文件系统,那内核的文件是怎么装入内存中的呢?答案很简单,Grub是file-system sensitive的,能够识别常见的文件系统。
如何察看initrd的内容?
-------------------------------------------------
#cd /lib/modules/`uname -r`
#mkinitrd /tmp/initrd.`uname -r`.img `uname -r`
#cd /tmp
#mv initrd.`uname –r`.img initrd.`uname –r`.img.gz(initrd使用gzip压缩,如果不改名字的话,后面无法解压缩)
#gunzip initrd.`uname -r`.img.gz
#file initrd.`uname –r`.img(不同的linux操作系统,这个文件格式有不同,在RHEL4中,这个文件是cpio的,在其他的可能是ext2的,此处使用file命令,察看格式)
如果是cpio:
#mkdir /mnt/tmp
#cd /mnt/tmp
#cpio -idmv
如果是ext2:
#mount -o loop /tmp/initrd.`uname -r` /mnt/tmp
#ls -al /mnt/tmp
如何修改initrd?
-------------------------------------------------
通过上面的操作,我们可以看到initrd的内容,然后就可以修改按照要求,比如我们可以添加一个驱动进去,在上面的/mnt/tmp下面,有一个文件叫 “init”或者“linuxrc”,查看/mnt/tmp中的这个文件内容即可知道启动时会装入哪些驱动程序。还可以更改其中的内容,例如,如果想增加 另一种SCSI驱动aic7xxx.o进入到initrd.img,可以进行如下两种操作:
#cd /mnt/tmp
#vi linuxrc 加上一行“ insmod /lib/aic7xxx.o”
#cp /lib/modules/`uname -r`/scsi/aic7xxx.o lib/
#cd /
#umount /mnt/tmp
#dd if=/tmp/ininrd.`uname –r`.img | gzip > /boot/initrd2.img
或者:
#cd /mnt/tmp
#vi init加上一行 insmod /lib/aic7xxx.o
#cp /lib/modules/`uname -r`/scsi/aic7xxx.o lib/
#cd /mnt/tmp
#find –print |cpio –ov>/tmp/initrd2.img (find的时候最好不要用绝对路径,否则cpio出来的文件以后解压缩也会解到这个绝对路径上面)
#gzip /tmp/initrd2.img
#mv /tmp/initrd2.img.gz /boot/initrd2.img
至此,新的initrd文件initrd2.img中就包含了aic7xxx的驱动程序了
阅读(543) | 评论(0) | 转发(0) |