一个操作系统的开启与关闭不是我们手动的打开与关闭电源那么简单。这个过程中涉及太多的内部服务的打开与关闭。而在这个过程中如果出现什么问题,那么以后的某些服务就可能被影响。所以我们就需要对CentOS的启动流程了解清楚,这样出现问题之后我们才会去解决它。
CentOS的启动流程总的顺序如下(这里以CentOS 6为例):
POST(加电自检相关硬件设备) –> Boot Sequence(BIOS)–> bootloader(MBR) –> 加载Kernel –> 加载rootfs –> switchroot –> /sbin/init –> (配置文件:/etc/inittab, /etc/init/*.conf) –> 根据init配置文件设置默认运行级别 –> 运行系统初始化脚本/etc/rc.d/rc.sysinit,完成系统初始化 –> 开启或关闭用户选定的对应运行级别下所对应的服务 –> 启动终端,打印登录提示符。
这么多步骤里我们可以把它分简单的四大步来介绍:
第一步:POST加电自检
主要实现的功能是检测各个外围硬件设备是否存在而且能够正常运行起来,实现这一自检功能的是固化在主板上的ROM(主要代表为CMOS)芯片上的BIOS(Basic Input/Output System)程序;例如BIOS会检测CPU、Memory以及I/O设备是否能够正常运行。而检测完成之后就进行硬件设备的初始化。然后就会加载BIOS,它的主要功能是选择要启动的硬件设备,选择了之后就可以读取这个设备上位于MBR里头的bootloader了。它是根据BIOS中对启动顺序的设定,BIOS自己会依次扫描各个引导设备,然后第一个被扫描到具有引导程序(bootloader)的设备就被作为要启动的引导设备。
第二步:加载bootloader(MBR)
这一步实现起来的步骤比较多,前面的BIOS通过读取并执行启动设备的MBR中的bootloader,而bootloader要实现的功能就是提供一个菜单给用户,让用户去选择要启动的系统或不同的内核版本,然后把用户选择的内核版本加载至RAM中的特定空间,接着在RAM中解压、展开,而后把系统控制权移交给内核。
首先,bootloader是一个程序,它的执行肯定依赖于一个硬件之上,这个硬件就是硬盘,准确的说就是第一个可以启动的硬盘的第一个扇区内。就是所说的MBR(Master Boot Record主引导记录)中。
而grub也是bootloader中的一种,它是为了打破在MBR中只有446Bytes用于存放bootloader这一限制,所以这一步的实现是这样的:grub是通过三个阶段来实现加载内核这一功能的,这三个阶段分别是:stage1, stage1.5以及stage2。其中:
stage1:存放于MBR的前446Bytes,用于加载stage1.5阶段,目的是为了识别并驱动stage2(或者/boot)所在分区的文件系统;
stage1.5:存放于MBR之后的扇区,加载stage2所在分区的文件系统驱动,让stage1中的bootloader能识别stage2所在分区的文件系统;
stage2:存放于磁盘分区之上,具体存放于/boot/grub目录下,grub目录下又有一个/grub.confwenj ,它主要用于加载内核文件(vmlinuz-VERSION-RELEASE)以及ramdisk这个临时根文件系统(initrd-VERSION-RELEASE.img或initramfs-VERSION-RELEASE.img)。
下面就是grub.conf的配置文件:
第三步:加载Kernel,执行系统初始化
Kerenl在得到系统控制权之后,首先要进行自身初始化,而初始化的主要作用是:
(1)探测可识别到的所有硬件设备;
bootloader将系统控制权移交给内核就好比如后朝推翻前朝,统治者(内核)当权之后,首先要检查一下有哪些是前朝所留下的,例如有哪些领土、人力、财力、兵力可用等等。
(2)加载硬件驱动程序,即加载真正的根文件系统所在设备的驱动程序(有可能会借助于ramdisk加载驱动);
这就像统治者(内核)在得知底下存在的人力、财力之后,开始将可以“为我所用”的人力纳入麾下,听自己使唤,而不听使唤的杀掉;
(3)以只读方式挂载根文件系统;
如果有借助于ramdisk这个临时文件系统(虚根),则在这一步之后会执行根切换;否则不执行根切换。
(4)运行用户空间的第一个应用程序:/sbin/init.
到这里内核空间的启动流程就结束了,而接下来是用户空间完成后续的系统启动流程。
第四步:执行/sbin/init来管理用户空间服务进程
这一步的流程是:/sbin/init –> 根据init配置文件设置默认运行级别 –> 运行系统初始化脚本/etc/rc.d/rc.sysinit,完成系统初始化 –> 关闭或启动用户选定的默认运行级别所对应的服务 –> 启动终端,打印登录提示符
1)init可以理解成是内核用来管理用户空间的,init这个初始化程序会根据其配置文件执行一系列操作。虽然CentOS 5、CentOS 6以及CentOS 7的init配置文件各不相同,但总体的启动流程是不变的。这里它会根据inittab这个文件来定义启动的运行级别
2)运行初始化脚本/etc/rc.d/rc.sysinit,它是为了初始化系统环境,这一步初始化包括:
①设置主机名;
②设置欢迎信息;
③激活udev和selinux;
④挂载/etc/fstab文件中定义的所有文件系统;
⑤检测根文件系统,以读写方式重新挂载根文件系统;
⑥设置系统时钟;
⑦根据/etc/sysctl.conf文件来设置内核参数;
⑧激活lvm及软raid设备;
⑨激活swap设备;
⑩加载额外设备的驱动程序(因为内核只加载根文件系统所在分区的驱动程序);
3)关闭或启动用户选定的默认运行级别下所对应的服务
它要实现的功能是:根据前面用户通过init配置文件对默认运行级别的设定,关闭或启动这个运行级别下的服务。
4)启动终端,打印登录提示符
根据前面获取的运行级别来启动终端,mingetty程序是用于启动终端的,它会调用登录程序login,这样就能显示出登录提示符了,类似mingetty这种用于打开终端的程序还有getty等。
如果默认运行级别为5,则会打开图形界面。
最后用户登录,系统启动完成。
原创文章,作者:gong,如若转载,请注明出处:http://www.178linux.com/85783