CentOS6系统启动流程分析

Linux系统组成

       从动态视角看:由内核+根文件系统组成

       从静态视角看:由磁盘分区及相关文件组成

内核设计流派

       单内核:所有内核功能集中于同一程序;

       微内核:每种功能使用一个单独的子系统实现;内核中某一模块或功能的破坏不会影响其他功能的正常运行。

linux内核特点

       支持模块化:模块文件.ko结尾(kernel object)

       支持模块运行时动态装载或卸载:

linux内核组成部分

    核心文件:/boot/vmlinuz-Version-release

    模块文件:/lib/modules/Version-Release

内核启动之后,读取rootfs文件系统生成的init程序,由init管理系统。之后内核退居幕后,只负责特权级操作。

ramdisk:把内存中的某段空间当作磁盘来使用。"伪根文件系统"

       CentOS5:/boot/initrd-Version-release.img

       CentOS6、7:/boot/initramfs-Version-release.img

CentOS启动流程:

CentOS6系统启动流程分析

一、内核空间

1、POST加电自检:对各硬件进行检测,确保计算机能正常运行

     CPU访问ROM加载自检程序

2、BOOT Sequence:选择启动次序,加载Boot Loader。

     按次序查找各引导设备,第一个有引导程序的设备即为本次启动要用到的设备。

3、Boot Loader: 加载Grub。

       由于存放Bootloader的磁盘空间大小仅为446字节,而grub的大小明显超出446字节,因此,将grub分为三个阶段。Bootloader仅存放grub的第一阶段,用于引导。

GRUB功能:提供菜单,运行用户选择要启动的系统或不同版本,把用户选定的内核装载到RAM中,解压、展开,而后把系统的控制权移交给内核。

 GRUB三阶段:

        stage1:BootLoader(位于MBR)。

        stage1.5:存放文件系统驱动信息,位于MBR之后,用于引导stage1找到stage2,从而能够访问stage2所在的分区。

        stage2:位于/boot/grub目录下。

                     stage2的功用:

                     1)提供菜单、并提供交互式节后

                            摁e:进入编辑模式,用于编辑菜单

                            摁c:进入命令模式,交互式接口

                     2)加载用户选择的内核或操作系统

                            运行传递参数给内核

                            可隐藏菜单

                     3)位菜单提供保护机制

                            为编辑菜单进行认证

                            为启用内核或操作系统进行认证

GRUB分类:

       Windows:ntloader

       Linux:

              LILO:Linux Loader。缺陷:不能加载1024之后的柱面,因此被grub取代。

             GRUB:GRand Uniform Bootloader

                  CentOS5、6 :Grub 0.x 版本,也称之为grub legacy

                  CentOS7:Grub 1.x版本,也称之为Grub2

GRUB存放于/boot中,配置文件为/boot/grub/grub.conf,在/etc/目录下有一名为grub.conf的连接文件。

4、kernel阶段

       1)自身初始化

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

       3)加载硬件驱动程序(可能借助ramdisk来加载)

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

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

              init程序的类型:

               CentOS5及之前:SysV

配置文件:/etc/inittab

               CentOS6:upstart

