歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux服務器 >> 2.6.24內核編譯 initrd-2.6.24.img分析

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

日期:2017/3/2 16:51:38   编辑:Linux服務器
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

Copyright © Linux教程網 All Rights Reserved