Linux2.6 核心的 Initrd 機制解析(1)(轉貼好文)

tonykorn97發表於2006-11-26
1.什麼是 Initrd

initrd 的英文含義是 boot loader initialized RAM disk,就是由 boot loader 初始化的記憶體盤。在 linux核心啟動前, boot loader 會將儲存介質中的 initrd 檔案載入到記憶體,核心啟動時會在訪問真正的根檔案系統前先訪問該記憶體中的 initrd 檔案系統。在 boot loader 配置了 initrd 的情況下,核心啟動被分成了兩個階段,第一階段先執行 initrd 檔案系統中的"某個檔案",完成載入驅動模組等任務,第二階段才會執行真正的根檔案系統中的 /sbin/init 程式。這裡提到的"某個檔案",Linux2.6 核心會同以前版本核心的不同,所以這裡暫時使用了"某個檔案"這個稱呼,後面會詳細講到。第一階段啟動的目的是為第二階段的啟動掃清一切障愛,最主要的是載入根檔案系統儲存介質的驅動模組。我們知道根檔案系統可以儲存在包括IDE、SCSI、USB在內的多種介質上,如果將這些裝置的驅動都編譯進核心,可以想象核心會多麼龐大、臃腫。


Initrd 的用途主要有以下四種:

1. linux 發行版的必備部件

linux 發行版必須適應各種不同的硬體架構,將所有的驅動編譯進核心是不現實的,initrd 技術是解決該問題的關鍵技術。Linux 發行版在核心中只編譯了基本的硬體驅動,在安裝過程中透過檢測系統硬體,生成包含安裝系統硬體驅動的 initrd,無非是一種即可行又靈活的解決方案。

2. livecd 的必備部件

同 linux 發行版相比,livecd 可能會面對更加複雜的硬體環境,所以也必須使用 initrd.

3. 製作 Linux usb 啟動盤必須使用 initrd

usb 裝置是啟動比較慢的裝置,從驅動載入到裝置真正可用大概需要幾秒鐘時間。如果將 usb 驅動編譯進核心,核心通常不能成功訪問 usb 裝置中的檔案系統。因為在核心訪問 usb 裝置時, usb 裝置通常沒有初始化完畢。所以常規的做法是,在 initrd 中載入 usb 驅動,然後休眠幾秒中,等待 usb裝置初始化完畢後再掛載 usb 裝置中的檔案系統。

4. 在 linuxrc 指令碼中可以很方便地啟用個性化 bootsplash.

2.Linux2.4核心對 Initrd 的處理流程

為了使讀者清晰的瞭解Linux2.6核心initrd機制的變化,在重點介紹Linux2.6核心initrd之前,先對linux2.4核心的initrd進行一個簡單的介紹。Linux2.4核心的initrd的格式是檔案系統映象檔案,本文將其稱為image-initrd,以區別後面介紹的linux2.6核心的cpio格式的initrd. 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 執行以後,核心會繼續執行初始化程式碼,我們後面會看到這是 linux2.4 核心同 2.6 核心的 initrd 處理流程的一個顯著區別。

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

相關文章