CentOS系统启动流程


CentOS的启动流程总体顺序如下(以CentOS 6为例):


POST --> BootSequence(BIOS) --> Bootloader --> kernel [-->ramfs] -->rootfs(ro) --> /sbin/init --> 设定默认运行级别 --> 系统初始化 --> 可以并行执行ctrl+alt+del热键功能定义,系统服务的开启和关闭,电源管理,dbus管理等 --> 登录提示符


第一步:POST加电自检


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


  第二步:Boot Sequence(选择启动设备以加载MBR)


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


  第三步:加载bootloader(MBR)


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


    grub是bootloader中的一种,就grub来说,为了打破在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目录之下,主要用于加载内核文件(vmlinuz-VERSION-RELEASE)以及ramdisk这个临时根文件系统(initrd-VERSION-RELEASE.img或initramfs-VERSION-RELEASE.img)。


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


  第四步:Kernel自身初始化


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


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

        bootloader将系统控制权移交给内核就好比如后朝推翻前朝,统治者(内核)当权之后,首先要检查一下有哪些是前朝所留下的,例如有哪些领土、人力、财力、兵力可用等等。


    (2)加载硬件驱动程序,即加载真正的根文件系统所在设备的驱动程序(有可能会借助于ramdisk加载驱动);

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

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

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

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


  第五步:核心执行init 程序,并获取默认的运行信息


   init可以理解成是内核派来管理用户空间的使者,就好像天使代表上帝来访问人间一样。init这个初始化程序会根据其配置文件执行一系列操作。虽然CentOS 5、CentOS 6以及CentOS 7的init配置 文件各不相同,但总体的启动流程是不变的。


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


   对于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/*;


 运行级别

   运行级别是为了系统的运行和维护等目的而设定的一种机制,对于CentOS 5/6来讲,一共有7种运行级别,即0-6,它们的意义如下:

    0:关机模式,shutdown;

    1:单用户模式(single user):不需要通过认证,登录进去之后为root用户身份,是维护模式;

    2:多用户模式(multi user):会启动网络功能,但不会启动NFS,是维护模式;

    3:多用户模式(multi user):为完全功能模式,提供文本界面;

    4:预留级别,目前无特别使用目的,但习惯上以同3级别功能来使用;

    5:多用户模式(multi user):为完全功能模式,提供图形界面;

    6:重启模式,reboot;


  第六步:init 程序执行/etc/rc.d/rc.sysinit 文件    


     在init执行的第二步执行系统初始化过程。


/etc/rc.d/rc.sysinit: 系统初始化脚本

(1) 设置主机名 (读取/etc/sysconfig/network文件中的HOSTNAME进行)

(2) 设置欢迎信息

(3) 激活udev 和selinux

(4) 挂载/etc/fstab 文件中定义的文件系统

(5) 检测根文件系统,并以读写方式重新挂载根文件系统

只读模式挂载,最后才改成可读可写

(6) 设置系统时钟

(7) 激活swap 设备

(8) 根据/etc/sysctl.conf 文件设置内核参数

(9) 激活lvm 及software raid 设备

(10) 加载额外设备的驱动程序

(11) 清理操作


  第七步:启动核心的外挂模块


  第八步:init 执行运行的各个批处理文件(scripts)

在系统/etc/rc.d/rc.sysinit初始化完成系统之后,此时系统就已经可以正常工作了,只是还缺少启动时所需要的各项服务,这样主机才能提供一些我们需要的功能,如网络服务、dhcp服务等功能这里通过inittab里面提到的l3:3:wait:/etc/rc.d/rc 3配置了,而这里其实是通过/etc/rc.d/rc3.d/下所有链接文件来决定如何启动或关闭服务;所有以S开头的都被传递start参数启动,所有以K开头的,都被传递stop参数以停止。


  而/etc/rc.d/rc3.d/下的所有链接文件都是在/etc/init下面的所有脚本,而这些脚本都必须至少接受四个最基本的参数,{start|stop|status|restart}


  第九步:init 执行/etc/rc.d/rc.local


注意:正常级别下,最后启动一个服务S99local 没有链接至/etc/rc.d/init.d 一个服务脚本,而是指向/etc/rc.d/rc.local 脚本

不便或不需写为服务脚本放置于/etc/rc.d/init.d/ 目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local 文件中

/etc/rc.d/rc.local 在指定运行级别脚本后运行

可以根据情况,进行自定义修改


  第十步:执行/bin/login 程序,等待用户登录


  第十一步:登录之后开始以Shell控制主机