CentOS的启动流程

                  一个操作系统的开启与关闭不是我们手动的打开与关闭电源那么简单。这个过程中涉及太多的内部服务的打开与关闭。而在这个过程中如果出现什么问题,那么以后的某些服务就可能被影响。所以我们就需要对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的配置文件:

CentOS的启动流程

第三步:加载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这个文件来定义启动的运行级别

    CentOS的启动流程

    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

(0)
gonggong
上一篇 2017-09-01 14:58
下一篇 2017-09-01 16:23

相关推荐

  • linux之netfilter与 iptables学习

    Linux之netfilter与iptables学习 一、为什么我们的主机需要防火墙 二、Linux下防火墙如何实现 三、四表五链学习 四、主机防火墙 五、网络防火墙 六、iptables命令学习 七、主机防火墙规则备份与恢复 ====================================== 一、为什么我们的主机需要防火墙?  &nbs…

    Linux干货 2016-06-23
  • shell中的引号用法

        SHELL引号  在shell里可以通过使用单引号,双引号,反引号(TAB键上方的按键),反斜线来转换某些shell元字符的含义。比如说,我们希望echo命令显示出$本身字符的意义,而不是变量,我们需要使用某些功能来屏蔽$符号本身赋予的特殊含义,使其还原本身字面的意思。 主要讲述四个比较特殊常用的符号。 1.反…

    2017-06-11
  • find命令详解

    写在前面,命令总览: 文件名:-name  -iname   glob     从属关系: -user  -group  -uid  –gid  -nouser  -nogroup 按类型:-type []  ,f,d,l,b,c…

    Linux干货 2016-02-14
  • 第四周作业

    cp、grep、sueradd、chmod、vim命令的一些用法

    Linux干货 2017-12-24
  • Linux发展及简单命令

    一 计算机的组成及其功能 冯·诺依曼提出的计算机体系结构:计算机由控制器、运算器、存储器、输入设备、输出设备五部分组成。 二 Linux的发行版 Linux发行版主要有三个分支:Debian、Slackware、Redhat。 (1)Debian:(以社区的方式运作) Ubuntu:基于Debian开发的开源Linux操作系统,主要针对桌面和服务器; Lin…

    2018-03-02
  • 马哥教育网络班21期+第8周课程练习

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别 集线器(HUB)是在OSI模型的第一层——物理层——连接多台主机、延长网络的设备。其主要功能是将从一个端口接收到的数据包转发给所有端口。中继器(Repeater)是将由电缆传过来的电信号或光信号调整波形和放大再传给另一个电缆的设备,提供多端口服务的中继器称作集线器。二者的主要区别是…

    Linux干货 2016-08-29