什麼是 initrd.img

牛晨光發表於2009-02-18

對我個人而言,學習一個系統的最好的方法就是隨著其啟動執行的過程一點一點跟進(就好象看一個程式的原始碼要從main函式或者說從入口函式開始步步跟進)。當然具體的學習過程重點不是找到入口點就OK的。中間還有很多技巧,比如什麼時候這個應該跳過一個實現什麼時候應該跟進等。這個具體方法就一言難盡了,我也不再多少說了。不多說的兩個簡單原因:1、正如我開始說的,這個方法也許只適合我。 2、並不是本篇文章的重點。

我前面那麼多廢話只是想帶出我聊聊的的 initrd.img檔案,因為它就是系統啟動會載入的檔案。說 initrd.img檔案還會提到另外一個名角---vmlinuz 。vmlinuz 正式 linux的核心,當然這裡不是要討論它。

 

一般來講大家很容易理解的是這樣的:系統核心 vmlinuz被載入到記憶體後開始提供底層支援,在核心的支援下各種模組,服務等被載入執行。這樣當然是大家最容易接受的方式,曾經的linux就是這樣的執行的。假設你的硬碟是scsi 介面而你的核心又不支援這種介面時,你的核心就沒有辦法訪問硬碟,當然也沒法載入硬碟上的檔案系統,怎麼辦?好辦!把核心加入scsi驅動原始碼然後重新編譯出一個新的核心檔案替換原來vmlinuz。

需要改變標準核心預設提供支援的例子還有很多,如果每次都需要編譯核心就太麻煩了。所以後來的linux就提供了一個靈活的方法來解決這些問題---initrd.img

ininrd.img是什麼呢?initrd 的含義是initialized ram disk. ramdisk是用一部分記憶體模擬成磁碟,讓作業系統訪問。舉個例子,不知道你用過沒用過win pe他的衍生版比較有名的就是“深山紅葉系統修復光碟”。當使用win pe 啟動後會發現你的計算機就算沒有硬碟也能在正常執行,其中有個檔案系統B:/ 分割槽,這個分割槽就是記憶體模擬的磁碟。

initrd.img檔案就是個ramdisk的映像檔案(其實是壓縮過的,後面會解釋)。ram disk是標準核心檔案認識的裝置(/dev/ram0)檔案系統也是標準核心認識的檔案系統。核心載入這個ram disk作為根檔案系統並開始執行其中的"某個檔案"(2.6核心是 init檔案)來載入各種模組(支援scsi的驅動就可以放在這裡),服務等(這時然後系統就更強大了)。經過一些配置和執行後,就可以去物理磁碟載入真正的root分割槽了,然後又是一些配置等,最後啟動成功。

也就是你只需要定製適合自己的 initrd.img 檔案就可以了。這要比重編核心簡單多了,省時省事低風險。核心啟動過程中具體執行了initrd.img 內的哪些檔案和順序不在本文討論,下面只講講你怎樣才能看到 initrd.img的內容。

這個方法是對kernel-2.5之後的版本適用的。因為這之前的initrd.img和之後的格式是不同的。這之後的版本一般被稱為cpio-initrd。 initrd.img 是個gz壓縮檔案,initrd.img改名為initrd.gz能用windows下的winrar或linux下的gunzip解壓,解壓後會得到一個initrd檔案。這個檔案就是cpio格式的檔案,只能在linux下用cpio命令解壓(我沒找到在windows下能解藥cpio格式的工具,如果你找到了告訴我一下,謝謝) ,執行cpio -i < initrd

這篇只是簡單的說了說 initrd.img 的作用,也許有表述的不嚴謹的地方,還請大家多多指教。

相關文章