vmlinuxz initrd initrd.imd

 vmlinuz自然就是内核了,initrd.img是一个小的映象,包含一个最小的linux系统。通常的步骤是先启动内核,然后内核挂载initrd.img,并执行里面的脚本来进一步挂载各种各样的模块,然后发现真正的root分区,挂载并执行/sbin/init... ...。
initrd.img当然是可选的了,如果没有initrd.img,内核就试图直接挂载root分区。
之所以要有initrd,那是为了启动的时候有更大的灵活性。比如,你把ext3支持编译成模块了。偏偏你的root分区又是ext3的。这下就麻烦了。因为内核需要挂载root分区之后才能加载ext3支持。但是没有ext3支持就没法挂载root分区。initrd就是用来解决这个问题的。
类似的用这个东西还可以做其他的事情,比如从usb盘启动linux也会面临上面类似的问题。用initrd就能搞定了。
甚至,我想在有些嵌入式设备里面都不需要真正的root分区,用initrd就足够搞定一切了。

 

kernel及initrd

kernel就是我们刚刚所提到的"vmlinuz"文件,只是文件名称不是直接取名为kernel罢了。一般系统在启动时,kernel及initrd两种文件都是要同时存在的(如图2-15所示,启动菜单中大部分都是kenel与initrd两个选项同时存在的),因为这两者是相辅相成的文件,缺一不可,这也是为何笔者会将kernel及initrd放在同一章节中做介绍的原因,这样可以让读者直接将两者做对照。当然,不同的系统应用模式或许可以省略掉initrd,但kernel就万万不可,因为kernel是一个系统(不论系统的大小)中最基本的一个元素,缺了kernel,就无系统可言。

(点击查看大图)图2-15:GRUB启动菜单中某操作系统的细部选项

kernel

kernel是操作系统的核心程序,也是操作系统最重要的一支程序,所有的软、硬件都通过kernel做交互的操作,因此,若这段程序写得不好,将会造成操作系统易宕机的状况,甚至找不到设备或适配器都有可能。

用户和kernel之间,最常会遇到的一种状况,就是当计算机使用一段时间(可能是2~3年内),就会发现许多硬件或软件功能都已经不再被既有的操作系统所支持,像USB 2.0刚出现或是须要使用新的文件系统(kernel中有关USB 2.0的配置如图2-16所示),都要通过kernel的更新做配合,因为软、硬件技术都已经全面更新。

【config-kernel版本】文件的意义,就在于记录kernel所支持的项目有哪些,以及支持的方式(像直接支持或是模块化),当然每一版kernel的config文件都会不太一样。

举例来说,近几年的Intel南桥芯片组依序为ICH5、ICH6、ICH7、ICH8、ICH9,一直到现在的ICH10,如果用户在ICH10刚推出就安装Fedora 7,启动时一定会有许多兼容性的问题发生,因为芯片组有可能部分功能不被Fedora 7支持所致。

 
(点击查看大图)图2-16:在/boot/config-XXX文件中有关USB 2.0与NTFS的配置

解决的方法,并不是一定得苦等到更新版本的出现,而是可以在既有的Fedora 7直接从网络上下载较新的kernel版本,再将旧的kernel取代掉即可,只要新的kernel支持该芯片组,便可以继续使用原来的Linux,完全不需重新安装或增删其他任何资料。

initrd

initrd的全名是initial ram disk,顾名思义就是启动系统所需加载的虚拟磁盘。要了解kernel与initrd之关系,才会真正知道initrd存在的意义及它执行时对系统所带来的影响,这是非常重要的。

以图2-17为例,kernel 、initrd与系统硬盘中所存有的模块(System Module)有各自所负责的领域,这三者依启动时的顺序被依序加载,因为启动过程需要很多硬件的协助,所以在顺序上是不能混乱的,在图2-17中为了让读者比较好分辨出各硬件与这三者的关系,所以用不同

 
(点击查看大图)图2-17:kernel、initrd与模块间的关系

的颜色深浅来标明(大致的范围,仅供参考使用),同颜色箭头所指向的系统文件负责该区域,这三个系统文件依启动顺序分别为:kernel、initrd及System Module,以下分别介绍其负责的部分有哪些。

灰色框:kernel所负责的主要是北桥、南桥、CPU及内存,从硬件角度来看,若kernel有问题,当然是整个系统都会出错,因为会影响到整部主机最重要的硬件核心部分。

白色框:initrd大部分所支持的都是一些关键(会影响启动)的外部硬件,如SATA、SCSI、USB等硬件外设,可视情况调整支持的多少。

黑色框:系统中所存在的模块,是与支持和启动无很大关系的硬件,大部分是一些应用方面的硬件设备,如声卡、网卡、显示卡等,没有这些硬件的支持还是可以正常启动进入Linux,只是会有功能上的缺陷,所以才会以模块文件方式存在于文件系统中。

initrd的目的就是在kernel加载系统认识CPU、内存等信息之后,像接力赛般地让系统进一步知道"还有哪些硬件是启动所必须使用到的",若和启动无关的,就可以丢给接下来用户自行配置的系统模块。

但什么时候需要在initrd文件中放入额外的模块(或拿掉模块),答案是当主机多了一个在启动操作系统之前就要先找到的设备。

如果该硬设备可以等进入操作系统再使用,就可以直接以modprobe的方式载入模块使用,而无须去修改initrd文件,因为这样只会增加启动时所要加载的文件数目。但要注意的是,在initrd文件中所放入的模块,必须是与操作系统同一版本kernel所编译的模块,这样才可使用。

 

 

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将驻留在内存

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章