initrd是什么?
-------------------------------------------------
initrd = init ramdisk,是一個(gè)啟動(dòng)時(shí)存在于內(nèi)存的文件系統(tǒng)。initrd的最初的目的是為了把kernel的啟動(dòng)分成兩個(gè)階段:在kernel中保留最少最基本的啟動(dòng)代碼,然后把對(duì)各種各樣硬件設(shè)備的支持以模塊的方式放在initrd中,這樣就在啟動(dòng)過(guò)程中可以從initrd所mount的根文件系統(tǒng)中裝載需要的模塊。這樣的一個(gè)好處就是在保持kernel不變的情況下,通過(guò)修改initrd中的內(nèi)容就可以靈活的支持不同的硬件。在啟動(dòng)完成的最后階段,根文件系統(tǒng)可以重新mount到其他設(shè)備上。
Linux啟動(dòng)一定要用initrd么?
-------------------------------------------------
如果把需要的功能全都編譯到內(nèi)核中(非模塊方式),只需要一個(gè)內(nèi)核文件即可。initrd能夠減小啟動(dòng)內(nèi)核的體積并增加靈活性,如果你的內(nèi)核以模塊方式支持某種文件系統(tǒng)(例如ext3,UFS),而啟動(dòng)階段的驅(qū)動(dòng)模塊放在這些文件系統(tǒng)上,內(nèi)核是無(wú)法讀取文件系統(tǒng)的,從而只能通過(guò)initrd的虛擬文件系統(tǒng)來(lái)裝載這些模塊。這里有些人會(huì)問(wèn): 既然內(nèi)核此時(shí)不能讀取文件系統(tǒng),那內(nèi)核的文件是怎么裝入內(nèi)存中的呢?答案很簡(jiǎn)單,Grub是file-systemsensitive的,能夠識(shí)別常見(jiàn)的文件系統(tǒng)。
如何察看initrd的內(nèi)容?
-------------------------------------------------
#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壓縮,如果不改名字的話,后面無(wú)法解壓縮)
#gunzip initrd.`uname -r`.img.gz
#file initrd.`uname –r`.img(不同的linux操作系統(tǒng),這個(gè)文件格式有不同,在RHEL4中,這個(gè)文件是cpio的,在其他的可能是ext2的,此處使用file命令,察看格式)
如果是cpio:
#mkdir /mnt/tmp
#cd /mnt/tmp
#cpio -idmv </tmp/initrd.`uname -r`.img
如果是ext2:
#mount -o loop /tmp/initrd.`uname -r` /mnt/tmp
#ls -al /mnt/tmp
如何修改initrd?
-------------------------------------------------
通過(guò)上面的操作,我們可以看到initrd的內(nèi)容,然后就可以修改按照要求,比如我們可以添加一個(gè)驅(qū)動(dòng)進(jìn)去,在上面的/mnt/tmp下面,有一個(gè)文件叫“init”或者“linuxrc”,查看/mnt/tmp中的這個(gè)文件內(nèi)容即可知道啟動(dòng)時(shí)會(huì)裝入哪些驅(qū)動(dòng)程序。還可以更改其中的內(nèi)容,例如,如果想增加另一種SCSI驅(qū)動(dòng)aic7xxx.o進(jìn)入到initrd.img,可以進(jìn)行如下兩種操作:
#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的時(shí)候最好不要用絕對(duì)路徑,否則cpio出來(lái)的文件以后解壓縮也會(huì)解到這個(gè)絕對(duì)路徑上面)
#gzip /tmp/initrd2.img
#mv /tmp/initrd2.img.gz /boot/initrd2.img
至此,新的initrd文件initrd2.img中就包含了aic7xxx的驅(qū)動(dòng)程序了
再將其改名拷貝至/boot目錄,重啟就可以觀察修改后的效果。重啟后無(wú)法成功引導(dǎo)。這是因?yàn)樯傻膇nitrd.img不對(duì)。解決如下:
生成initrd
find . | cpio -o -H newc | gzip > /mnt/sda1/boot/initrd.img-2.6.18-4-686
(注:-H newc 是必須的,否則內(nèi)核會(huì)認(rèn)為是ramdisk,而不是initramfs)
聯(lián)系客服