initrd 的英文含義是 boot loader initialized RAM disk,就是由 boot loader 初始化的內(nèi)存盤。在 linux內(nèi)核啟動前, bootloader 會將存儲介質(zhì)中的 initrd 文件加載到內(nèi)存,內(nèi)核啟動時(shí)會在訪問真正的根文件系統(tǒng)前先訪問該內(nèi)存中的 initrd 文件系統(tǒng)。第一階段啟動的目的是為第二階段的啟動掃清一切障愛,最主要的是加載根文件系統(tǒng)存儲介質(zhì)的驅(qū)動模塊。我們知道根文件系統(tǒng)可以存儲在包括IDE、SCSI、USB在內(nèi)的多種介質(zhì)上,如果將這些設(shè)備的驅(qū)動都編譯進(jìn)內(nèi)核,可以想象內(nèi)核會多么龐大、臃腫。
initrd.img是Linux啟動過程中很重要的一個文件,如果沒指定initrd.img或者指定的initrd.img中并沒有包含正確的驅(qū)動模塊,則系統(tǒng)啟動時(shí)會掛起,并報(bào)告"kernel panic: VFS: Unable to mount root fs on 08:06"的錯誤。)
它把kernel的啟動分成兩個階段:在kernel中保留最少最基本的啟動代碼,然后把對各種各樣硬件設(shè)備的支持以模塊的方式放在initrd中,這樣就在啟動過程中可以從initrd所mount的根文件系統(tǒng)中裝載需要的模塊。這樣的一個好處就是在保持kernel不變的情況下,通過修改initrd中的內(nèi)容就可以靈活的支持不同的硬件。在啟動完成的最后階段,根文件系統(tǒng)可以重新mount到其他設(shè)備上。
initrd.img不像通常的以.img為擴(kuò)展名的ramdisk cramfs文件。它是經(jīng)過用gzip -9進(jìn)行壓縮過的ramdisk文件。一下是我對它的分析過程。
首先將initrd-2.6.24.img拷貝到操作目錄下:(測試環(huán)境:redflag6.0)
cp initrd-2.6.24.img /home/kernel/initrd.gz
然后解壓縮:
gunzip initrd.gz
解壓后可以看到一個沒有g(shù)z后綴的文件initrd
這里就可以用”file initrd”來查看文件的類型
在這里可以由另一種方法分析和查看initrd中的內(nèi)容.但是由于這種方法我沒有試通,所以也就不詳加說明了,只是把這種方法也列出來.
mount –o loop initrd /mnt
cd /mnt
這時(shí)就可以看到initrd中的內(nèi)容了.
一下是我在我機(jī)子上測試通過的方法。環(huán)境是redflag6.0。
cp initrd-2.6.24.img /home/kernel/initrd.gz
cd /home/kernel/
gunzip -dc initrd | cpio –idmv
這時(shí)在單前文件夾中就可以看到initrd中的內(nèi)容了.
可以看到這里面有以下一些目錄和文件(當(dāng)然是除了initrd.gz這是原先cp過來的):
Bin:
這里面有三個文件: insmod modPRobe,nash.insmod是用來加載內(nèi)河模塊的.還可看到modprobe是指向nash程序的.那什么是nash呢? nash (not a shell)它不是一個SHELL,是一個設(shè)計(jì)的盡可能小的簡單命令解釋器。主要用于初始化RAM DISK時(shí)候解釋里面的linuxrc或者init這些簡單的腳本。nash目前常用的構(gòu)建命令如下:
echo 將字符串輸出到標(biāo)準(zhǔn)輸出,只是功能上沒有系統(tǒng)里面echo那么多。
find 顯示指定路徑下所匹配名稱的文件,即只支持linux系統(tǒng)里find命令中的-name參數(shù)。
losetup 將文件幫定到回環(huán)設(shè)備/dev/loopdev上
mkdevices指定創(chuàng)建的塊設(shè)備文件存放路徑,如:mkdevices /dev
mknod 創(chuàng)建設(shè)備文件
mkrootdev 創(chuàng)建根文件系統(tǒng)的設(shè)備節(jié)點(diǎn),根據(jù)內(nèi)核傳遞參數(shù)當(dāng)中的“root=”來創(chuàng)建對應(yīng)該設(shè)備的節(jié)點(diǎn),節(jié)點(diǎn)的名稱是/dev/root,它不僅能夠根據(jù)root=/dev/xxx來生成對應(yīng)的設(shè)備節(jié)點(diǎn),還能夠在碰到root=LABEL=/的情況下探測所有的硬盤分區(qū),以便找到對應(yīng)著卷標(biāo)為/的分區(qū)。
pivot_root 轉(zhuǎn)換根文件系統(tǒng),以及掛載臨時(shí)根文件系統(tǒng)。
raidautorun 自動檢測所有的raid設(shè)備
showlabels 顯示設(shè)備的LABEL以及UUID sw
itchroot 與pivot_root功能類似,用于轉(zhuǎn)換根文件系統(tǒng)。但只能用于2.6或以后的核心。
Bootsplash: 內(nèi)核的圖形化啟動進(jìn)程。
Dev:系統(tǒng)啟動時(shí)一些必須的設(shè)備文件,都是字符設(shè)備,但有一個文件夾,不知何用?
etc:眾所周知這是一個成放配置文件的目錄。這個目錄在嵌入式系統(tǒng)中是非常有有的,有關(guān)系統(tǒng)啟動后要執(zhí)行那些用戶程序或是配置命令都是以shell程序的形式寫在這里面的。這里就不詳加說明了。
Init: init則是其引導(dǎo)的核心文件,在cpio格式的initrd里,該文件的名稱只能是init。init是一個可以被nash來執(zhí)行的腳本文件,負(fù)責(zé)加載內(nèi)核訪問根文件系統(tǒng)必須的驅(qū)動,以及加載根文件系統(tǒng)。
Proc:
Sbin:它是指向bin的
Sys,Sysroot,User:這些就不多說了。
Init文件中的內(nèi)容。
#!/bin/nash
mount -t proc /proc /proc
setquiet
echo Mounting proc filesystem
echo Mounting sysfs filesystem
mount -t sysfs /sys /sys
echo > /sys/power/suspend2/do_resume
echo Creating /dev
mount -o mode=0755 -t tmpfs /dev /dev
mkdir /dev/pts
mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts
mkdir /dev/shm
mkdir /dev/mapper
echo Creating initial device nodes
mknod /dev/null c 1 3
mknod /dev/zero c 1 5
mknod /dev/systty c 4 0
mknod /dev/tty c 5 0
mknod /dev/console c 5 1
mknod /dev/ptmx c 5 2
mknod /dev/rtc c 10 135
mknod /dev/tty0 c 4 0
mknod /dev/tty1 c 4 1
mknod /dev/tty2 c 4 2
mknod /dev/tty3 c 4 3
mknod /dev/tty4 c 4 4
mknod /dev/tty5 c 4 5
mknod /dev/tty6 c 4 6
mknod /dev/tty7 c 4 7
mknod /dev/tty8 c 4 8
mknod /dev/tty9 c 4 9
mknod /dev/tty10 c 4 10
mknod /dev/tty11 c 4 11
mknod /dev/tty12 c 4 12
mknod /dev/ttyS0 c 4 64
mknod /dev/ttyS1 c 4 65
mknod /dev/ttyS2 c 4 66
mknod /dev/ttyS3 c 4 67
echo Setting up hotplug.
hotplug
echo Creating block device nodes.
mkblkdevs
echo "Loading uhci-hcd.ko module"
insmod /lib/uhci-hcd.ko
echo "Loading ohci-hcd.ko module"
insmod /lib/ohci-hcd.ko
echo "Loading ehci-hcd.ko module"
insmod /lib/ehci-hcd.ko
mount -t usbfs /proc/bus/usb /proc/bus/usb
echo "Loading jbd.ko module"
insmod /lib/jbd.ko
echo "Loading ext3.ko module"
insmod /lib/ext3.ko
echo "Loading scsi_mod.ko module"
insmod /lib/scsi_mod.ko
echo "Loading sd_mod.ko module"
insmod /lib/sd_mod.ko
echo "Loading libata.ko module"
insmod /lib/libata.ko
echo "Loading ata_generic.ko module"
insmod /lib/ata_generic.ko
echo "Loading ata_piix.ko module"
insmod /lib/ata_piix.ko
echo Waiting for driver initialization.
stabilized --hash --interval 250 /proc/scsi/scsi
echo "Loading mptbase.ko module"
insmod /lib/mptbase.ko
echo "Loading mptscsih.ko module"
insmod /lib/mptscsih.ko
mkblkdevs
resume LABEL=SWAP-hda3
echo Creating root device.
mkrootdev -t ext3 -o defaults,ro hda2
echo Mounting root filesystem.
mount /sysroot
echo Setting up other filesystems.
setuproot
echo Switching to new root and running init.
switchroot
新聞熱點(diǎn)
疑難解答
圖片精選