initrd

Linux作業系統開機早期時載入的臨時根檔案系統

Initrd ramdisk或者initrd是指在啟動階段被Linux內核調用的臨時文件系統,用於根目錄掛載之前的準備工作。[1]

基本原理

編輯

同其他Unix系統,Linux首先要將內核載入到內存。initrd通常被壓縮成gzip類型,開機時由bootloader(如LILOGRUB)來告知核心initrd的位置,使其被核心存取,掛載成一個loop型態的檔案。在2.6版本內核之後出現了initramfs,它的功能類似initrd,但是它基於CPIO格式,無須掛載就可以展開成一個文件系統。

initramfs 與 initrd

編輯

initramfs是initrd的替代品。initrd是一個被加載的塊設備,內部有ext2一類文件系統的存在,於是由於Linux內核的緩存機制,其中的內容還會被緩存到內存上,造成一定的內存空間浪費。而initramfs本身就是一個tmpfsRAM disk,擁有最小化的設計,繞過了緩存機制,也消除了多餘的內存占用。[2]

initramfs的生成方式也遠比initrd簡單。對於initramfs,只需 geninitramfs() { cd "$1"; find . -depth| cpio -o -H newc | ${3-cat}> "$2"; } 就可以利用cpio生成這樣一個文件,同時使用一些程序進行壓縮(通過額外的管道實現,其中使用cat僅用於無壓縮時轉發輸出,可省去)。對於initrd,則涉及生成一定大小的空文件,然後創建文件系統,掛載並添加文件等等諸多步驟。

實現

編輯

Linux內核 與 initrd/initramfs 必須儲存在 bootloader 可以存取的位置,通常是在:

  • root 檔案系統內
  • 一個小的ext4FAT檔案系統的分割區(通常掛載到 /boot)
  • TFTP server內

bootloader 會將內核與 initrd 載入到記憶體中並將 initrd 的位址傳給內核。initrd會被掛載當成 initial root file system。

現在的 Linux 發行版會建立客製化只包含必要元件的 initrd 映像檔,例如只包含 IDESCSISATASAS 以及檔案系統核心模組。

參考

編輯
  1. ^ Almesberger, Werner, Booting linux: the history and the future, Proceedings of the Ottawa Linux Symposium, 2000 [2012-12-26], (原始內容存檔於2008-07-24) 
  2. ^ The difference between initrd and initramfs?. Stack Overflow. [2014-04-24]. (原始內容存檔於2021-01-26). 

更多鏈接

編輯