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

栏目: 服务器 · 发布时间: 5年前

内容简介:概述:系统启动流程是Linux一个重要的内容,深入了解启动流程会对我们学习Linux起到一个顺水推舟的作用。因为CentOS 7改动较大,所以下面的内容只是针对CentOS 5和6来说的。下面进入正题。启动流程:此过程的就是为了检测一下外界的硬件设备是否能够正常运行,如CPU,内存设备,硬盘等等这些硬件设备是否可以正常工作。

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

启动流程:

第一步:POST加电自检

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

第二步:BIOS选择启动方式

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

第三步:BootLoader

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

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

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

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

代码分析:

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

第四步:加载内核文件

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

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

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

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

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

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

代码分析:

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

Init程序初始化

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

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

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表示开机要被启动的服务,而且服务脚本都会有一个优先级,

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

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

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

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

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

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

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

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

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

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

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

第六步:启动终端

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

第七步:用户登录

系统启动流程结束!

问题总结:

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

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

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

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

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

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

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

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

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

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

流程图:

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

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


以上所述就是小编给大家介绍的《呕心沥血!CentOS系统启动流程详解!》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

ACM程序设计培训教程

ACM程序设计培训教程

吴昊 / 中国铁道 / 2007-8 / 28.0

《ACM程序设计培训教程》不是这些专门问题的教科书,所以对这些问题所涉及知识的介绍不多,主要是分析一个个案例,介绍专属于ACM程序设计的方法和技巧。一起来看看 《ACM程序设计培训教程》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

SHA 加密
SHA 加密

SHA 加密工具