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文件