概述
最近工作中需要用到initramfs。initramfs是一中ram fs,使用它可以使linux系統分階段啟動。使用initramfs主要有兩種方式:一種是將最小檔案系統直接編譯進核心鏡像中;另一種方式是製作ramdisk,然後將ramdisk載入到記憶體中,並指定給核心。無論是哪種方式,都需要核心中驅動的支援,所以要使用initramfs需要在編譯核心時開啟對initramfs的支援。
配置菜單如下:
initramfs的大小是有限制的,在配置ram block驅動是需要制定所需要的大小,配置如下:
圖中使用的是16MB,可以根據需要配置大小。 一、將檔案系統編譯進核心中
最簡單的方法就是將最小根檔案系統編譯進核心鏡像中。那樣只需要在編譯之前配置核心時制定最小根檔案系統的位置就行了,配置initramfs source file就可以了,配置方法如下:
可以根據自己的實際情況修改Initramfs source file的路徑,只需要選中Initramfs source file(s)項斷行符號,然後輸入根檔案系統路徑就好:
配置完成後編譯,編譯出來核心的image檔案會比較大,因為這裡麵包含了最小檔案系統。
啟動帶有initramfs的核心鏡像就和啟動普通的核心時一樣的,不過檔案系統在記憶體中。 二、使用ramdisk
使用ramdisk作為Initramfs比較靈活一些,不需要每次都去編譯核心,使用一些命令就可以製作ramdisk。ramdisk也是需要核心的支援,前面已經說過了。為了減小ramdisk佔用的記憶體空間,有時候需要對ramdisk進行壓縮,核心使用壓縮的ramdisk時就需要對其進行解壓縮,我們可以配置核心,使核心支援一些壓縮格式:
圖中可以看到,我們配置核心支援的時gzip壓縮的ramdisk,除此之外核心還支援bzip2,LZMA,XZ和LZO等壓縮格式的ramdisk。
下面介紹製作ramdisk的步驟: 1、建立一個16M的空檔案,我們核心配置的ram block裝置的大小為16MB:
#dd if=/dev/zero of=ramdisk bs=1M count=16 2、格式化這個檔案
#mke2fs -F -m0 ramdisk 3、掛載這個檔案(通過loop裝置)
#mount -t ext2 -o loop ramdisk /mnt 4、將最小檔案系統拷貝至ramdisk中
#cp ~/minirootfs/* /mnt -rf 5、umount這個ramdisk
#umount /mnt 6、壓縮ramdisk
#gzip -9 ramdisk
第6步完成後將產生一個ramdisk.gz檔案,這個就是製作好的壓縮的ramdisk檔案。
上面步驟進行到第5步,ramdisk應該已經可以使用了,對其進行壓縮就是為了減小其佔用的空間。
使用ramdisk作為initramfs,需要對核心的bootargs進行修改,需要添加一些args選項。
initrd=[address | path]
在ARM平台中常用initrd=0xXXXXX的方式,其中initrd參數指定的地址就是ramdisk載入到記憶體的地址。
noinitrd
該選項讓核心不要將initrd轉換至ram disk中,系統啟動後可以通過/dev/initrd訪問initrd中的資料。這種方式initrd中可以是任何資料,並非一定要是一個檔案系統鏡像。
root=/dev/ram0
initrd被掛載為root。從initrd中啟動。 ramdisk製作的詳細步驟可以參考核心文檔kernel/Documentation/initrd.txt