配置文件:/etc/inittab(为了兼容以前的版本),/etc/init/*.conf

               CentOS7:Systemd

配置文件:/usr/lib/systemd/system;/etc/systemd/system

二、用户空间

5、/etc/inittab配置文件:

 每行定义一种action以及与之相对应的process,配置释义:

       id:runlevels:action:process

              id:一个任务的标识符

      runleves:在哪些级别启动此任务,#,###;也可以为空,表示所有级别

                    action:在什么条件下启动此任务

      process:任务

             action

                   wait:等待切换至此任务所在的级别时执行一次。

      respawn:一旦此任务终止,就自动重启之。

      initdefault:设置默认允许级别,此时,process省略掉

       id:3:initdefault                                #设置默认级别

       si:sysinit:/etc/rc.d/rc.sysinit           #设定系统初始化方式,此处一般为指定的/etc/rc.d/rc.sysinit脚本

       tty1:2345:respawn:/usr/bin/mingetty tty1

       tty2:2345:respawn:/usr/bin/mingetty tty2

       ….

       tty6:2345:respawn:/usr/bin/mingetty tty6

              在运行级别为2345时,会默认开启6个虚拟终端

              1)mingetty会调用login程序

              2)getty等程序也能打开虚拟终端。

       tty7:5:respawn:/etc/x11/  启动图形界面

       l0:0:wait:/etc/rc.d/rc 0     

              rc脚本:接受一个运行级别数字为参数。当系统启动时读取到默认运行级别、或运行级别发生变化时,/etc/rc.d/rc脚本将传递运行级别为参数,在/etc/rc.d/rc$runlevel.d/目录下进行操作:其将先kill掉以K开头的服务或脚本,然后启动运行以S开头的服务或脚本。这些脚本为/etc/rc.d/init.d/或/etc/init.d目录下某脚本的连接文件(Symbolinc)

              例:l3:3:wait:/etc/rc.d/rc 3   意味着去启动或关闭/etc/rc.d/rc3.d/目录下的脚本所控制范围。

                     K##*:要停止的服务;##表示优先级,数字越小,越优先关闭;依赖的服务先关闭,而后关闭被依赖。服务a的运行建立在服务b运行的基础上,那么要关掉服务b,得先关掉服务a;意味着服务a的关闭优先级要高于服务b(即a的关闭优先级数字小b的)

                     S##*:要启动的服务;##表示优先级,数字越小,越优先启动;被依赖的服务先启动,而依赖的服务后启动。仍以服务a的运行建立在服务b的基础上为例,要运行服务a,则服务b得先启动,意味着服务b的启动优先级要高级服务a(即b的启动优先级数字小于a的)

       rc脚本框架:

              for srv in /etc/rc.d/rc#.d/K*;do

                     $srv stop

              done

 

              for srv in /etc/rc.d/rc#.d/S*;do

                     $srv start

              done

       /etc/init.d/*(/etc/rc.d/init.d/*)脚本执行方式

      /etc/init.d/srv_script {start|stop|restart|status}

            service srv_script {start|stop|restart|status}

       chkconfig命令:管控/etc/init.d/下的每个脚本在各运行级别下的启动或关闭状态。

设置某服务在某个或某几个运行级别下是自动启动还是关闭。

       将服务增加为自启动服务的过程

              1)创建建自定义服务脚本

              2)初始化自定义服务:chkconfig –add srv_script

              3)设置启动|关闭级别:chkconfig  –level ### srv_script on|off,如果chkconfig设置时不指定运行级别,默认采用脚本中设置的运行级别。

              4)启动或关闭服务:chkconfig srv_script on|off

              5)查看服务运行信息:chkconfig –list srv_script

              注:能被管控的服务脚本必须具备以下的特性。

CentOS6系统启动流程分析

   

#!/bin/bash
#
# chkconfig: runlevel start_nn stop_nn 设置运行级别、服务启动优先级、范围关闭优先级。
#自定义的脚本服务,若不被其他服务依赖,则其启动应该尽量延后,等待系统其他服务启动,关闭时优先关闭
#            
# description: some comments        脚本注释

       注:如果将运行级别设置为‘-’,则在初始化时在所有级别都将关闭。

附:testsrv脚本内容

#!/bin/bash
#
# testsrv               start|stop service testsrv
#
#     chkconfig: 2345 90 20
#     description: for test chkconfig how to work
 
prog=`basename $0`
if [ $# -lt 1 ];then
       echo "Usage:$prog {sart|stop|restart|status}"
       exit 1
fi
 
case $1 in
       start)
       echo "startting $prog"
       ;;
       stop)
       echo "stopped $prog"
       ;;
       restart)
       echo "restart $prog finished"
       ;;
       status)
              if pidof $prog &> /dev/null;then
                     echo "$prog is running"
              else
                     echo "$prog was stopped"
              fi
       ;;
       *)
       echo "Usage:$prog {sart|stop|restart|status}"
       exit 2
       ;;
esac

注:正常级别下,最后启动的一个服务S99local服务链接至/etc/rc.d/rc.local(/etc/rc.local)文件。不便写成脚本的指令可以写入到/etc/rc.d/rc.local文件中。

6、系统初始化脚本文件:/etc/rc.d/rc.sysinit

       (1)设置主机名

       (2)设置欢迎信息

       (3)激活udev设备和selinux

       (4)挂载/etc/fstab文件中定义的所有文件系统(包含swap设备)

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

       (6)设置系统时钟

       (7)根据/etc/sysctl.conf文件的设定,来设置内核参数 

       (8)激活LVM及软raid设备

       (9)激活swap设备

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

       (11)清理操作

 

总结:

      POST—> Boot SequenceBIOS—>Boot loaderMBR—>kernel—>rootfs—>/sbin/init —>设置默认运行级别运行系统初始化脚本,完成系统初始化—>关闭对应级别下需要停止的服务;启动对应级别下需要开启的服务—>设置登录终端[—>启动图形终端(由登录终端决定)]

 

补充:

Centos6上的运行级别:

       0:断电关机(halt)

       1:单用户模式(Single user),无需认证即可登陆root用户

       2:多用户模式(Multiuser),但不提供NFS服务

       3:多用户模式,完全功能模式,文本界面

       4:预留级别(Full multiuser),未定义;目前若使用4级别登录,同3级别

       5:多用户模式(X11),图形界面

       6:重启系统(reboot)

注意:级别0、6不能设为默认级别,否则系统不能正常启动。

如何查看当前运行级别:

       1、runlevel

       2、who -r

       3、Centos7:systemctl get-default

如何切换当前运行级别:

       init N:N为级别数字

注:CentOS7不再有运行级别概念,在此不做讨论

原创文章,作者:M20-1钟明波,如若转载,请注明出处:http://www.178linux.com/44776