和菜鳥一起學linux之initramfs方式啟動

東月之神發表於2013-08-18

關於initramfs

        initramfs在編譯核心的同時被編譯並與核心連線成一個檔案,它被連結到地址__initramfs_start處,與核心同時被載入到ram中。initramfs被解析處理後原始的cpio包(壓縮或非壓縮)所佔的空間(&__initramfs_start- &__initramfs_end)是作為系統的一部分直接保留在系統中,不會被釋放掉。

由於initramfs使用cpio包格式,所以很容易將一個單一的檔案、目錄、node編譯連結到系統中去,這樣很簡單的系統中使用起來很方便,不需要另外掛接檔案系統。

但是因為cpio包實際是檔案、目錄、節點的描述語言包,為了描述一個檔案、目錄、節點,要增加很多額外的描述文字開銷,特別是對於目錄和節點,本身很小額外新增的描述文字卻很多,這樣使得cpio包比相應的image檔案大很多。

 

關於核心配置和編譯

核心配置:make menuconfig進入配置

進入General setup  --->

選擇核心壓縮為LZMA壓縮

Kernelcompression mode (LZMA)  --->

然後選擇

[*]Initial RAM filesystem and RAM disk (initramfs/initrd) support
(/rootfs_dir) Initramfs source file(s)

其中rootfs_dir就是我們需要壓縮的rootfs的路徑。

 

1、  修改壓縮包在記憶體中的存放位置:(mips晶片)

arch/mips/boot/compressed/calc_vmlinuz_load_addr.c中的

                     vmlinuz_load_addr =0x81a00000;(此地址可根據需要,自己調節)

 

2、修改rootfs的busybox連結, 在rootfs的目錄下執行:

      ln –sbin/busybox init

3、修改CMDLINE:

“console=ttySAC0,115200 init/init rw kgdbttySAC0,115200kgdboc=ttySAC0 mem=32M”

4、最後make編譯

make vmlinuz.bin

之後在當前目錄下就會生成vmlinuz.bin的壓縮包。

5、可能編譯會有問題,此時一般是由於rootfs是root許可權,使用者組也是root,需要修改使用者組,之後便可以編譯通過。

相關文章