2019年10月11日 星期五

Early User Space

Linux 開機最後需要掛載根目錄 (rootfs) 後執行 /sbin/init。Early User Space 是在掛載真正 rootfs 前掛載的暫時 rootfs,執行裡面的程式後才掛載真正的 rootfs。

好處:
  • rootfs 所在的儲存裝置較複雜時,例如 SCSI 裝置、software RAID volume、USB storage、LVM、NFS、或者有加密等,需要特別的準備工作才能使用,不好在 kernel 實作。
  • Early user space 可偵測及載入需要的 kernel 模組,可有更多 rootfs 選擇。
  • 使用外部可載入的 kernel 模組,可縮小 Linux kernel 本身體積,特別是在記憶體有限的電腦。
  • Linux 發行版可提供一個通用的 Linux kernel image,但不同的 Early User Space image 來支援各式各樣的硬體能開機。
  • 支援 hibernation。suspends 關機前備份記憶體內容,下次開機載回到記憶體。
  • 在 Embedded Linux,Early User Space 常直接作為真正的 rootfs。
有 initrd 和 initramfs 兩種方式。

initrd (initial RAM disk) 字面上的意思是「用 RAM disk 作為開機」,將一塊記憶體模擬為 block 裝置的 RAM disk 掛載為暫時的 rootfs。initrd 大致的處理流程如下:
  • [boot loader] 將 kernel 與 initrd 這兩個 image 載入到記憶體。
  • [boot loader -> kernel] 執行權交給 Linux kernel
    • 範例開機參數:image = /bzImage initrd = /boot/initrd.gz append = "root=/dev/ram0 rw"
  • [kernel] 進行一系列初始化動作,將 initrd 所在的記憶體解壓縮到 /dev/ram0 成為 RAM disk,掛載為暫時性的 rootfs。釋出 initrd 所在的記憶體。
  • [kernel -> user-space] kernel 準備執行 /dev/ram0 上的 /linuxrc 程式,切換到 user space。
  • [user space] /linuxrc 與相關的程式執行,pivot_root 掛載真正的 rootfs。
  • [user-space -> kernel] /linuxrc 執行完畢,執行權轉回 kernel。
  • [kernel] 執行新 rootfs 的 /sbin/init。
  • [user space] 執行各式系統與應用程式 
RAM disk 本身是 block 裝置,必須綁定一個檔案系統,通常使用 ext2 或 cramfs,需要 kernel 內建支援。

initrd 問題:
  • initrd 本身是 block device,必須綁定一個檔案系統。
  • initrd block device 建立時要指定空間大小,不好維護。
  • initrd 時的檔案操作實際上是不斷將 /dev/initrd (對應於某段記憶體) 對應到可存取檔案系統的記憶位址,做了不必要的資源消耗
  • Linux 在設計上盡可能 cache block device 讀寫中的檔案或目錄,會自 ramdisk 中複製資料到 page cache 與 dentry cache,徒增資源使用的浪費。
Linus Torvalds 將這些 cache 掛載為檔案系統的想法實做了 ramfs,其實就只是 cache 機制的延伸。隨後在其他開發者的改進下成為 tmpfs,支援寫入 swap 空間與限制記憶體使用量等。而 initramfs 就是建構於 tmpfs 的基礎上。以下是 initrd 和 initramfs 的概念性比較:

initrd initramfs
映像檔 壓縮過的檔案系統 (如 ext2 + gzip) 封裝過的檔案 (cpio + gzip)
實做途徑 block device (RAM disk) tmpfs
首先執行的程式 /linuxrc /init
掛載 rootfs 方式 先將 rootfs 掛載在某個目錄,再 pivot_root 切換為 rootfs。 使用 switch_root
參考
  1. https://en.wikipedia.org/wiki/Initial_ramdisk
  2. http://blog.linux.org.tw/~jserv/archives/001954.html
  3. cpio-initrd 
  4. http://riverhippo.blogspot.tw/2010/04/linux-26-initramfs.html

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...