Linux2 6 核心的 Initrd 機制解析

2021-09-30 01:38:02 字數 2035 閱讀 3897

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 處理流程的乙個顯著區別。

Linux 2 6核心編譯,核心公升級

本文描述了在fc8下公升級linux核心為2.6.25的詳細步驟.1.首先從如下 得到linux 2.6.25.2.然後在 usr src下untar這個包.tar xjfv linux 2.6.25.tar.bz2 3.配置核心 cd usr src linux 2.6.25 make mrpro...

Linux2 6核心啟動分析

我們已知u boot的終極目的是啟動核心,那麼核心啟動的開始必定是u boot傳入的引數。開啟armlinux.c 發現有一行的 為 thekernel 0,bd bi arch number,bd bi boot params 帶入三個引數 第乙個引數是0,第二個引數是機器id,第三個引數是引數所...

Linux 2 6 核心驅動移植

隨著 linux 2.6的發布,由於2.6核心做了教的改動,各個裝置的 驅動程式在不同程度上要進行改寫。為了方便各位linux愛好者我把自己整理的這分文件share出來。該文當列舉了2.6核心同以前版本的絕大多數變化,可惜的是由於時間和精力有限沒有詳細列出各個函式的用法。1 使用新的入口 必須包含 ...