Linux 初始 RAM 磁碟(initrd)概述

2021-06-22 19:15:40 字數 2062 閱讀 4710

現在我們已經了解了如何構建並使用定製的初始 ram 磁碟,本節將探索核心是如何識別 initrd 並將其作為根檔案系統進行掛載的。我們將介紹啟動鏈中的幾個主要函式,並解釋一下到底在進行什麼操作。

引導引導程式,例如 grub,定義了要載入的核心,並將這個核心映像以及相關的 initrd 拷貝到記憶體中。我們可以在 linux 核心源**目錄中的 ./init 子目錄中找到很多這種功能。

在核心和 initrd 映像被解壓並拷貝到記憶體中之後,核心就會被呼叫了。它會執行不同的初始化操作,最終您會發現自己到了init/main.c:init()(subdir/file:function)函式中。這個函式執行了大量的子系統初始化操作。此處會執行乙個對init/do_mounts.c:prepare_namespace()的呼叫,這個函式用來準備命名空間(掛載 dev 檔案系統、raid 或 md、裝置以及最後的 initrd)。載入 initrd 是通過呼叫init/do_mounts_initrd.c:initrd_load()實現的。

initrd_load()函式呼叫了init/do_mounts_rd.c:rd_load_image(),它通過呼叫init/do_mounts_rd.c:identify_ramdisk_image()來確定要載入哪個 ram 磁碟。這個函式會檢查映像檔案的 magic 號來確定它是 minux、etc2、romfs、cramfs 或 gzip 格式。在返回到initrd_load_image之前,它還會呼叫init/do_mounts_rd:crd_load()。這個函式負責為 ram 磁碟分配空間,並計算迴圈冗餘校驗碼(crc),然後對 ram 磁碟映像進行解壓,並將其載入到記憶體中。現在,我們在乙個適合掛載的塊裝置中就有了這個 initrd 映像。

現在使用乙個init/do_mounts.c:mount_root()呼叫將這個塊裝置掛載到根檔案系統上。它會建立根裝置,並呼叫init/do_mounts.c:mount_block_root()。在這裡呼叫init/do_mounts.c:do_mount_root(),後者又會呼叫fs/namespace.c:sys_mount()來真正掛載根檔案系統,然後chdir到這個檔案系統中。這就是我們在清單 6 中所看到的熟悉訊息vfs: mounted root (ext2 file system).的地方。

最後,返回到init函式中,並呼叫init/main.c:run_init_process。這會導致呼叫execve來啟動 init 程序(在本例中是/linuxrc)。linuxrc 可以是乙個可執行程式,也可以是乙個指令碼(條件是它有指令碼直譯器可用)。

這些函式的呼叫層次結構如清單 7 所示。儘管此處並沒有列出拷貝和掛載初始 ram 磁碟所涉及的所有函式,但是這足以為我們提供乙個整體流程的粗略框架。

清單 7. initrd 載入和掛載過程中所使用的主要函式的層次結構

init/main.c:init

init/do_mounts.c:prepare_namespace

init/do_mounts_initrd.c:initrd_load

init/do_mounts_rd.c:rd_load_image

init/do_mounts_rd.c:identify_ramdisk_image

init/do_mounts_rd.c:crd_load

lib/inflate.c:gunzip

init/do_mounts.c:mount_root

init/do_mounts.c:mount_block_root

init/do_mounts.c:do_mount_root

fs/namespace.c:sys_mount

init/main.c:run_init_process

execve

Linux 初始 RAM磁碟(initrd)概述

loop裝置 loop裝置是一種偽裝置,是使用檔案來模擬塊裝置的一種技術 檔案模擬成塊裝置後,就像乙個磁碟或光碟一樣使用。在使用之前,乙個 loop 裝置必須要和乙個檔案進行連線,這種結合方式給使用者提供了乙個替代塊特殊檔案的介面。因此,如果這個檔案包含有乙個完整的檔案系統,那麼這個檔案就可以像乙個...

提公升Xcode編譯效能,RAM磁碟編譯

deriveddata xcode會在檔案系統中集中的快取臨時資訊。每次對xcode ios專案進行clean build或者在ios虛擬機器上launch,xcode都會在derivedata資料夾中進行讀寫操作。換句話說,就是將derived data的讀寫從硬碟移動到記憶體中。deriveda...

提公升Xcode編譯效能,RAM磁碟編譯

deriveddata xcode會在檔案系統中集中的快取臨時資訊。每次對xcode ios專案進行clean build或者在ios虛擬機器上launch,xcode都會在derivedata資料夾中進行讀寫操作。換句話說,就是將derived data的讀寫從硬碟移動到記憶體中。deriveda...