萬盛學電腦網

 萬盛學電腦網 >> Linux教程 >> initrd與initramfs區別

initrd與initramfs區別

  initrd與initramfs

  Linux 的 initrd 技術是一個非常普遍使用的機制,linux2.6 內核的 initrd 的文件格式由原來的文件系統鏡像文件轉變成了 cpio 格式,變化不僅反映在文件格式上, linux 內核對這兩種格式的 initrd 的處理有著截然的不同。

  initrd:

  ram disk是一個基於ram的塊設備,因此它占據了一塊固定的內存,而且事先要使用特定的工具比如mke2fs格式化,還需要一個文件系統驅動來讀寫其上的文件。

  如果這個disk上的空間沒有用完,這些未用的內存就浪費掉了,並且這個disk的空間固定導致容量有限,要想裝入更多的文件就需要重新格式化。

  由於Linux的塊設備緩沖特性, ram disk上的數據被拷貝到page cache(對於文件數據)和dentry cache(對於目錄項), 這個也導致內存浪費.

  initramfs:

  最初的想法是Linus提出的: 把cache當作文件系統裝載。

  他在一個叫ramfs的cache實現上加了一層很薄的封裝,其他內核開發人員編寫了一個改進版tmpfs,這個文件系統上的數據可以寫出到交換分區,而且可以設定一個tmpfs裝載點的最大尺寸以免耗盡內存。initramfs就是tmpfs的一個應用。

  優點:

  (1)tmpfs隨著其中數據的增減自動增減容量.

  (2)在tmpfs和page cache/dentry cache之間沒有重復數據.

  (3)tmpfs重復利用了Linux caching的代碼, 因此幾乎沒有增加內核尺寸, 而caching的代碼已經經過良好測試, 所以tmpfs的代碼質量也有保證.

  (4)不需要額外的文件系統驅動.

  另外, initrd機制被設計為舊的"root="機制的前端,而非其替代物,它假設真正的根設備是一個塊設備, 而且也假設了自己不是真正的根設備,這樣不便將NFS等作為根文件系統。最後/linuxrc不是以PID=1執行的, 因為1這個進程ID是給/sbin/init保留的。 initrd機制找到真正的根設備後將其設備號寫入/proc/sys/kernel/real-root-dev, 然後控制轉移到內核由其裝載根文件系統並啟動/sbin/init。

  initramfs則去掉了上述假設, 而且/init以PID=1執行, 由init裝載根文件系統並用exec轉到真正的/sbin/init, 這樣也導致一個更為干淨漂亮的設計。

copyright © 萬盛學電腦網 all rights reserved