initrd的功能(轉載)

roninwei發表於2008-07-21
為什麼要引入initrd?

Linux啟動過程中肯定要載入核心映象,在此過程中有些要素必須考慮:

首先,核心映象不能太大。由於受到各種硬體和相容性的限制,Linux的核心映象不能太大,但是這並不容易做到。Linux核心的核心部分本身就不小了;而且還必須加入會使用到的驅動程式。

其次,要支援儘可能多的硬體裝置。我們在啟動過程中有一件重要工作:掛載root檔案系統,因為進一步的資料和應用軟體都在其上,所以我們的核心必須能夠 訪問root檔案系統。對於一般使用者,如果他們使用IDE硬碟上的ext2檔案分割槽作為root檔案系統,不會有什麼問題。因為不管是IDE硬碟還是 ext2檔案系統,它們的驅動肯定會包含在核心映象自身裡面。但是,確實存在一些特殊情況:比如說我們希望發行Linux系 統的安裝光碟,那麼對光碟的驅動,就不一定包含在核心裡面了。(有人可能要奇怪了,咦,光碟中的核心映象不都已經讀進來了嗎,怎麼核心還訪問不了光碟呢? 注意,讀入核心映象的是 Boot Loader ,核心並不具備 Boot Loader 的功能。)如果沒有光碟的驅動,我們又怎麼把光碟裡的軟體包安裝到使用者的計算機裡呢?把驅動程式預先編譯到核心裡?聽起來還不錯,可是如果我們除了光碟還 有一些其它的安裝介質,那麼所有這些驅動就會讓核心映象龐大不堪。

而且,還有更嚴重的問題,各種不同的驅動程式很有可能會發生衝突,特別是以前ISA裝置佔市場主導地位的時候,這種衝突簡直難以避免。

那時的解決辦法是發行商提供預先編譯好的支援各種裝置的不同核心,把每個核心放進一張軟盤,隨發行包一起交給使用者,使用者自己選擇裝有合適核心的軟盤進行引導。或者給使用者提供製作引導盤的工具,讓使用者在安裝前製作自己的啟動盤。當然,哪一種辦法都不能讓人滿意。

唯一的希望在於使用模組化機制。在核心啟動的時候呼叫相應的模組載入驅動程式,然後訪問root檔案系統。無論是透過核心對裝置做進一步的分析還是直接從使用者那裡得到配置資訊,先配置再載入模組的辦法,都能有效地避免衝突的發生。

除了在安裝的時候需要在掛載root檔案系統之前呼叫相應的模組之外,在完成安裝的系統上,我們可能仍然需要在掛載root檔案系統之前呼叫一些模組。這主要是為給計算機進行配置——一般都要針對不同的計算機進行核心配置。

理想情況下,使用者按照自己的實際情況配置編譯檔案,重新編譯核心,一步步完成這種工作。但是沒有幾個使用者喜歡這種冗長並且極易出現錯誤的工作。而且編譯和生成核心需要相應的工具,可是大部分使用者不需要這些工具。

在安裝的過程中可以直接編譯一個整體式的核心,但這並不能很好的解決問題:首先,所有的編譯工具還需要,其次,編譯過程中出現差錯導致無法完成任 務的機率太大了。所以,我們仍然要使用模組機制:模組機制很可靠,出了錯誤也只不過不載入對應的模組而已,不會使整個任務失敗。而載入模組,象前面說的, 也是在掛載root檔案系統之前就要得到模組的。

基於以上理由,Linux引入了initrd機制。
initrd做什麼

initrd允許系統在啟動的時候載入一個RAM盤,這個RAM盤可以被當作一個root檔案系統,程式可以在其上執行。(有兩重含義,第一,程 序在上面;第二,程式的檔案系統環境也在上面。)在此之後,可以從別的裝置上掛載一個新的root檔案系統,先前的root檔案系統(initrd)就會 被移動到一個目錄上去,最終被解除安裝掉。

為什麼要使用RAM盤呢?首先,使用RAM盤能方便的支援以後可能發生的變化;另外,也是為了保持 Boot Loader 工作儘可能的簡單。在系統引導時,除了核心映象之外,Boot Loader把所有相關的資訊作為一個檔案讀入記憶體,核心在啟動中將該檔案作為一段連續的記憶體塊看待。也就是把它當作RAM盤來 使用了。正因為如此,這種機制被稱作“初始 RAM 盤 (initial RAM Disk)”,縮 寫成 initrd。

initrd主要用來把系統的啟動劃分為兩個階段:初始啟動的核心只需保留最精簡的驅動程式最小集,此後,在啟動必須載入附加的模組時,從initrd中載入。
initrd進行的操作

使用initrd的時候,典型的系統啟動的流程變為:

Boot Loader讀入核心映象以及initrd檔案

核心將initrd檔案轉成“普通”的RAM盤,並且釋放掉initrd檔案佔用的記憶體。

initrd被當作root檔案系統,以可讀可寫(read-write)方式安裝。

/linuxrc被執行(它可以是任何可執行檔案,包括指令碼在內;它以uid0身份執行,基本上能完成所有init程式可以做的工作)

linuxrc安裝“實際” 的root檔案系統

linuxrc透過pivot_root系統呼叫將root檔案系統放置在root目錄下。

常用的啟動流 程(比如呼叫/sbin/init)開始執行。

解除安裝initrd檔案系統。

注意,這是一個典型流程。其實initrd機制可以透過兩種方式使用:要麼就是作為一個普通的root檔案系統使用,這樣的話第5、第6兩個步驟 可以被略過,直接執行/sbin/init(我 們的試驗系統就是利用這種方法);要麼作為一個過渡環境使用,透過它核心可以繼續裝載“實際”的root檔案系統。
[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7507082/viewspace-1007557/,如需轉載,請註明出處,否則將追究法律責任。

相關文章