Boot

為什麼核心不能自己完成 initrd/initramfs 工作?

  • May 8, 2018

目前我正在學習 linux 啟動過程。這裡我注意到 initrd 將創建臨時根文件系統,其中包括核心所需的驅動程序(LVM、NFS 等)。之後核心將使用該驅動程序並掛載真正的根文件系統。

在這裡我的問題是為什麼核心本身不應該在其中包含必要的驅動程序以及為什麼它依賴於 initrd ?

另請參閱這些問題的答案:


  1. 為什麼核心本身不應該在其中包含必要的驅動程序

首先,要知道核心記憶體不是按需分頁的。那將是一個循環依賴。如果在記憶體不足時將磁碟驅動程序分頁到磁碟,則以後無法將其載入回來。

(並且在Linux核心內部,我們不會嘗試定義一些不涉及儲存路徑並且可以安全地被分頁的更高層。據稱這是可能的:Windows做到了。我不知道這更高層應該是。也許它是動態定義的。或者也許 Windows 不支持像 NFS 交換這樣的奇怪想法)。

相反,我們支持載入模組。如果我們在這台特定的電腦上不需要 NFS,我們就不必載入它。

在現代發行版中,這總共節省了大約 100 兆字節的 RAM。(查看 . 佔用的空間/lib/modules/$VERSION/。請注意,在現代發行版中,模組是壓縮的,例如.xz文件)。

  1. 為什麼它依賴於 initrd

雖然核心模組是使用 initrd 的更明顯原因,但還有第二個方面。

它允許使用者空間建構任意複雜的儲存堆棧來訪問根文件系統。例如,使用 DHCP 獲取 IP 地址以支持 NFS,或提示輸入磁碟加密密碼。

再一次,核心嘗試不過度膨脹,例如使用使用者界面程式碼。

記憶體使用只是原因之一。核心/使用者空間劃分有很多用途。例如,核心可以是一個項目,專門用於核心事物。使用者空間可以是任何東西;它可能是一個“普通”的 Linux 發行版,也可能是一個完全獨立的項目,如 Android 作業系統。

這與其他作業系統不同,例如 BSD 將核心 + 核心使用者空間一起維護。BSD 能夠通過核心和使用者空間的單一標誌日轉換來處理 2038 問題就說明了這一點。

引用自:https://unix.stackexchange.com/questions/442473