為什麼需要 initramfs?

為什麼需要 initramfs?

我發現如果我選擇jffsorsd作為檔案系統(而不是initramfs),核心大小將非常小(1.4 MB,而initramfs3.4 MB)。這意味著initramfs需要相當大的空間。因此,如果可以的話,我會完全刪除它,從而得到非常小的內核,這就是我想要的。

我腦中浮現的基本問題是:為什麼我需要initramfs? Linux 核心無法在沒有任何初始檔案系統的情況下啟動嗎?

我的最終應用程式只會進行計算和通訊 - 根本不進行儲存。因此,沒有檔案系統的作業系統是有意義的——至少對於我的應用程式來說是這樣。

答案1

initramfs 的大小增加並不是由於 ramfs 驅動程式(它只有幾 kB,並且無論如何都需要其他東西),而是由於 initramfs 本身。 initramfs 包含組裝和掛載真實根檔案系統所需的程式。

/Initramfs 讓開機系統變得更加容易,並且在某些情況下(例如加密)是可能的。強烈建議將其保留在具有大量可熱插拔週邊設備的 PC 式硬體上。另一方面,在沒有任何 initramfs 的情況下啟動嵌入式裝置非常有意義,且核心只支援其建置的特定硬體配置。

核心當然需要啟動到檔案系統:必須有某種方式來載入您想要運行的任何應用程式。如果你不打算運行任何東西,那麼你最好保持機器斷電。

如果您不想使用 initramfs,只需告訴您的引導程式不要傳遞它即可。當然,也不要在核心建構的輸出中包含一個 - 如果有的話,這是如何發生的,這取決於體系結構和引導程式:例如,vmlinux並且bzImage不包含 initramfs (它們分別是原始核心和壓縮核心) ),但是uImage(對於 U-Boot)會同時打包核心和 initramfs(如果有的話)。

(從技術上講,如麥克塞夫請注意,總是有一個 initramfs — 但預設情況下,它是一個空的 134 位元組存檔。您所看到並想要擺脫的,是由您的建置流程所建立的「真實」非空 initramfs,其中包含用於掛載根檔案系統的工具。

請注意,initramfs 是創建沒有持久性資料的單一應用程式系統的合理方法:將所有應用程式放入 initramfs 中,啟動並保留它。這使得組織持久性儲存或啟動映像變得更加容易(您所需要的只是核心和 initramfs,它們可以捆綁在一起)。然而這種方法也有缺點:initramfs 中的所有資料都將永久儲存在 RAM 中,而且您無法輕鬆修改啟動映像中的文件,必須重建存檔。

答案2

線性FS:

initramfs 的唯一目的是掛載根檔案系統。 initramfs 是在普通根檔案系統上可以找到的完整目錄集。它被捆綁到一個 cpio 存檔中,並使用多種壓縮演算法之一進行壓縮。

在 LFS 環境中使用 initramfs 只有四個主要原因:從網路載入 rootfs、從 LVM 邏輯磁碟區載入、在需要密碼的情況下擁有加密的 rootfs、或為了方便將 rootfs 指定為標籤或 UUID。任何其他情況通常意味著核心配置不正確。

對於大多數發行版來說,核心模組是擁有 initramfs 的最大原因。在一般發行版中,存在許多未知因素,例如檔案系統類型和磁碟佈局。在某種程度上,這與 LFS 相反,LFS 的系統功能和佈局是已知的,並且通常會建立自訂核心。在這種情況下,很少需要 initramfs。

另一個來源www.kernel.org

除此之外,還有很多類似路由器的 Linux 系統不使用 initramfs。

答案3

您需要 initramfs 來進行更複雜的設置,例如網路啟動、lvm 或 raid,因為它們需要一些使用者模式實用程式來配置對 root fs 的存取。對於磁碟上的簡單常規分割區,只要將磁碟機內建到核心中,並透過裝置路徑而不是 UUID 指定 root 參數,那麼您就可以不需要 initramfs。當然,設備路徑可能會發生變化,具體取決於您連接的即插即用(即 USB)設備,甚至只是隨機的時序差異,這就是為什麼幾乎每個人都使用 uuid 和 initramfs 來提高可靠性。

答案4

如果您的根分割區位於使用 MBR 分割區表的磁碟上,並且您希望將持久性區塊裝置名稱作為root=核心的參數,則需要使用 initramfs。/dev/sdX不是持久性的,PARTUUID=是僅 GPT 的功能,LABEL=並且UUID=在啟動的早期階段對核心不可見。 initramfs 可以載入儲存和檔案系統驅動程序,LABEL=並且UUID=對核心可見。

相關內容