50

呕心沥血!CentOS系统启动流程详解!

 4 years ago
source link: http://os.51cto.com/art/201906/597494.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

呕心沥血!CentOS系统启动流程详解!

系统启动流程是Linux一个重要的内容,深入了解启动流程会对我们学习Linux起到一个顺水推舟的作用。因为CentOS 7改动较大,所以下面的内容只是针对CentOS 5和6来说的。

系统启动流程是Linux一个重要的内容,深入了解启动流程会对我们学习Linux起到一个顺水推舟的作用。因为CentOS 7改动较大,所以下面的内容只是针对CentOS 5和6来说的。下面进入正题。

启动流程:

***步:POST加电自检

此过程的就是为了检测一下外界的硬件设备是否能够正常运行,如CPU,内存设备,硬盘等等这些硬件设备是否可以正常工作。

第二步:BIOS选择启动方式

BIOS对于经常基础计算机的人应该不会陌生,特别是那些经常装系统的人,它就是列出几个选项,让你选择以什么方式来启动系统,常见的有硬盘启动,光盘,以及网络方式启动。

第三步:BootLoader

这个步骤略有复杂,但是其实现的功能就是,引导加载系统中的核心文件,并提交到内存运行,它会列出一个grub菜单,其中的选项是我们操作系统的内核,你选择的内核文件会被加载至内存中运行。

引导加载器grub:找到内核文件,提供grub菜单

4655d779a1510327b6e72bb96842a172.jpg-wh_651x-s_3891385348.jpg

43efea7dde3669a693aeb25839641b51.jpg

代码分析:



  1. [root@localhost testdir]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img . //将/boot下的ramfs文件拷贝至当前目录 
  2. [root@localhost testdir]# zcat initramfs-2.6.32-642.el6.x86_64.img |cpio -id //将其解压缩 
  3. 140023 blocks 
  4. [root@localhost testdir]# ls //其包含的内如如下,因为是临时的根文件,所以目录结构也类似于我们的rootfs,其中包含rootfs所需要的文件系统的驱动 
  5. bin dracut-004-409.el6 init initqueue-settled lib netroot pre-trigger sbin tmp 
  6. cmdline emergency initqueue initqueue-timeout lib64 pre-mount pre-udev sys usr 
  7. dev etc initqueue-finished initramfs-2.6.32-642.el6.x86_64.img mount pre-pivot proc sysroot var 
  8. [root@localhost testdir]# 

第四步:加载内核文件

通过上面所选择的内核文件,来将其加载至内存中解压缩,分为以下四个步骤

1)探测可识别到的所有硬件设备。

2)加载硬件驱动程序(可能借助于ramdisk/ramfs加载驱动)

3)以只读方式挂载根文件系统

4)运行用户空间的***个应用程序:/sbin/init

注意:其中Ramdisk/ramfs即stage2所在分区的rootfs文件系统驱动的文件,有了内核文件及所需要的rootfs的文件系统驱动,为避免内核文件有bug或者人为操作问题,先以只读方式挂载rootfs

代码分析:

526320ce792b54461d8e38813e356dda.jpg-wh_600x-s_896011117.jpg

Init程序初始化

1)根据init的配置文件获取到运行级别信息,并获取系统初始化脚本的文件路径。(CentOS 5的init文件为/etc/inittab,CentOS6将/etc/inittab文件拆分为多个文件)

7ffe6866d93b391fc15ff96dbd2c9ff3.jpg-wh_600x-s_1096358204.jpg

2)读取系统初始化脚本/etc/rc.d/rc.sysinit,并按照脚本内容执行,作用如下: (1)设置主机名(2)设置欢迎信息(3)激活udev和selinux(4)挂载/etc/fstab文件中定义的文件系统(5)检测根文件系统,并以读写方式重新挂载根文件系统(6)设置系统时钟(7)激活swap设备(8)根据/etc/sysctl.conf文件设置内核参数(9)激活lvm及software raid设备(10)加载额外设备的驱动程序(11)清理操作 3)根据前面获取的运行级别,运行/etc/rc.d/rc脚本文件

