initrd
Initrd ramdisk或者initrd是指在啟動階段被Linux內核呼叫的臨時檔案系統,用於根目錄被掛載之前的準備工作。[1]
基本原理
同其他Unix系統,Linux首先要將內核載入到主記憶體。initrd通常被壓縮成gzip類型,開機時由bootloader(如LILO、GRUB)來告知核心initrd的位置,使其被核心存取,掛載成一個loop型態的檔案。在2.6版本內核之後出現了initramfs,它的功能類似initrd,但是它基於CPIO格式,無須掛載就可以展開成一個檔案系統。
initramfs 與 initrd
initramfs是initrd的替代品。initrd是一個被載入的塊裝置,內部有ext2一類檔案系統的存在,於是由於Linux內核的快取機制,其中的內容還會被快取到主記憶體上,造成一定的主記憶體空間浪費。而initramfs本身就是一個tmpfs的RAM disk,擁有最小化的設計,繞過了快取機制,也消除了多餘的主記憶體佔用。[2]
initramfs的生成方式也遠比initrd簡單。對於initramfs,只需 geninitramfs() { cd "$1"; find . -depth| cpio -o -H newc | ${3-cat}> "$2"; }
就可以利用cpio生成這樣一個檔案,同時使用一些程式進行壓縮(通過額外的管道實現,其中使用cat僅用於無壓縮時轉發輸出,可省去)。對於initrd,則涉及生成一定大小的空檔案,然後建立檔案系統,掛載並添加檔案等等諸多步驟。
實現
Linux內核 與 initrd/initramfs 必須儲存在 bootloader 可以存取的位置,通常是在:
bootloader 會將內核與 initrd 載入到記憶體中並將 initrd 的地址傳給內核。initrd會被掛載當成 initial root file system。
現在的 Linux 發行版會建立客製化只包含必要元件的 initrd 映像檔,例如只包含 IDE、SCSI、SATA、SAS 以及檔案系統核心模組。
參考
- Landley, Rob, Introducing initramfs, a new model for initial RAM disks, linuxdevices.com, 15 March 2005 [2007-08-22], (原始內容存檔於2009-03-01) initramfs 簡介,一個新的 initial RAM disks 的模型, [2018-12-17], (原始內容存檔於2019-09-07)
- ^ Almesberger, Werner, Booting linux: the history and the future, Proceedings of the Ottawa Linux Symposium, 2000 [2012-12-26], (原始內容存檔於2008-07-24)
- ^ The difference between initrd and initramfs?. Stack Overflow. [2014-04-24]. (原始內容存檔於2021-01-26).
更多連結
- A detailed comparison (頁面存檔備份,存於互聯網檔案館) of initrd-generating toolkits
- Kernel documentation (頁面存檔備份,存於互聯網檔案館) on Early userspace support
- 分析linux initrd檔案