Linux2 6 核心的 Initrd 機制解析

2022-07-17 09:33:09 字數 2565 閱讀 8044

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

為了使讀者清晰的了解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 處理流程的乙個顯著區別。

linux2.6 核心支援兩種格式的 initrd,一種是前面第 3 部分介紹的 linux2.4 核心那種傳統格式的檔案系統映象-image-initrd,它的製作方法同 linux2.4 核心的 initrd 一樣,其核心檔案就是 /linuxrc。另外一種格式的 initrd 是 cpio 格式的,這種格式的 initrd 從 linux2.5 起開始引入,使用 cpio 工具生成,其核心檔案不再是 /linuxrc,而是 /init,本文將這種 initrd 稱為 cpio-initrd。儘管 linux2.6 核心對 cpio-initrd和 image-initrd 這兩種格式的 initrd 均支援,但對其處理流程有著顯著的區別,下面分別介紹 linux2.6 核心對這兩種 initrd 的處理流程。

1. boot loader 把核心以及 initrd 檔案載入到記憶體的特定位置。

2. 核心判斷initrd的檔案格式,如果是cpio格式。

3. 將initrd的內容釋放到rootfs中。

4. 執行initrd中的/init檔案,執行到這一點,核心的工作全部結束,完全交給/init檔案處理。

1. boot loader把核心以及initrd檔案載入到記憶體的特定位置。

2. 核心判斷initrd的檔案格式,如果不是cpio格式,將其作為image-initrd處理。

3. 核心將initrd的內容儲存在rootfs下的/initrd.image檔案中。

4. 核心將/initrd.image的內容讀入/dev/ram0裝置中,也就是讀入了乙個記憶體盤中。

5. 接著核心以可讀寫的方式把/dev/ram0裝置掛載為原始的根檔案系統。

6. .如果/dev/ram0被指定為真正的根檔案系統,那麼核心跳至最後一步正常啟動。

7. 執行initrd上的/linuxrc檔案,linuxrc通常是乙個指令碼檔案,負責載入核心訪問根檔案系統必須的驅動, 以及載入根檔案系統。

8. /linuxrc執行完畢,常規根檔案系統被掛載

9. 如果常規根檔案系統存在/initrd目錄,那麼/dev/ram0將從/移動到/initrd。否則如果/initrd目錄不存在, /dev/ram0將被解除安裝。

10. 在常規根檔案系統上進行正常啟動過程 ,執行/sbin/init。

通 過上面的流程介紹可知,linux2.6核心對image-initrd的處理流程同linux2.4核心相比並沒有顯著的變化, cpio-initrd的處理流程相比於image-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 使用新的入口 必須包含 ...