日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

2.6.24內(nèi)核編譯 initrd-2.6.24.img分析

;initrd 的英文含義是 boot loader initialized RAM disk , 就是由 boot loader 初始化的內(nèi)存盤 。在 linux內(nèi)核啟動(dòng)前 , bootloader 會(huì)將存儲(chǔ)介質(zhì)中的 initrd 文件加載到內(nèi)存 , 內(nèi)核啟動(dòng)時(shí)會(huì)在訪問真正的根文件系統(tǒng)前先訪問該內(nèi)存中的 initrd 文件系統(tǒng) 。第一階段啟動(dòng)的目的是為第二階段的啟動(dòng)掃清一切障愛 , 最主要的是加載根文件系統(tǒng)存儲(chǔ)介質(zhì)的驅(qū)動(dòng)模塊 。我們知道根文件系統(tǒng)可以存儲(chǔ)在包括IDE、SCSI、USB在內(nèi)的多種介質(zhì)上 , 如果將這些設(shè)備的驅(qū)動(dòng)都編譯進(jìn)內(nèi)核 , 可以想象內(nèi)核會(huì)多么龐大、臃腫 。initrd.img是Linux啟動(dòng)過(guò)程中很重要的一個(gè)文件 , 如果沒指定initrd.img或者指定的initrd.img中并沒有包含正確的驅(qū)動(dòng)模塊 , 則系統(tǒng)啟動(dòng)時(shí)會(huì)掛起 , 并報(bào)告"kernel panic: VFS: Unable to mount root fs on 08:06"的錯(cuò)誤 。) 它把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è)備上 。initrd.img不像通常的以.img為擴(kuò)展名的ramdisk cramfs文件 。它是經(jīng)過(guò)用gzip -9進(jìn)行壓縮過(guò)的ramdisk文件 。一下是我對(duì)它的分析過(guò)程 。首先將initrd-2.6.24.img拷貝到操作目錄下:(測(cè)試環(huán)境:redflag6.0) cp initrd-2.6.24.img /home/kernel/initrd.gz 然后解壓縮: gunzip initrd.gz 解壓后可以看到一個(gè)沒有g(shù)z后綴的文件initrd 這里就可以用”file initrd”來(lái)查看文件的類型 在這里可以由另一種方法分析和查看initrd中的內(nèi)容.但是由于這種方法我沒有試通,所以也就不詳加說(shuō)明了,只是把這種方法也列出來(lái). mount –o loop initrd /mnt cd /mnt 這時(shí)就可以看到initrd中的內(nèi)容了. 一下是我在我機(jī)子上測(cè)試通過(guò)的方法 。環(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過(guò)來(lái)的): Bin: 這里面有三個(gè)文件: insmod modprobe,nash.insmod是用來(lái)加載內(nèi)河模塊的.還可看到modprobe是指向nash程序的.那什么是nash呢? nash (not a shell)它不是一個(gè)SHELL , 是一個(gè)設(shè)計(jì)的盡可能小的簡(jiǎn)單命令解釋器 。主要用于初始化RAM DISK時(shí)候解釋里面的linuxrc或者init這些簡(jiǎn)單的腳本 。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=”來(lái)創(chuàng)建對(duì)應(yīng)該設(shè)備的節(jié)點(diǎn) , 節(jié)點(diǎn)的名稱是/dev/root , 它不僅能夠根據(jù)root=/dev/xxx來(lái)生成對(duì)應(yīng)的設(shè)備節(jié)點(diǎn) , 還能夠在碰到root=LABEL=/的情況下探測(cè)所有的硬盤分區(qū) , 以便找到對(duì)應(yīng)著卷標(biāo)為/的分區(qū) 。pivot_root 轉(zhuǎn)換根文件系統(tǒng) , 以及掛載臨時(shí)根文件系統(tǒng) 。raidautorun 自動(dòng)檢測(cè)所有的raid設(shè)備 showlabels 顯示設(shè)備的LABEL以及UUID sw itchroot 與pivot_root功能類似 , 用于轉(zhuǎn)換根文件系統(tǒng) 。但只能用于2.6或以后的核心 。Bootsplash: 內(nèi)核的圖形化啟動(dòng)進(jìn)程 。Dev:系統(tǒng)啟動(dòng)時(shí)一些必須的設(shè)備文件 , 都是字符設(shè)備 , 但有一個(gè)文件夾 , 不知何用? etc:眾所周知這是一個(gè)成放配置文件的目錄 。這個(gè)目錄在嵌入式系統(tǒng)中是非常有有的 , 有關(guān)系統(tǒng)啟動(dòng)后要執(zhí)行那些用戶程序或是配置命令都是以shell程序的形式寫在這里面的 。這里就不詳加說(shuō)明了 。Init: init則是其引導(dǎo)的核心文件 , 在cpio格式的initrd里 , 該文件的名稱只能是init 。init是一個(gè)可以被nash來(lái)執(zhí)行的腳本文件 , 負(fù)責(zé)加載內(nèi)核訪問根文件系統(tǒng)必須的驅(qū)動(dòng) , 以及加載根文件系統(tǒng) 。Proc: Sbin:它是指向bin的 Sys , Sysroot , User:這些就不多說(shuō)了 。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

推薦閱讀