天天看點

2.6.24核心編譯 initrd-2.6.24.img分析

                              2.6.24核心編譯 initrd-2.6.24.img分析   initrd 的英文含義是 boot loader initialized RAM disk,就是由 boot loader 初始化的記憶體盤。在linux核心啟動前,bootloader 會将存儲媒體中的 initrd 檔案加載到記憶體,核心啟動時會在通路真正的根檔案系統前先通路該記憶體中的 initrd 檔案系統。第一階段啟動的目的是為第二階段的啟動掃清一切障礙,最主要的是加載根檔案系統存儲媒體的驅動子產品。我們知道根檔案系統可以存儲在包括IDE、SCSI、USB在内的多種媒體上,如果将這些裝置的驅動都編譯進核心,可以想象核心會多麼龐大、臃腫。

  initrd.img是Linux啟動過程中很重要的一個檔案,如果沒指定initrd.img或者指定的initrd.img中并沒有包含正确的驅動子產品,則系統啟動時會挂起,并報告"kernel panic: VFS: Unable to mount root fs on 08:06"的錯誤。)

  它把kernel的啟動分成兩個階段:在kernel中保留最少最基本的啟動代碼,然後把對各種各樣硬體裝置的支援以子產品的方式放在initrd中,這樣就在啟動過程中可以從initrd所mount的根檔案系統中裝載需要的子產品。這樣的一個好處就是在保持kernel不變的情況下,通過修改initrd中的内容就可以靈活的支援不同的硬體。在啟動完成的最後階段,根檔案系統可以重新mount到其他裝置上。

  initrd.img不像通常的以.img為擴充名的ramdisk cramfs檔案。它是經過用gzip -9進行壓縮過的ramdisk檔案。一下是我對它的分析過程。

  首先将initrd-2.6.24.img拷貝到操作目錄下:(測試環境:redflag6.0)

  cp initrd-2.6.24.img /home/kernel/initrd.gz

  然後解壓縮:

  gunzip initrd.gz

  解壓後可以看到一個沒有gz字尾的檔案initrd

  這裡就可以用”file initrd”來檢視檔案的類型

  在這裡可以由另一種方法分析和檢視initrd中的内容.但是由于這種方法我沒有試通,是以也就不詳加說明了,隻是把這種方法也列出來.

mount –o loop initrd /mnt

cd /mnt

這時就可以看到initrd中的内容了.

一下是我在我機子上測試通過的方法。環境是redflag6.0。

cp initrd-2.6.24.img /home/kernel/initrd.gz

cd /home/kernel/

gunzip -dc initrd | cpio –idmv

這時在單前檔案夾中就可以看到initrd中的内容了.

可以看到這裡面有以下一些目錄和檔案(當然是除了initrd.gz這是原先cp過來的):

Bin:

  這裡面有三個檔案: insmod modprobe,nash.insmod是用來加載内河子產品的.還可看到modprobe是指向nash程式的.那什麼是nash呢? nash (not a shell)它不是一個SHELL,是一個設計的盡可能小的簡單指令解釋器。主要用于初始化RAM DISK時候解釋裡面的linuxrc或者init這些簡單的腳本。nash目前常用的建構指令如下:

  echo 将字元串輸出到标準輸出,隻是功能上沒有系統裡面echo那麼多。

  find 顯示指定路徑下所比對名稱的檔案,即隻支援linux系統裡find指令中的-name參數。

  losetup 将檔案幫定到回環裝置/dev/loopdev上

  mkdevices指定建立的塊裝置檔案存放路徑,如:mkdevices /dev

  mknod 建立裝置檔案

  

  mkrootdev 建立根檔案系統的裝置節點,根據核心傳遞參數當中的“root=”來建立對應該裝置的節點,節點的名稱是/dev/root,它不僅能夠根據root=/dev/xxx來生成對應的裝置節點,還能夠在碰到root=LABEL=/的情況下探測所有的硬碟分區,以便找到對應着卷标為/的分區。

  pivot_root 轉換根檔案系統,以及挂載臨時根檔案系統。

  raidautorun 自動檢測所有的raid裝置

  showlabels 顯示裝置的LABEL以及UUID sw

  itchroot 與pivot_root功能類似,用于轉換根檔案系統。但隻能用于2.6或以後的核心。

  Bootsplash: 核心的圖形化啟動程序。

  Dev:系統啟動時一些必須的裝置檔案,都是字元裝置,但有一個檔案夾,不知何用?

  etc:衆所周知這是一個成放配置檔案的目錄。這個目錄在嵌入式系統中是非常有有的,有關系統啟動後要執行那些使用者程式或是配置指令都是以shell程式的形式寫在這裡面的。這裡就不詳加說明了。

  Init: init則是其引導的核心檔案,在cpio格式的initrd裡,該檔案的名稱隻能是init。init是一個可以被nash來執行的腳本檔案,負責加載核心通路根檔案系統必須的驅動,以及加載根檔案系統。

  Proc:

Sbin:它是指向bin的

Sys,Sysroot,User:這些就不多說了。

Init檔案中的内容。

#!/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

繼續閱讀