/etc/rc.d/目录下有几个rc#.d(#号数字,也就是代表运行级别),其目录下文件为链接文件,其指向/etc/init.d/下的服务脚本文家,根据在/etc/inittab获取的默认运行级别和/etc/rc#.d下的链接文件,来启动和关闭系统的服务,想必现在也能联想到了为什么不同级别下启动的服务不相同,为什么有的服务开机启动,有的却关闭 /etc/rc#.d/下的链接文件以K或者S开头,K表示开机要被停止的服务,S表示开机要被启动的服务,而且服务脚本都会有一个优先级,



  1. K*:K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务  
  2. S*:S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务 

 

d8444b6333c156c7eb7025ec5e547412.jpg-wh_600x-s_2955536765.jpg

031896a8da28e252aff6bde49ca59b83.jpg-wh_600x-s_1787341433.jpg

注意:在2345级别的/etc/rc#.d目录下都会有一个rc.local,它其实也是一个链接文件,链接到/etc/rc.d/rc.local,它并不是启动文件,而是一个普通的文件,不过它的优先级最小,所以***启动,如果你想要开机做一些什么操作,可以写到这个脚本里面。

f54bcee0ccb238c82d86647a7a60efc7.jpg-wh_600x-s_3471282537.jpg

ae4eec601e01d2d847aabe6605984cd5.jpg-wh_600x-s_2510337675.jpg

代码分析:以下为CentOS 5中的/etc/inittab文件

3434c4b87e27177183b0810a930f9b95.jpg-wh_600x-s_1765186464.jpg

ec76377f92914c9d38ae4b51c126d93c.jpg-wh_600x-s_798033719.jpg

下图为系统启动时服务开启的界面

c10d6bcf94ddbcb2c7be8d9fdaebe502.jpg-wh_600x-s_2780814256.jpg

第六步:启动终端

根据前面获取的默认运行级别来启动终端,如果运行级别为5,则启动图形界面

第七步:用户登录

系统启动流程结束!

问题总结:

在此之前,一直有几点问题困惑着我,我对它们做了一下总结

1)内核文件在磁盘上,系统还没有启动,系统还没有启动,/目录也没有挂载,前面说先找到boot分区,但是boot分区也是在/的目录下,/还没有,去哪找boot!?

问题解答:注意,此时系统去寻找boot分区下的grub菜单、内核文件及rootfs的驱动并不是通过/目录来寻找,因为此时的/还没有挂载,无法找到/下面的boot目录,而是直接去boot的那个磁盘分区去寻找所需要的文件,具体看一下代码:

045ab39650493068b1fa5d93560f8b55.jpg-wh_600x-s_2483292430.jpg

2)上面问题的继续,即使你先加载boot分区,boot分区系统的系统驱动在哪里呢

问题解答:从以下代码得知,分区信息是从1柱面开始的,那么0柱面被狗吃了么?答案是没有被狗吃,MBR存放在了0柱面,0磁道的***个扇区内,但是它只占据了512个字节,因为0柱面包括了好多扇区,后面的扇区就是为了存放/boot分区的文件系统驱动的。stage1->stage1.5->stage2这个过程就是为了挂载/boot分区,而其中的stage1.5就是寻找/boot分区的文件系统驱动的。

b1fb640d522a61fdc4f0f8c91089fb4a.jpg-wh_600x-s_1614473776.jpg

3)加载内核后,为避免bug或者人为操作失误,rootfs先以只读方式挂载,只读方式挂载怎么写数据呢?

问题解答:内核在读取到init程序后,其中有一个系统初始化脚本,即/etc/rc.d/rc.sysinit脚本,其中有一段代码如下,在这rootfs会被重新以读写方式挂载。

ab70478e857de6f2cb08ad5d5f3a4840.jpg-wh_600x-s_1248157255.jpg

流程图:

俗话说的好,一图抵千言,我将上面所述的启动流程又画了一幅图,希望以更加清晰地描述CentOS的启动流程。

295cd70eef2e3b30570ed22889ae00a6.jpg

【编辑推荐】

【责任编辑:武晓燕 TEL:(010)68476606】

点赞 2


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK