CentOS5和6的启动流程

前言



熟悉CentOS系统的启动流程对我们学习linux系统是十分有帮助的。
因为从CentOS7开始使用的初始化程序init已经大不相同了,这里主要介绍CentOS5和6的启动流程。


启动基本流程:
POST –> Boot Sequence(BIOS) –> Boot Loader (MBR) –> Kernel(ramdisk) –> rootfs –> switchroot –> /sbin/init –>(配置文件:/etc/inittab, /etc/init/*.conf) –> 根据init配置文件设置默认运行级别 –> 运行系统初始化脚本/etc/rc.d/rc.sysinit,完成系统初始化 –> 开启或关闭用户选定的对应运行级别下所对应的服务 –> 启动终端,打印登录提示符。
注:
浅蓝色的是在内核空间的启动流程
红色的是在用户空间的启动流程

第一阶段硬件引导启动

power on

首先肯定得通电嘛…

POST加电自检

主要实现的功能是检测各个外围硬件设备是否存在而且能够正常运行起来,实现这一自检功能的是固化在主板上的ROM(主要代表为CMOS)芯片上的BIOS(Basic Input/Output System)程序;例如BIOS会检测CPU、Memory以及I/O设备是否能够正常运行,如果是个人计算机的话可能还会检测一下显示器。只要一通电,CPU就会自动去加载ROM芯片上的BIOS程序,是这样来实现的。而检测完成之后就进行硬件设备的初始化。

ROM和RAM基本信息:
ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等。
RAM:CMOS互补金属氧化物半导体,保存各项参数的设定。

Boot Sequence(BIOS)

主要实现的功能是选择要启动的硬件设备,选择了之后就可以读取这个设备上位于MBR里头的bootloader了。这一步的实现是这样的:根据BIOS中对启动顺序的设定,BIOS自己会依次扫描各个引导设备,然后第一个被扫描到具有引导程序(bootloader)的设备就被作为要启动的引导设备。简单点说:就是按次序查找各引导设备,第一个有引导程序的设备即为本次启动用到设备.

Boot Loader (MBR)

这一步实现起来的步骤比较多,前面的BIOS通过读取并执行启动设备的MBR中的bootloader,而bootloader要实现的功能就是提供一个菜单给用户,让用户去选择要启动的系统或不同的内核版本,然后把用户选择的内核版本加载至RAM中的特定空间,接着在RAM中解压、展开,而后把系统控制权移交给内核。

第二阶段GRUB启动引导阶段

grub是bootloader中的一种,就grub来说,为了打破在MBR中只有446Bytes用于存放bootloader这一限制,
所以这一步的实现是这样的:grub是通过分成三个阶段来实现加载内核这一功能的,这三个阶段分别是:
stage1, stage1.5以及stage2。其中:

stage1

stage1:存放于MBR的前446Bytes,用于加载stage1.5阶段,目的是为了识别并驱动stage2(或者/boot)所在分区的文件系统。

stage1.5

stage1.5:位于/boot基本磁盘分区中,为识别内核文件所在的文件系统提供文件系统识别扩展
可以理解为,Stage1.5是桥梁,由于Stage2较大,需要Stage1.5引导位于文件系统中的Stage2

stage2

stage2:存放于磁盘分区之上,具体存放于/boot/grub目录之下,主要用于加载内核文件(vmlinuz-VERSION-RELEASE)
以及ramdisk这个临时根文件系统(initrd-VERSION-RELEASE.img或initramfs-VERSION-RELEASE.img)。

注:假如要启动的是硬盘设备,首先我们的硬件平台主板BIOS必须能够识别硬盘,然后BIOS才能加载硬盘中的bootloader,
而bootloader自身加载后就能够直接识别当前主机上的硬盘设备了;不过,能够识别硬盘设备不代表能够识别硬盘设备中的
文件系统,因为文件系统是额外附加的一层软件组织的文件结构,所以要对接一种文件系统,就必须要有对应的能够识别和
理解这种文件系统的驱动,这种驱动就称为文件系统驱动。而stage1.5就是向grub提供文件系统驱动的,这样stage1就能访问
stage2及内核所在的分区(/boot)了。


第三阶段内核引导阶段

Kerenl在得到系统控制权之后,首先要进行自身初始化,而初始化的主要作用是:

1.首先探测可识别到的所有硬件设备:

bootloader将系统控制权移交给内核就好比如后朝推翻前朝,
统治者(内核)当权之后,首先要检查一下有哪些是前朝所留下的,判断是否能留为己用,不能就杀掉。

2.再加载硬件驱动程序:

即加载真正的根文件系统所在设备的驱动程序(借助于ramdisk加载驱动)
同时在内存中释放kernel使用的file system。

3.然后以只读方式挂载根文件系统:

如果有借助于ramdisk这个临时文件系统(虚根),则在这一步之后会执行根切换;否则不执行根切换。

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

到这里内核空间的启动流程就结束了,而接下来是用户空间完成后续的系统启动流程。

注意: ramdisk和内核是由bootloader一同加载到内存当中的,ramdisk是用于实现系统初始化的、基于内存的磁盘设备,
即加载至内存(的某一段空间)后把内存当磁盘使用,并在内存中作为临时根文件系统提供给内核使用,帮助内核挂载真正
的根文件系统。而之所以能够帮助内核挂载根文件系统是因为在ramdisk这个临时文件系统的/lib/modules目录下有真正
的根文件系统所在设备的驱动程序。

第四阶段init初始化阶段

这一步的流程是:/sbin/init –> 根据init配置文件设置默认运行级别 –> 运行系统初始化脚本/etc/rc.d/rc.sysinit,
完成系统初始化 –> 关闭或启动用户选定的默认运行级别所对应的服务 –> 启动终端,打印登录提示符

init初始化最初

注:
init可以理解为上帝既内核派来的使者,init这个初始化程序会根据其配置文件执行一系列操作。虽然CentOS 5、
CentOS 6以及CentOS 7的init配置 文件各不相同,但总体的启动流程是不变的。

  • 对于CentOS 5来说,初始化程序init是SysV init,其配置文件为:/etc/inittab;

  • 对于CentOS 6来说,初始化程序init是upstart,其配置文件为:/etc/inittab,/etc/init/*.conf,
    也就是upstart将配置文件拆分成多个,在/etc/init/目录下以conf结尾的都是upstart风格的配置文件,
    而/etc/inittab仅用于设置默认运行级别;

  • 对于CentOS 7来说,初始化程序init是systemd,其配置文件为:/usr/lib/system/systemd/*,/etc/systemd/system/*;

虽然说初始化各有不同,但大概过程都是差不多的。

1.初始运行级别(RUN LEVEL)
2.系统初始化脚本
3.对应运行级别的脚本目录
4.捕获某个关键字顺序
5.定义UPS电源终端/恢复脚本
6.在虚拟控制台生成getty
7.在运行级别5初始化X

运行系统初始化脚本

运行系统初始化脚本主要作用有:

(1) 设置主机名
(2) 设置欢迎信息
(3) 激活udev和selinux
(4) 挂载/etc/fstab文件中定义的文件系统
(5) 检测根文件系统,并以读写方式重新挂载根文件系统
(6) 设置系统时钟
(7) 激活swap设备
(8) 根据/etc/sysctl.conf文件设置内核参数
(9) 激活lvm及software raid设备
(10) 加载额外设备的驱动程序
(11) 清理操作

初始化最后

关闭或情动用户选定的默认运行级别所对应的服务。

K*:要停止的服务,K##*,优先级,数字越小,越优先关闭,依赖的服务先关闭,然后再关闭被依赖的。

S*:要启动的服务,S##*,优先级,数字越小,越是优先启动,被依赖的服务先启动,而依赖的服务后启动。

/etc/rc.d/init.d目录还有个链接目录为/etc/init.d目录,这两目录下文件相同.

脚本文件/etc/rc.d/rc作用为当级别切换时启动或停止服务;此脚本接受传递的参数给脚本中$runlevel变量,
然后,读取/etc /rc$runlevel.d/K*和/etc/rc$runlevel.d/S*所有文件,这些文件就是为什么开机启动后,
有些服务会自动启动,有些服 务没有启动的原因。

大概情况用逻辑脚本显示:

for srv in /etc/rc.d/rclever.d/K*; do
$srv stop
done
for srv in /etc/rc.d/rclever.d/S*; do
$srv start
done

最后

如果上面那些阶段没出问题,那么到了这里就启动成功。




ღ ღ ღ 如果觉得文章对您有用,不妨赞一下ღ ღ ღ

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章