好處:
- 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 (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] 執行各式系統與應用程式
initrd 問題:
- initrd 本身是 block device,必須綁定一個檔案系統。
- initrd block device 建立時要指定空間大小,不好維護。
- initrd 時的檔案操作實際上是不斷將 /dev/initrd (對應於某段記憶體) 對應到可存取檔案系統的記憶位址,做了不必要的資源消耗
- Linux 在設計上盡可能 cache block device 讀寫中的檔案或目錄,會自 ramdisk 中複製資料到 page cache 與 dentry cache,徒增資源使用的浪費。
| initrd | initramfs | |
|---|---|---|
| 映像檔 | 壓縮過的檔案系統 (如 ext2 + gzip) | 封裝過的檔案 (cpio + gzip) |
| 實做途徑 | block device (RAM disk) | tmpfs |
| 首先執行的程式 | /linuxrc | /init |
| 掛載 rootfs 方式 | 先將 rootfs 掛載在某個目錄,再 pivot_root 切換為 rootfs。 | 使用 switch_root |
- https://en.wikipedia.org/wiki/Initial_ramdisk
- http://blog.linux.org.tw/~jserv/archives/001954.html
- cpio-initrd
- http://riverhippo.blogspot.tw/2010/04/linux-26-initramfs.html
沒有留言:
張貼留言