本文主要講述linux3.10文件系統初始化過程的第二階段:加載initrd。linux
initrd是一個臨時文件系統,由bootload負責加載到內存中,裏面包含了基本的可執行程序和驅動程序。在linux初始化的初級階段,它提供了一個基本的運行環境。當成功加載磁盤文件系統後,系統將切換到磁盤文件系統並卸載initrd。ubuntu
若是是嵌入式設備,那麼最終的文件系統就是initrd。工具
initrd經常使用的的文件格式是cpio,cpio格式記錄了文件系統的結構和內容。spa
cpio格式具體定義如圖1所示:.net
cpio格式的文件由段組成,最後一個段比較特殊,文件名爲」TRAILER!!!」。code
每一個段都由文件頭、文件名和文件體組成;文件名和文件體的長度由文件頭中的name_len和body_len指定,而且文件名和文件體須要按指定字節對齊,因此尾部包含padding。blog
文件頭共110個字節,頭6個字節固定爲070701,剩下字節的含義分別爲:索引節點號、文件模式、用戶id、組id、連接數、時間戳、文件體長度、主設備號、次設備號、設備號、文件名長度、保留字段。索引
其餘詳細狀況請參見init/initramfs.c文件,這裏再也不描述。ip
圖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!!!文件。
圖2
initrd通過gunzip解壓後,可使用cpio工具解壓cpio格式的文件。命令以下:
解壓成功後,使用ls命令查看initrd文件內容如圖3所示:
bin和sbin目錄下包含基本的可執行程序;conf和etc目錄下是配置文件;lib目錄下是可執行程序使用的動態庫;scripts目錄下是腳本程序;init程序。initrd必須提供一個init程序,linux在加載完initrd後,會跳轉到init程序,由init程序負責後面的初始化工做。
圖3
本文詳細介紹了cpio格式的initrd文件,以及解壓後各個目錄的含義。initrd文件系統提供了init程序,在linux初始化階段的後期會跳轉到init程序,由該程序負責加載驅動程序和掛載磁盤文件系統以及其餘的初始化工做。