天天看點

linux檔案系統初始化過程(3)---加載initrd(上)一、目的 二、cpio檔案格式 三、initrd檔案執行個體 四、解壓initrd檔案 五、總結

    本文主要講述linux3.10檔案系統初始化過程的第二階段:加載initrd。

    initrd是一個臨時檔案系統,由bootload負責加載到記憶體中,裡面包含了基本的可執行程式和驅動程式。在linux初始化的初級階段,它提供了一個基本的運作環境。當成功加載磁盤檔案系統後,系統将切換到磁盤檔案系統并解除安裝initrd。

    如果是嵌入式裝置,那麼最終的檔案系統就是initrd。

    initrd常用的的檔案格式是cpio,cpio格式記錄了檔案系統的結構和内容。

    cpio格式具體定義如圖1所示:

    cpio格式的檔案由段組成,最後一個段比較特殊,檔案名為”TRAILER!!!”。

    每個段都由檔案頭、檔案名和檔案體組成;檔案名和檔案體的長度由檔案頭中的name_len和body_len指定,并且檔案名和檔案體需要按指定位元組對齊,是以尾部包含padding。

    檔案頭共110個位元組,頭6個位元組固定為070701,剩下位元組的含義分别為:索引節點号、檔案模式、使用者id、組id、連結數、時間戳、檔案體長度、主裝置号、次裝置号、裝置号、檔案名長度、保留字段。

    其他詳細情況請參見init/initramfs.c檔案,這裡不再描述。

linux檔案系統初始化過程(3)---加載initrd(上)一、目的 二、cpio檔案格式 三、initrd檔案執行個體 四、解壓initrd檔案 五、總結

                                                   圖1

    為了更直覺的了解cpio格式的initrd檔案,下面看一個執行個體。

    在ubuntu環境中,boot目錄下存放着經過壓縮的cpio格式檔案initrd。

    将boot目錄下的initrd檔案拷貝到任意目錄下,重名為為initrd.gz,并且使用gunzip解壓。

    這樣我們就得到了一個cpio格式的initrd檔案,使用vi檢視檔案内容如圖2所示(由于檔案太大,隻展示了部分内容):

    簡單分析後顯示該檔案包含了script/nfs-top目錄、script/nfs-top/ORDER檔案、script/nfs-top/udev檔案、run目錄、标志cpio結束的TRAILER!!!檔案。

linux檔案系統初始化過程(3)---加載initrd(上)一、目的 二、cpio檔案格式 三、initrd檔案執行個體 四、解壓initrd檔案 五、總結

                                                          圖2

    initrd經過gunzip解壓後,可以使用cpio工具解壓cpio格式的檔案。指令如下:

linux檔案系統初始化過程(3)---加載initrd(上)一、目的 二、cpio檔案格式 三、initrd檔案執行個體 四、解壓initrd檔案 五、總結

root: cpio-idmv < initrd  

    解壓成功後,使用ls指令檢視initrd檔案内容如圖3所示:

    bin和sbin目錄下包含基本的可執行程式;conf和etc目錄下是配置檔案;lib目錄下是可執行程式使用的動态庫;scripts目錄下是腳本程式;init程式。initrd必須提供一個init程式,linux在加載完initrd後,會跳轉到init程式,由init程式負責後面的初始化工作。

                            圖3

    本文詳細介紹了cpio格式的initrd檔案,以及解壓後各個目錄的含義。initrd檔案系統提供了init程式,在linux初始化階段的後期會跳轉到init程式,由該程式負責加載驅動程式和挂載磁盤檔案系統以及其他的初始化工作。

繼續閱讀