歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux服務器 >> Linux 2.4內核下的initrd.img機制分析

Linux 2.4內核下的initrd.img機制分析

日期:2017/3/2 16:33:08   编辑:Linux服務器

1.什麼是initrd

  initrd 的英文含義是 boot loader initialized RAM disk,就是由 boot loader 初始化的內存盤。在 linux內核啟動前, boot loader 會將存儲介質中的 initrd 文件加載到內存,內核啟動時會在訪問真正的根文件系統前先訪問該內存中的 initrd 文件系統。在 boot loader 配置了 initrd 的情況下,內核啟動被分成了兩個階段,第一階段先執行 initrd 文件系統中的某個文件,完成加載驅動模塊等任務,第二階段才會執行真正的根文件系統中的 /sbin/init 進程。

  2.Linux2.4內核對initrd的處理流程

  Linux2.4內核的initrd的格式是文件系統鏡像文件initrd.img,常見的文件系統格式為EXT2。

  linux2.4內核對initrd的處理流程如下:

  1) boot loader把內核以及/dev/initrd的內容加載到內存,/dev/initrd是由boot loader初始化的設備,存儲著initrd。

  2) 在內核初始化過程中,內核把 /dev/initrd 設備的內容解壓縮並拷貝到 /dev/ram0 設備上。

  3) 內核以可讀寫的方式把 /dev/ram0 設備掛載為原始的根文件系統。

  4) 如果 /dev/ram0 被指定為真正的根文件系統,那麼內核跳至最後一步正常啟動。

  5) 執行 initrd 上的 /linuxrc 文件,linuxrc 通常是一個腳本文件,負責加載內核訪問根文件系統必須的驅動, 以及加載根文件系統。

  6) /linuxrc 執行完畢,真正的根文件系統被掛載。

  7) 如果真正的根文件系統存在 /initrd 目錄,那麼 /dev/ram0 將從 / 移動到 /initrd。否則如果 /initrd 目錄不存在, /dev/ram0 將被卸載。

  8) 在真正的根文件系統上進行正常啟動過程 ,執行 /sbin/init。

  linux2.4 內核的 initrd 的執行是作為內核啟動的一個中間階段,也就是說 initrd 的 /linuxrc 執行以後,內核會繼續執行初始化代碼。

  3.initrd文件的創建及修改

  傳統initrd的制作過程比較繁瑣,需要如下六個步驟

  #假設當前目錄位於准備好的initrd文件系統的根目錄下

  /*初始化內存文件系統塊*/

  bash# dd if=/dev/zero of=../initrd.img bs=512k count=5

  /*創建文件系統*/

  bash# mkfs.ext2 -F -m0 ../initrd.img

  /*掛載新文件系統*/

  bash# mount -t ext2 -o loop ../initrd.img /mnt

  /*拷貝文件系統所需的/bin、/dev等目錄文件*/

  bash# cp -r * /mnt

  /*卸載文件系統*/

  bash# umount /mnt

  /*打包為.gz格式*/

  bash# gzip ../initrd.img

  為了簡單起見,我們主要針對於實現對於現有系統中initrd.img文件機制的修改:

  系統中的initrd.img文件大多位於/boot目錄下,此文件為initrd.gz的符號鏈接。

  為實現修改,我們首先將initrd.gz拷貝到用戶目錄下。

  gunzip initrd.gz 解壓後生成initrd的文件

  file initrd可知,initrd:Linux rev 1.0 ext2 filesystem data

  為了查看其文件內容,mount -o loop initrd /mnt/initrd(想要掛載的目錄,可任意選擇)

  cd /mnt/initrd,接下來就能查看initrd內存文件系統中的內容了

  其文件系統的核心工作流程為linuxrc的腳本文件,此腳本完成如下功能:

  1) 掛載系統啟動所必須的設備驅動

  2) 掛載真正的文件系統

  這個時候,我們就能夠對此文件系統進行必須的修改了,如果配置齊全的話,在這裡也能夠形成不亞於Linux的一個新系統呢。。

  修改完後,umount /mnt/initrd,所作修改就能夠保存進initrd的文件中

  gzip initrd,生成新的initrd.gz文件

  創建軟連接new.initrd.img

  修改lilo或者grub的啟動項,使之生效

  reboot後,就能啟動新的initrd文件系統了

  4.nash command

  nash是initrd中的命令解釋器,主要為了運行/linuxrc腳本,其常用命令有:

  echo : 將字符串輸出到標准輸出,只是功能上沒有系統裡面echo那麼多。

  find : 顯示指定路徑下所匹配名稱的文件,即只支持linux系統裡find命令中的-name參數。

  losetup : 將文件幫定到回環設備/dev/loopdev上

  mkdevices : 指定創建的塊設備文件存放路徑,如:mkdevices /dev

  mknod : 創建設備文件

  mkrootdev : 創建根文件系統的設備節點,根據內核傳遞參數當中的“root=”來創建對應該設備的節點,節點的名稱是/dev /root,它不僅能夠根據root=/dev/xxx來生成對應的設備節點,還能夠在碰到root=LABEL=/的情況下探測所有的硬盤分區,以便找到對應著卷標為/的分區。

  pivot_root <newroot> <oldroot> : 把掛載在 <newroot> 下的文件系統當成新的 / 文件系統,而當前的/文件系統被移動到 <oldroot> 下

  raidautorun : 自動檢測所有的raid設備

  showlabe12下一頁

Copyright © Linux教程網 All Rights Reserved