Initrd
名称
initrd -- 由启动加载器进行初始化的RAM DISK
描述
/dev/initrd这个特殊文件是一个只读的块设备文件。/dev/initrd设备文件是一个在内核被启动之前由启动加载器进行初始化的RAM disk。
随后,内核利用/dev/initrd设备文件的内容进行两个阶段的(系统)自举。
在(系统)自举的第一个阶段,内核进行初始化,根据/dev/initrd的内容挂载一个原始根文件系统。
在第二个阶段,一些附加的驱动或者其他模块从原始的根设备中被加载。在加载完附加模块后,一个新的根文件系统(也就是常规的根文件系统)从别的设备被挂载。
自举操作流程
使用initrd进行系统自举,系统初始化如下:
1.启动加载器把内核程序以及/dev/initrd的内容加载到内存
2.在内核初始化过程中,内核把/dev/initrd设备的内容解压缩并拷贝到/dev/ram0设备上,随之释放被/dev/initrd占用的内存空间
3.接着内核以可读写的方式把/dev/ram0设备挂载为原始的根文件系统
4.如果(不知道如何翻译indicated)常规根文件系统也是原始根文件系统(举例来说,/dev/ram0),那么内核跳至最后一步正常启动
5.如果可执行文件/linuxrc存在于原始根文件系统上,/linuxrc就以uid为0的帐户身份被执行。(/linuxrc文件必须具有可执行属性,它可以是包括shell脚本在内的任何有效的可执行文件)
6.如果/linuxrc没有被执行或者当/linuxrc(的运行)终止时,常规根文件系统被挂载。(如果/linuxrc退出时在原始根文件系统上挂载了任意文件系统,那么内核的行为则是不定的。阅读注意事项以确定当前的内核行为)
7.如果常规根文件系统存在/initrd目录,那么/dev/ram0将从/移动到/initrd。否则如果/initrd目录不存在,/dev/ram0将被卸载。(当从/移动到/initrd而/dev/ram0没有被卸载时,会导致进程仍能从/dev/ram0运行)。如果/initrd目录不存在,并且当/linuxrc退出时任何进程仍能从/dev/ram0运行,内核的行为是不定的。阅读注意事项以确定当前内核的行为。)
8.正常的启动过程(比如/sbin/init的调用)将在常规根文件系统上进行
...
注意事项
1.在当前内核下,当/dev/ram0从/被移动到/initrd时,任何已挂载的文件系统依然能被访问。然而,/proc/mounts条目不会被更新。
2.在当前内核下,如果/initrd不存在,如果/dev/ram0被其他进程使用中或者有任何文件系统被挂载其上,/dev/ram0将不会被完全卸载。如果/dev/ram0没有被完全卸载,那么/dev/ram0将驻留在内存
简单补充两点:
1,如果没有/dev/initrd设备,用如下命令创建:
#mknod -m 400 /dev/initrd b 1 250
#chown root:disk /dev/initrd
2,要使用initrd,编译内核时必须选择以下两项:
CON-FIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_INITRD=y
当使用/dev/initrd时, RAM disk driver不能作为模块加载
Initrd的作用有三:
1.提高系统的可移植性
把更多的内核功能条目编译成模块,不仅仅是为了减小内核体积,更重要的是面对各种不同的硬件架构,可以使用initrd中的linuxrc按需进行模块加载以驱动硬件,甚至对于CPU类型或者多处理机也可以进行手工选择内核(配合syslinux这类boot loader)
2.LIVECD(光盘上的Linux)必备的部件
现在的可启动光盘都沿用1995年制定的El Torito标准,它的启动原理在于模拟软盘启动映像,这个映像的大小一般被限制在2800KB,也就是两张软盘的大小,它包含了syslinux(也可以用isolinux,它对映像的大小要求更宽松),syslinux的配置文件,initrd.img以及内核。这时候内核的大小就必须要有约束了(当然,也有来自1MB实模式内存空间的约束),把更多的模块压缩进initrd.img中去,可以缩小启动映像的体积。
最重要的是,linuxrc脚本对于硬盘,光驱模块的加载至关重要,因为livecd要适应尽量多的硬件架构,所以它必须能按需加载模块,这时候initrd就派上用场了。比如说,我们在vmware里运行knoppix,knoppix的linuxrc就自动加载BusLogic.o模块(通过轮换insmod来实现)。
3.在linuxrc脚本中可以很方便地启用个性化bootsplash