系统启动流程

 

 

     系统的启动时一项非常复杂的过程,内核需要检测硬件并加载驱动程序,接着调用相关程序为系统运行准备好环境。下面以centos6为例,说明系统的启动过程。

1   post

当我们按下开机的电源后,主板上的芯片组会首先向CPU发出一个指令,CPU就会跳转到BIOS中的启动代码位置; BIOS首先要检测关键设备(如内存、显卡等)是否正常,这个过程就称为POST(加电后自检)。

2   boot sequence(BIOS)

引导次序:按次序找引导设备,第一个有引导程序的设备,即为启动所用到的设备。

3  MBR(Bootloader)

MBRMater Boot Record),即主引导记录,其位置在硬盘第一个扇区的前512字节。。它由三个部分组成,主引导程序(Bootloader)硬盘分区表DPTDisk Partition table)和硬盘有效标志(55AA),其结构图如下所示:

 

现在常用的Bootloader程序为GRUBGRUBGrand Unified Bootloader)是由GNU组织所推行的;CentOS 5CentOS 6上使用的版本为Grub 0.97

GRUB是位于/boot下的一个目录,其里面的内容如下图:

 

wKiom1YNIEDxl4dyAAFD74n6hcg187.jpg

从上图中可以看到stage1 *_stage1_5stage2这三类文件,它们分别表示GRUB引导时的三个阶段。stage1执行Bootloadergrub目录中存在许多以stage1_5结尾的文件,这些文件都是stage1_5阶段功能的文件,里面存放着文件系统的格式,其作用是连接stage1stage2的一个通道。stage2阶段会读取grub.conf配置文件中设置信息来完成系统的引导,加载内核

4  加载内核及initrd

   stage2被载入内存执行时,它首先会去解析grub的配置文件/boot/grub/grub.conf,然后加载内核镜像到内存中,并将控制权转交给内核,而内核会立即初始化系统中各设备并做相关的配置工作。

关于Linux的设备驱动程序的加载,有一部分驱动程序直接被编译进内核镜像中,另一部分驱动程序则是以模块的形式放在initrd(ramdisk)中。Initrd称为虚拟文件系统,它是激活系统所必须加载的文件系统。当kernel被载入到内存后,需要加载相应驱动程来识别文件系统,这时initrd就充当了临时的系统被挂载到rootfs上,其作用就是协助kernel来加载驱动程序。initrd加载各种存储介质相关的设备驱动程序。当所需的驱动程序加载完后,会创建一个根设备,然后将根文件系统rootfs以只读的方式挂载。这一步结束后,释放未使用的内存,转换到真正的根文件系统上面去,同时运行/sbin/init程序,执行系统的1号进程。此后系统的控制权就全权交给/sbin/init进程了。

5  init进程

/sbin/init进程是系统其他所有进程的父进程,当它接管了系统的控制权先之后,它首先会去读取/etc/inittab文件来执行相应的脚本进行系统初始化, inittab内有个重要的选项就是运行级别runlevelinit进程会读取/etc/inittab中定义的运行级别,做相应的配置。runlevel0-67个级别,分别是:

 0-halt关机

1-single user mode      单用户维护模式

2-multi-userwithout NFS        无网络功能的文本模式

3-full-muliti-user mode        完整的文本模式

4-unused            系统保留,未使用

5-X11                   启动图形界面

6-reboot            重启

装有图形界面时一般默认级别为5,未装图形界面默认为3

利用/etc/rc.d/rc.sysint初始化

1、设定主机名:读取/etc/sysconfig/network文件中的HOSTNAME参数,并以之设定主机名;

    2、打印文本欢迎信息;    

    3、激活SElinuxudev;

    4、挂载/etc/fstab文件中定义的文件系统;

    5、激活swap;

    6、检测根文件系统,并以读写方式重新挂载;

    7、设置系统时钟;

    8、根据/etc/sysctl.conf的文件设置设置内核参数;

    9、激活LVMRAID设备;

10、加载额外设备的驱动程序;

11、清理工作。

7 init执行选定的runlevel级别的相关服务的启动

/etc/rc.d/rc.sysinit执行完后,系统就可以顺利工作了,只是还需要启动系统所需要的各种服务,这样主机才可以提供相关的网络和主机功能,完成了系统所有的启动任务后,linux会启动终端或X-Window来等待用户登录,至此,系统就启动完毕了。