CentOS的开机可分为4个主要步骤;如下图所示:
第一步:主板加电自检,在开机后会运行,针对计算机硬件如CPU、主板、存储器等进行基本的功能检测。当POST检测到硬件部分存在问题时,一般会通过声信号(主板蜂鸣器)发出独特的指示性声信号(例如长鸣、二短一长等)表明故障位置,同时会在显示器输出故障代码或故障文字描述。
第二步:加载MBR中的Boot Loader: 中所周知,我们的主机上有时候不只一块硬盘,也就是说,主机上有MBR中有boot Loader的设备可能不只一个,BIOS中的boot sequence便定义了开机时到MBR中找boot loader的次序,类似下图中boot项---
在这里可以设置开机拥有boot loader(Grub)的硬件设备的先后顺序,按照此菜单中各项,从上往下查找可引导开机的设备,若第一次查找到可引导开机项,即使引导程序损坏,无法开机,也不会继续往下查找了;BIOS找到boot loader以后加载grub菜单,让用户选择要加载到内存运行的内核;
第 三步:从第二步中的grub配置中可查找到内核的所在位置,将其加加载至内存中,内核进行自解压、展开运行后,并将硬件控制权交予内核,grub从内存中退出。
可能需要ramdisk来协助挂载根文件系统的原因是,如果跟文件系统在特殊的磁盘介质上,或者是文件系统比较(例如:RAID、LVM等),内核中没有集成该设备的驱动程序,所以无法挂载根文件系统,因此需要借助于ramdisk来协助挂载。如果根文件系统在IDE磁盘,并且默认文件系统格式为ext2或ext3,即使没有ramdisk协助,根文件系统也可以挂载;ramdisk的运行机制是在内存中加载一个虚拟根文件系统去识别真正的根文件系统所需的驱动程序并加载,加载完成后,内核便可识别真正的根文件系统并将其挂载,此时ramdisk再将根切换给真正的根文件系统,自己退出内存;CentOS5上的ramdisk为initrd,CentOS6上的却是initrmfs,之所以改进的原因是因为内核的特性之一为使用缓存对加速数据访问。Initrd是将自己作为磁盘设备与内核通信,因此,initrd本来就运行于内存中,而内核还需要再次将其加载一份作为缓存,这样大大降低了数据访问效率。所以initrmfs是将自己作为运行在内存中的文件系统与内核通信的。
这里所提到默认以只读方式挂载根文件系统,是因为防止内核出bug,导致根文件系统数据丢失,所以,在系统未完全启动完成之前,只能以只读挂载”/”,待系统完全正常启动,内核便以读写模式重挂根文件系统。
以上步骤完成,便开始内核便开始启动用户空间的第一个应用程序:init(CentOS5),即/sbin/init,以CentOS5为例,init程序的工作具体如下:
以CentOS5为例,首先init根据其配置文件/etc/inittab中的设定,来设定系统启动的默认级别,具体的设置为:” id:3:initdefault: “ 此处的三个字段的意义为:“id”相当于行号,保持全局唯一即可,”3”表示为系统的默认启动级别;inintdefault表示进入定义级别后默认执行的操作,最后”:”后面的便是执行的process。此处第三字段为initdefault意为着设置默认,所以第四字段省略,所以这一行的意义便是设定系统默认启动进入级别3;
系统的运行级别共有7个:0级别-6级别
0级别:关机
1级别:单用户模式,相当于Windows的安全模式
3级别:多用户模式,只是不启动图形界面
4级别:保留级别,和3级别功能接近
5级别:多用户图形模式
6级别:重启
第一个id行执行完成后,便开始执行执行第二行,格式为:
Si::sysinit:/etc/rc.d/rc.sysinit这一行代码的意义为在所有级别执行系统初始化,而对应的process便是/etc/rc.d/rc.sysinit这个脚本。Init程序会执行此脚本完成设置主机名、读取/proc的文件来设定系统参数、激活lvm及raid设备等系统初始化操作,而后便开始执行指定级别下的服务脚本,具体代码为:
l1:1:wait:/etc/rc.d/rc1
l3:2:wait:/etc/rc.d/rc2
….
L3:3:wait:/etc/rc.d/rc3
每一行代表进入该运行级别后,便启动指定级别下/etc/rc.d/rc#.d(#代表0-6)目录下的所有以S开头服务脚本链接,关闭以K开头的服务脚本链接。
而后,执行/etc/inittab中的配置字段:
tty1:2345:respawn:/usr/sbin/mingettytty1
tty2:2345:respawn:/usr/sbin/mingetty tty2
...
tty6:2345:respawn:/usr/sbin/mingettytty6
意为设置用户终端,在2345级别下,每个级别都会开启6个终端,终端设置完成后,mingety程序会调用login程序来帮助用户进行登陆验证;
以上步骤全部完成后,便执行/etc/rc.d/rc.loacl脚本,用户可在该脚本内定义想要开机后执行的命令或脚本。
系统启动完成。
原文地址:http://imsupeng.blog.51cto.com/10651675/1691270