為什麼 initramfs 以只讀方式掛載根文件系統
ro
根文件系統安裝在 initramfs(和 initrd 中)的原因是什麼。例如,Gentoo initramfs 指南安裝根文件系統:
mount -o ro /dev/sda1 /mnt/root
為什麼不是以下?
mount -o rw /dev/sda1 /mnt/root
我可以看到可能有一個很好的理由(並且可能涉及
switchroot
),但是它似乎沒有在任何地方記錄。
初始ramdisk (initrd) 通常是根文件系統的精簡版本,僅包含掛載實際根文件系統並將引導移交給它所需的內容。
initrd 的存在是因為在現代系統中,引導載入程序無法變得足夠智能以可靠地找到根文件系統。像引導載入程序這樣的小程序有太多的可能性要覆蓋。考慮 NFS 根、非標準 RAID 卡等。引導載入程序必須僅使用 BIOS 以及可以塞入引導扇區的任何程式碼來完成其工作。
initrd 儲存在引導載入程序可以找到的某個地方,並且它足夠小,以至於它佔用的額外空間通常不會打擾任何人。(在小型嵌入式系統中,通常沒有“真正的”根,只有 initrd。)
initrd 很寶貴:它的內容必須在任何情況下都被保留,因為如果 initrd 中斷,系統將無法啟動。其設計人員為確保這一點而做出的一項設計選擇是使引導載入程序以只讀方式載入 initrd。還有其他一些原則也可以實現這一點,例如在沒有“真正”根的小型系統的情況下,您仍然可以單獨掛載
/tmp
,/var/cache
例如儲存東西。很少更改 initrd,然後應該非常小心地進行。回到存在真正根文件系統的正常情況*,*它最初是只讀安裝的,因為 initrd 是。出於同樣的原因,它會盡可能長時間地保持只讀狀態。任何確實需要完成的對真實根的寫入都將推遲到系統啟動之前,根據偏好,或者至少直到無法滿足該偏好時的引導過程後期。
在這個只讀階段發生的最重要的事情是檢查根文件系統以查看它是否被乾淨地解除安裝。那是引導載入程序當然可以做的事情,而不是將其留給 initrd,但是如果根文件系統沒有完全解除安裝會發生什麼?然後它必須打電話
fsck
檢查並可能修復它。那麼,如果它負責這一步而不是等到移交給“真正的”根,那麼它會從哪裡initrd
得到呢?fsck
您可以說在建構它時需要復製fsck
到initrd
其中,但現在它更大了。最重要的是,你會複製哪個*?*fsck
Linux 系統經常使用十幾種不同的文件系統。您是否只複製當時真正根所需的那個?initrd
被建造?initrd
您是否通過將所有可用程序複製到其中來擴大大小fsck.foo
,以防根文件系統稍後被遷移到其他文件系統類型,並且有人忘記重建 initrd?Linux 引導系統架構師明智地選擇不給 initrd 帶來這些問題的負擔。他們將真正根文件系統的檢查委託給真正的根文件系統,因為它比 initrd 處於更好的位置。
一旦引導過程進行到足夠安全的程度,initrd 就會從真正的根目錄下換出
pivot_root(8)
,並以讀寫模式重新掛載文件系統。