initrd man
时间:2010-05-02 来源:walker_wu
Initrd man
NAME
Initrd – boot loader initialized RAM disk
CONFIGURATION
/dev/initrd 是一个只读的块设备,分配major number号为1,minor number号为250。典型的/dev/initrd是root.disk 以0400拥有的(只能被root读)。如果Linux系统没有创建/dev/initrd,下面的命令可以用来创建:
mknod –m 400 /dev/initrd b 1 250
chown root:dick /dev/initrd
也同时支持RAM disk和Initial RAM disk(例如,CONFIG_BLK_DEV_RAM=y 和CONFIG_BLK_DEV_INITRD=y)必须被直接编译到Linux内核来使用/dev/initrd。当使用/dev/initrd时,RAM disk驱动不能作为一个模块加载。
FILES
/dev/initrd
/dev/ram0
/linuxrc
/initrd
DESCRIPTION
特殊文件/dev/initrd是一个只读文件。设备/dev/initrd是一个RAM disk,在内核开始之前被boot loader初始化(例如,加载时)。之后内核可以使用块设备/dev/initrd的内容分两部系统启动。
在启动的第一步,内核启动并从/dev/initrd的内容中挂载一个初始化根文件系统(initial root file-system)(例如,RAM disk被boot loader初始化)。在第二步,额外的驱动或是其它模块从初始化根设备的内容中加载。在加载额外模块之后,一个新的根文件系统(例如,正常根文件系统)被从不同的设备挂载。
Boot-up Operation
当使用initrd启动时,系统如下启动:
1. boot loader加载内核程序和/dev/initrd内容到内存。
2. 在内核启动时,内核解压、复制设备/dev/initrd的内容到设备/dev/ram0,然后使用/dev/initrd释放内存。
3. 之后内核以读写方式挂载设备/dev/ram0作为初始化根文件系统。
4. 如果指定的正常根文件系统也是初始化根文件系统(例如,/dev/ram0),则内核跳到最后一步以安照正常启动顺序。
5. 如果可运行文件/linuxrc在初始化文件系统中,则以UID 0运行。(文件/linuxrc必须有可运行权限。文件/linuxrc可以是任何可运行的内容,包括shell脚本)
6. 如果/linuxrc没有被运行获知当/linuxrc终止,正常根文件系统被挂载。(如果/linuxrc退出时,任意文件系统挂载在初始化根文件系统,那内核的行为就是UNSPECIFIED)
7. 如果正常文件系统有目录/initrd,设备/dev/ram0被从/ 移动到/initrd。否则,如果目录/initrd不存在,设备/dev/ram0没有挂载。(当从/ 移动到/initrd时,/dev/ram0不是未挂载,因此程序仍然可以从/dev/ram0运行。如果目录/initrd没有存在在正常根文件系统,而且当/linuxrc退出时任何程序仍然从/dev/ram0运行,内核的行为就是UNSPECIFIED)
8. 正常引导顺序(例如,启动/sbin/init )是在正常根文件系统开始的。
Option
下面的boot loader选项是当使用initrd时影响内核的启动操作:
initrd=filename
指定文件作为/dev/initrd的内容去加载。
noinitrd
这个引导时的选项关闭两部引导过程。内核运行正常启动顺序,假设/dev/initrd没有初始化。通过这个选项,任何通过boot loader加载到内存的/dev/initrd内容被保留。这个选项允许/dev/initrd内容称为任何数据,也不需要限制为一个文件系统镜像。但是,设备/dev/initrd是只读的,在系统引导后只能读一次。
root=device-name
指定设备作为正常根文件系统。
Usage
主要应用initrd是为了允许在系统安装时,模块化内核配置。
一个可能的系统安装顺序如下:
1. loader程序从软盘或者是其它介质中引导一个小型内核(例如,支持/dev/ram,/dev/initrd和ext2文件系统)并加载/dev/initrd通过一个gizipped版本的初始化文件系统。
2. 可运行的/linuxrc决定哪些是需要去做的:(1)挂载正常根文件系统(如,设备类型,设备驱动,文件系统)和(2)分布介质(如,CD-ROM,网络,磁带,……)。这些可以被通过询问用户的方式实现,通过自动探测,或者是混合方法。
3. 可运行的/linuxrc从初始化根文件系统中加载必要模块。
4. 可运行的/linuxrc创建并转移根文件系统。(在一阶段时,正常根文件系统并没有完整的系统。)
5. 可运行的/linuxrc设置/proc/sys/kernel/real-root-dev,解除挂载/proc、正常根文件系统和其它挂载的文件系统,然后终止。
6. 内核挂载正常根文件系统。
7. 现在文件系统是可进入的并完整的,boot loader可以被安装。
8. boot loader被配置加载到/dev/initrd一个文件系统中,这个系统包括一系列可以用于启动系统的模块。(例如,设备/dev/ram0可以被修改,然后解除挂载,最后,镜像被从/dev/ram0写成一个文件。)
9. 系统现在是可引导的,额外的安装可以实现。
在以上过程中,/dev/initrd的关键角色是在正常系统操作时,不需要询问初始化内核选择,大的兼容的内核,或是重新编译内核,就可以重新使用配置数据。
第二种过程是在一个单一的管理网络中,安装一个linux运行系统依靠不同的硬件配置。在这种情况下,需要使用只有一小部分内核,保持系统配置信息尽量的小,创建一个普通文件带有所有需要的模块。然后只有/linuxrx文件或者被/linuxrc运行的文件不同。
第三种过程是更方便的恢复盘。因为在引导时根文件系统分区的位置信息是不需要的,系统可以通过加载/dev/initrd使用对话或者自动检测依靠。
最后一点,Linux CD-ROM发行版可能使用initrd使得从CD-ROM安装更容易。
NOTES
1. 对于现在的内核,文件系统在/dev/ram0从/ 移动到/initrd 时,仍然是挂载的,并可以访问。但是,/proc/mounts并没有更新。
2. 对于现在的内核,如果目录/initrd不存在,那么,如果/dev/ram0被任何程序使用或者是任何文件系统挂载它的时候,/dev/ram0将不会完全的解除挂载。如果/dev/ram0没有被完全的解除挂载,那么/dev/ram0就仍然在内存中。
3. /dev/initrd用户不应该仅仅依赖于上述给定的行为。在以后的linux内核版本中,行为可能会发生改变。