Linux2.6 核心的 Initrd 機制解析(1)(轉貼好文)
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux2.6 核心的 Initrd 機制解析(4)(轉貼好文)Linux
- Linux核心的同步機制(1)(轉)Linux
- ETCD核心機制解析
- 解析Java的多執行緒機制(1)(轉)Java執行緒
- initrd的功能(轉載)
- 轉貼:Oracle的鎖機制歸納總結Oracle
- 轉:Oracle SCN機制解析Oracle
- 巧用Linux2.6核心新功能配置檔案ACL(轉)Linux
- Linux核心的同步機制(2)(轉)Linux
- 核心管理概述(轉貼)
- 轉載Oracle SCN機制解析Oracle
- Dubbo的微核心機制
- 進擊JavaScript核心 --- (2)函式和預解析機制JavaScript函式
- Apache Hudi核心之檔案標記機制深入解析Apache
- 解析Java的多執行緒機制(2)(轉)Java執行緒
- linux核心IDR機制詳解【轉】Linux
- iOS 訊息轉發機制Demo解析iOS
- Java核心知識1:泛型機制詳解Java泛型
- 響應式流的核心機制——背壓機制
- iOS核心動畫解析1iOS動畫
- Java核心反射機制Java反射
- 核心同步機制 RCU
- Handler機制解析
- Linux2.6對新型CPU的支援(2)(轉)Linux
- 深度解析Spring AI:請求與響應機制的核心邏輯SpringAI
- js的Event Loop機制解析JSOOP
- Windows記憶體機制解析(二)原始碼 (轉)Windows記憶體原始碼
- 概述javascript部分核心機制JavaScript
- 概述nodejs核心機制NodeJS
- Linux 核心同步機制Linux
- Java入門-核心機制Java
- 淺談 MFC 的子類化機制和該機制的一個應用(1) (轉)
- SPDK QOS機制解析
- Oracle SCN機制解析Oracle
- Java高階-解析Java中的多執行緒機制(轉)Java執行緒
- C++的核心特性:繼承機制C++繼承
- xenomai核心解析之訊號signal(二)---xenomai訊號處理機制AI
- Oracle SCN機制解析(zt)Oracle