initramfs 深入理解, 以及initramfs与initrd的区别

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!










Linux Ramdisk mini-HOWTO


Linux initialRAM disk (initrd) overview




使用gen_initramfs_list.sh脚本创建cpio格式的initramfs(rootfs)文件
-----------------------------------------------------------------
# cd /home/zengxiaolong/soft/s3c2410/linux-2.6.24
# chmod +x scripts/gen_initramfs_list.sh
#
ls -l usr/gen_init_cpio
-rwxr-xr-x 1 zengxiaolong zengxiaolong 14979 2010-02-05 23:02 usr/gen_init_cpio
#
./scripts/gen_initramfs_list.sh   -o initramfs.gz -u 0 -g 0../rootfs/

注:
1. 如果已经编译过内核,usr目录下将会有gen_init_cpio命令
2.
gen_initramfs_list.sh脚本只能在内核根目录下运行( ./scripts/gen_initramfs_list.sh )






initramfs 启动失败
-----------------------------------------------------------------
root@zengxiaolong:/home/zengxiaolong/soft/s3c2410/rootfs# du -lh
4.0K    ./dev
4.0K    ./tmp
12K    ./etc/init.d
44K    ./etc
4.0K    ./usr
4.0K    ./var
4.0K    ./sbin
5.0M    ./bin
4.0K    ./sys
116K    ./lib/modules
3.1M    ./lib
4.0K    ./proc
8.1M    .
root@zengxiaolong:/home/zengxiaolong/soft/s3c2410/rootfs#


内核启动信息
usbcore: registered new device driver usb  
NET: Registered protocol family 2  
IP route cache hash table entries: 1024 (order: 0, 4096 bytes) 
TCP established hash table entries: 512 (order: 0, 4096 bytes) 
TCP bind hash table entries: 512 (order: -1, 2048 bytes) 
TCP: Hash tables configured (established 512 bind 512) 

TCP reno registered   





initramfs接近了8M,内核启动失败

TCP bind hash table entries: 512 (order: -1, 2048 bytes)
TCP: Hash tables configured (established 512 bind 512)
TCP reno registered
NetWinder Floating Point Emulator V0.97 (double precision)


你可能感兴趣的:(initramfs 深入理解, 以及initramfs与initrd的区别)