1 什么是initial ram disk

它就是一个做好了的文件系统,其存储空间是ram。在kernel启动的第一个阶段,会被mount成根文件系统。

2 为什么需要initial ram disk

第一,为了保证kernel image的大小,因此把modules放在initial ram disk中存放。在系统启动的时候再动态加载;

第二,为了对真正装载了根文件系统的外部存储设备进行初始化,等其完全可用了,再把根文件系统切换过去。要让根文件系统能够正常工作起来,必须要准备好环境,然后mount它。

3 linux启动时必须要initial ram disk吗?

也可以用initramfs。

4 debian启动时需要initial ram disk吗?

需要。

5 initrd.img里面的内容

5.1 用户空间使用的一些工具f

比如/bin、/sbin下面的命令等。

5.2 initrd.img的解压

这是一个gzip文件,所以用gzip命令解压,gzip -cd >initrd.ext2

这里-c是把输出重定向到标准输出,d是decompress。

然后生成的initrd.ext2是一个cpio文件,直接用cpio -i <initrd.ext2就可以了。

解压的第二种方法:

zcat initrd.img | cpio -id

5.3 一些内核中的模块

动态链接库,比如libm.so.6、librt.so.1等。

6 为自己的内核制作initrd.image

6.1 命令

制作一个根文件系统的目录结构,里面放入各种需要的文件。然后执行下面的命令:

find . |  cpio -H newc --create  | gzip -9 > ../initrd.img

6.2 创建最简单的initrd.image

这个initrd.image中只有两个文件:

/dev/console和init文件。

6.2.1 创建myinit

创建文件myinit.c

#include <stdio.h>

int main()

{

    printf ("\n");

    printf ("hello world from %s!\n", __FILE__);

    while (1) {}

    return 0;

}

gcc -static myinit.c -l myinit

6.2.2 创建目录结构并且生成initrd.image.gz文件

mkdir initrd

mkdir initrd/sbin

cp myinit initrd/sbin/init

cd initrd

fakeroot

mkdir -p dev

mknod dev/console c 5 1

chown -R root sbin

genext2fs -d . -b 1024 ../initrd.image

exit

cd ..

cat initrd.image | gzip > initrd.image.gz

mv initrd.image.gz initrd.image

 

使用initial ram disk的时候,要显式的指定root device,即在kernel command line上显式的指定"root=/dev/ram0",否则启动的时候会出错。

使用该ext2类型的image时,编译内核时要打开对ext2文件系统的支持,否则识别不了。