1.什么是 Initramfs
在2.6版本的linux內核中,都包含一個壓縮過的cpio格式的打包文件。當內核啟動時,會從這個打包文件中導出文件到內核的rootfs文件系統,然后內核檢查rootfs中是否包含有init文件,如果有則執行它,作為PID為1的第一個進程。這個init進程負責啟動系統后續的工作,包括定位、掛載“真正的”根文件系統設備(如果有的話)。然后執行 /sbin/init程序完成系統的后續初始化工作。
2.Linux2.6 內核對 Initramfs 的處理流程
(1. boot loader 把內核以及 Initramfs 文件加載到內存的特定位置。
(2. 內核判斷Initramfs的文件格式,如果是cpio格式。
(3. 將Initramfs的內容釋放到rootfs中。
(4. 執行Initramfs中的sbin/init文件,執行到這一點,內核的工作全部結束,完全交給init文件處理。
3. cpio格式的Initramfs制作方法
假設當前目錄位於准備好的Initramfs文件系統的根目錄下
find . | cpio -o -Hnewc | gzip -9 > ../initrd.img.gz
解壓:
假設當前目錄就是要解壓后的目錄 gunzip | cpio -idmv < ../initrd.img
4. 掛載rootfs文件系統
rootfs是基於內存的文件系統,所有的操作都是在內存中完成,沒有實際的存儲設備,不需要設備驅動程序的參與。linux系統啟動階段使用rootfs文件系統,當磁盤驅動程序與磁盤文件系統成功加載后,linux系統會將系統根目錄從rootfs切換到磁盤文件系統。
所有的2.6版本linux內核都有一個特殊的文件系統rootfs,是內核啟動的初始根文件系統,initramfs的文件會復制到rootfs。如果把initramfs比作種子,那么rootfs就是它生長的土壤。大部分linux系統正常運行后都會安裝另外的文件系統,然后忽略rootfs。
rootfs是ramfs文件系統的一個特殊實例。ramfs是一種非常簡單的文件系統,是基於內存的文件系統。ramfs文件系統沒有容量大小的限制,它可以根據需要動態增加容量。
ramfs直接利用了內核的磁盤高速緩存機制。所有的文件的讀寫數據都會在內存中做高速緩存(cache),當系統再次使用文件數據時,可以直接從內存中讀寫,以提供系統的I/O性能。高速緩存中的寫入數據會在適當的時候回寫到對應的文件系統設備(如磁盤等)中,這時它的狀態就標識為clean,這樣系統在必要時可以釋放掉這些內存。ramfs沒有對應文件系統設備,所以它的數據永遠都不會回寫回去,也就不會標識為clean,因此系統也永遠不會釋放 ramfs所占用的內存。
因為ramfs直接使用了內核已有的磁盤高速緩存機制,所以它的實現代碼非常小。也由於這個原因,它可能不停的動態增長直到耗盡系統的全部內存。