轉自:http://blog.chinaunix.net/uid-29616823-id-4405454.html
initramfs概述
initramfs與initrd類似,也是初始化好了且存在於ram中的,可以壓縮也可以不壓縮。但是目前initramfs只支持cpio包格式,它會被populate_rootfs->unpack_to_rootfs(&__initramfs_start, &__initramfs_end - &__initramfs_start, 0)函數(解壓縮、)解析、安裝。
initramfs與initrd區別
(1) Linux內核只認cpio格式的initramfs文件包(因為unpack_to_rootfs只能解析cpio格式文件),非cpio格式的 initramfs文件包將被系統拋棄,而initrd可以是cpio包也可以是傳統的鏡像(image)文件,實際使用中initrd都是傳統鏡像文件。
(2) initramfs在編譯內核的同時被編譯並與內核連接成一個文件,它被鏈接到地址__initramfs_start處,與內核同時被 bootloader加載到ram中,而initrd是另外單獨編譯生成的,是一個獨立的文件,它由bootloader單獨加載到ram中內核空間外的地址,比如加載的地址為addr(是物理地址而非虛擬地址),大小為8MB,那么只要在命令行加入"initrd=addr,8M"命令,系統就可以找到 initrd(當然通過適當修改Linux的目錄結構,makefile文件和相關代碼,以上兩種情況都是可以相通的)。
(3) initramfs被解析處理后原始的cpio包(壓縮或非壓縮)所占的空間(&__initramfs_start - &__initramfs_end)是作為系統的一部分直接保留在系統中,不會被釋放掉,而對於initrd鏡像文件,如果沒有在命令行中設置"keepinitd"命令,那么initrd鏡像文件被處理后其原始文件所占的空間(initrd_end - initrd_start)將被釋放掉。
(4) initramfs可以獨立ram disk單獨存在,而要支持initrd必須要先支持ram disk,即要配置CONFIG_BLK_DEV_INITRD選項 -- 支持initrd,必須先要配置CONFIG_BLK_DEV_RAM -- 支持ram disk ,因為initrd image實際就是初始化好了的ramdisk鏡像文件,最后都要解析、寫入到ram disk設備/dev/ram或/dev/ram0中。
注: 使用initramfs,命令行參數將不需要"initrd="和"root="命令? YES
initramfs利弊:
------------------------------------------------------
由於initramfs使用cpio包格式,所以很容易將一個單一的文件、目錄、node編譯鏈接到系統中去,這樣很簡單的系統中使用起來很方便,不需要另外掛接文件系統。
但是因為cpio包實際是文件、目錄、節點的描述語言包,為了描述一個文件、目錄、節點,要增加很多額外的描述文字開銷,特別是對於目錄和節點,本身很小額外添加的描述文字卻很多,這樣使得cpio包比相應的image文件大很多。
使用initramfs的內核配置(使用initramfs做根文件系統):
------------------------------------------------------
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
(/rootfs_dir) Initramfs source file(s) //輸入根文件系統的所在目錄
使用initramfs的內核啟動參數
不需要"initrd="和"root="參數,但是必須在initramfs中創建/init文件或者修改內核啟動最后代碼(init文件是軟連接,指向什么? init -> bin/busybox,否則內核啟動將會失敗)
鏈接入內核的initramfs文件在linux-2.6.24/usr/initramfs_data.cpio.gz
使用initrd的內核配置(使用網口將根文件系統下載到RAM -- tftp addr ramdisk.gz):
------------------------------------------------------
1. 配置initrd
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
() Initramfs source file(s) //清空根文件系統的目錄配置
2. 配置ramdisk
Device Drivers --->
Block devices --->
<*> RAM disk support
(16) Default number of RAM disks // 內核在/dev/目錄下生成16個ram設備節點
(4096) Default RAM disk size (kbytes)
(1024) Default RAM disk block size (bytes)
使用 initrd的內 核啟動參數:
initrd=addr,0x400000 root=/dev/ram rw
注:
(1) addr是根文件系統的下載地址;
(2) 0x400000是根文件系統的大小,該大小需要和內核配置的ramdisk size 4096 kbytes相一致;
(3) /dev/ram是ramdisk的設備節點,rw表示根文件系統可讀、可寫;
根文件系統存放在FLASH分區:
------------------------------------------------------
1. 內核啟動參數不需要"initrd="(也可以寫成"noinitrd");
root=/dev/mtdblock2 (/dev/mtdblock2 -- 根文件系統所燒寫的FLASH分區)
2. 內核配置不需要ram disk;也不需要配置initramfs或者initrd
[ ] Initial RAM filesystem and RAM disk (initramfs/initrd) support
注: boot的FLASH分區要和kernel的FLASH分區匹配(而非一致),需要進一步解釋。
TCP reno registered 停在這里
---------------------------------------------
rootfs太大,檢測發現rootfs下有垃圾(里面有包含了一份rootfs)
下面這個大小啟動成功了
---------------------------------------------
root@zengxiaolong:/home/zengxiaolong/soft/s3c2410/rootfs# du -h
4.0K ./dev
4.0K ./tmp
8.0K ./etc/init.d
40K ./etc
4.0K ./usr
4.0K ./var
4.0K ./sbin
2.1M ./bin
4.0K ./sys
116K ./lib/modules
2.8M ./lib
4.0K ./proc
4.9M .
initrd and initramfs
http://blog.sina.com.cn/s/blog_622013d90100fr04.html
---------------------------------------------
#
# General setup
#
...
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="<path_to>/target_fs>"
...
#
# UBI - Unsorted block images
#
...
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=1
CONFIG_BLK_DEV_RAM_SIZE=8192
CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
Installation initramfs
No special installation like with initrd is necessary. The initramfs is already in the kernel. If you start the kernel, the initramfs is already there. Therefore, there is no root=/dev/ram0 rw initrd=0x87000000,8M bootargs option necessary. Remove this if you still have it!
http://blog.chinaunix.net/uid-488742-id-2113871.html