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). 

更多連結