首页 > 代码库 > CentOS 系统启动流程

CentOS 系统启动流程

CentOS 系统启动流程



一、Linux系统的组成部分内核+根文件系统

1.内核:

  • 进程管理:进程之间的通信为:IPC(Inter Process Communication)机制,有消息队列、semerphor、shm、socket(跨主机之间的通信)

  • 内存管理;

  • 网络管理;

  • 文件系统;

  • 驱动程序;

  • 安全功能;

2.运行中的系统环境可分为两层:内核空间、用户空间

  • 用户空间:应用程序(表现为进程或线程)

  • 内核空间 :内核代码(系统调用)

3.内核设计流派:

  • 单内核设计:把所有功能集成与同一程序;

       Linux

  • 微内核设计:每种功能使用一个单独的子系统实现;

       Windows,Solaris

4.Linux内核特点:

  • 内核模块化:.ko(kernel object)如:文件系统,硬件驱动,网络协议等

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

5.Linux内核组成部分:

 1)核心文件:/boot/vmlinuz-VERSION-release

      内核官方站点:https://www.kernel.org技术分享

2)ramdisk:辅助的伪根文件系统 ;作用:加载驱动(非必要的)

      CentOS 5: /boot/initrd-VERSION-release.img

      CentOS6,7: /boot/initramfs-VERSION-release.img

3)模块文件:/lib/modules/VERSION-release技术分享




CentOS 系统的启动流程

(注:以下讲解仅适用于PC架构的主机和MBR类型的架构)


Linux系统启动过程大致按照如下步骤进行(简述)

1)加电自检,BIOS启动引导阶段
    在该过程中实现硬件的初始化以及查找启动介质;
    从MBR中装载启动引导管理器(GRUB)并运行该启动引导管理;
2)GRUB启动引导阶段
    装载stage1
    装载stage1.5
    装载stage2
    读取/boot/grub.conf文件并显示启动菜单;
    装载所选的kernel和initrd文件到内存中
3)内核阶段:
    运行内核启动参数;
    解压initrd文件并挂载initd文件系统,装载必须的驱动;
    挂载根文件系统
4)init用户空间初始化阶段:
    启动/sbin/init程序;
    运行rc.sysinit脚本,设置系统环境,启动swap分区,检查和挂载文件系统;
    读取/etc/inittab文件,运行在/et/rc.d/rc<#>.d中定义的不同运行级别的服务初始化脚本;
    打开字符终端1-6号控制台/打开图形显示管理,设置登录

 如图所示:技术分享




一、内核空间详细过程如下:


1.POST:(power on system test)加电自检

  • 负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测。

  • ROM:BIOS(Basic Input and Output System),即基本输入输出系统,它是装载ZA在一个硬件芯片CMOS之上,加电过程就是给CMOS通电,然后启动其上的BIOS程序,BIOS程序会根据CMOS上面的一些配置信息去读取其他硬件设备信息并检测其是否存在并能正常运行,之后进行硬件设备的初始化。

  • CMOS:互补金属氧化物半导体,保存各项参数的设定;

  • ROM+RAM



2.Boot Sequnence

按次序查找引导设备,第一个有引导程序的设备为本次启动设备,即:bootloader

1)bootloader: 引导加载器,引导程序

  • windows: ntloader,仅是启动OS;

  • Linux:

          LILO:LInux LOader

          GRUB: GRand Unified Bootloader

              GRUB 0.X: Grub Legacy,

              GRUB 1.X: Grub2

  • grub功能功能丰富,提供一个菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间RAM中,解压、展开,并把系统控制权移交给内核;


2)bootloader装在MBR中:Master Boot Record(主引导记录)

     512bytes :

      446bytes: bootloader,

           64bytes: 分区表

           2bytes: 55AA(有效标识)

3)GRUB(2各阶段)

          bootloader : 1st stage

          Partitioon :1.5 stage  filesystem driver

          Partitioon :2nd stage  分区文件在/boot/grub上



3.Kernel:加载系统内核,执行系统初始化信息

1)自身初始化

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

      ·加载硬件驱动程序(可能借助于ramdisk加载驱动

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

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

2)ramdisk

    内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问

       ·ramdisk--> ramfs 提高速度(完成对真正根文件系统的驱动加载)

             CentOS 5: initrd, 工具程序:mkinitrd

             CentOS 6: initramfs,工具程序:mkinitrd,dracut


     一旦启动了init,内核就不管了,所有的后续操作都是由init去加载运行用户空间的应用程序来完成各种各样的工作,只有当这些应用程序完成系统调用或者系统发生中断时需要特权操作时,内核才会参与;剩余的其他过程都不在参与,而是由用户空间的程序来完成。



4.启动用户空间的第一个执行程序/sbin/init,完成系统初始化

    在内核、硬件及驱动信息加载完毕后,内核会呼叫用户空间中的第一个执行程序/sbin/init,init程序主要功能是准备软件运行环境,包括系统的主机名称、网络配置、文件系统各式等其他服务的启动管理。而这些所有的操作都是通过init的配置文件来定义。


1)init功能:

  • 设定默认运行级别;

  • 指定系统运行的初始化脚本;

  • 启动指定级别下要启动的服务,并关系需要停止的服务;

  • 定义[ctrl][alt][del]组合键的功能;

  • 初始化字符(mingetty6)终端;

  • 启动图形终端


2)init程序的类型

  • SysV: init, CentOS 5之前

         配置文件:/etc/inittab

  • Upstart: init,CentOS6

         配置文件:/etc/inittab, /etc/init/*.conf

  • Systemd:systemd, CentOS 7

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

3)详见用户空间启动流程


总结:系统初始化流程(内核级别)

    POST --> BootSequence(BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只读) --> /sbin/init(systemd)




二、用户空间启动流程

第一执行程序:/sbin/init

 

1.init配置文件类别:

  • CentOS 5:
       由于centos5采用的是SysV init方式,其特点是启动用户空间的服务程序,通常通过脚本进行,有依赖关系的服务将被串行启动;这也就导致了centos5的系统启动过程非常缓慢。其配置文件为:/etc/inittab;
       

  • CentOS 6:
       采用Upstart的方式,其特点是守护进程间的通信依赖于D-Bus进行,因此,可基本实现类似并行启动;配置文件:?etc/inittab,/etc/init/*.conf
       

  • CentOS 7:
       采用Systemd方式,其特点是服务只有在第一次被访问时才会真正启动起来;因此centos 7系统的启动过程会非常之快;其配置文件为:/usr/lib/systemd/*.


2.运行级别:为系统运行或维护等目的而设定;0-6:7个级别

      0:关机,shutdown
      1:单用户模式(single user),root用户,无需认证,维护模式;
      2: 多用户模式(multi user),会启动网络功能,但不会启动NFS,维护模式;
      3:多用户模式(multi user),完全功能模式;文本界面;
      4:预留级别;目前无特别使用目的,但习惯以同3级别功能使用;
      5:多用户模式(multi user),完全功能模式;图形界面
      6:重启,reboot
 默认级别:3, 5
 切换级别:init #
 查看级别:runlevel; who -r

[root@centos7 ~]# runlevel
3 5
[root@centos7 ~]# init 3
PolicyKit daemon disconnected from the bus.
We are no longer a registered authentication agent.
[root@centos7 ~]# runlevel
5 3
[root@centos7 ~]# who -r
         run-level 3  2016-09-12 19:59                   last=5


3.init 的处理流程

     1)init读取其初始化文件:/etc/inittab

     2)初始运行级别(RUN LEVEL),默认的级别为3;

     3)使用/etc/rc.d/rc.sysinit进行系统初始化;

     4)对应运行级别的脚本目录,由于采用的是3级别,因此只进行                                      l3:wite:/etc/rc.d/rc.3

     5)配置好[ctrl][alt][del]组合的功能;

     6)配置不断电系统pf、pr两种机制;

     7)启动mingetty 6个终端

     8)如果是5级别,则会以/etc/Xll/启动图形化界面


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

    (1) 设置主机名;

    (2) 设置欢迎信息;

    (3) 激活udev和selinux;

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

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

    (6) 设置系统时钟;

    (7) 激活swap设备;

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

    (9) 激活lvm及软raid设备;

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

    (11) 清理操作。


5.CentOS 5 的配置文件/etc/inittab

1)每一行定义一种action以及与之对应的process
  id:runlevel:action:process
       id:一个任务的标识符;
       runlevels:在哪些级别启动此任务;#,###,也可以为空,表示所有级别
       action:在什么条件下启动此任务;
       process:任务;
   action:
       wait: 等待切换至此级别时运行一次;
       respawn:一但此任务终止,就重新启动之
       initdefault:设定默认运行级别;process省略
       sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit
       ca::ctrlaltdel:/sbin/shutdown -t3 -r now
2)示例启动如下:  
  id:3:initdefault:
       默认的运行级别为3
  si::sysinit:/etc/rc.d/rc.sysinit
       无论运行哪个级别都会运行此脚本,系统初始化
  l0:0:wait:/etc/rc.d/rc 0
   ...
 l6:0:wait:/etc/rc.d/rc 6


6.启动或关闭所对应的服务

意味着去启动或关闭/etc/rc.d/rc3.d/目录下的服务脚本所控制的服务
     K*:要停止的服务;K##,优先级,数字越小越优先关闭,依赖的服务先关闭 ,而后关闭被依赖的
    S*要启动的服务; S##,优先级,数字越小越是优先启动,被依赖的服务先启动,而依赖的服务后启动    
    rc脚本:接受一个运行级别数字为参数,如下:

[root@CentOS6 ~]# ls /etc/rc.d/
init.d  rc  rc0.d  rc1.d  rc2.d  rc3.d  rc4.d  rc5.d  rc6.d  rc.local  rc.sysinit
[root@CentOS6 ~]# ls /etc/rc.d/rc3.d/
K01smartd        K30spice-vdagentd  K73winbind         K84ospfd           K89rdisc         S08iptables     S13rpcbind           S25netfs      S55sshd       S99local
K05wdaemon       K50dnsmasq         K74ntpd            K84ripd            K92pppoe-server  S10network      S15mdmonitor         S26acpid      S80postfix
K10psacct        K50snmpd           K75ntpdate         K84ripngd          K95rdma          S11auditd       S22messagebus        S26haldaemon  S82abrt-ccpp
K10saslauthd     K50snmptrapd       K75quota_nld       K84wpa_supplicant  K99rngd          S11portreserve  S24nfslock           S26udev-post  S82abrtd
K15htcacheclean  K60nfs             K84bgpd            K85zebra           S01sysstat       S12rsyslog      S24rpcgssd           S28autofs     S90crond
K15httpd         K61nfs-rdma        K84NetworkManager  K87restorecond     S02lvm2-monitor  S13cpuspeed     S25blk-availability  S50bluetooth  S95atd
K15svnserve      K69rpcsvcgssd      K84ospf6d          K89netconsole      S08ip6tables     S13irqbalance   S25cups              S50kdump      S99firstboot
脚本框架:
 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}


注意:

     正常级别下,最后启动一个服务S99local没有链接至/etc/init.d下某脚本,而是指向了/etc/rc.d/rc.local(/etc/rc.local)脚本;因此,不便或不需写为服务脚本,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中。


7.启动6个终端及调用login程序

 1:2345:respawn:/usr/sbin/mingettytty1
2:2345:respawn:/usr/sbin/mingettytty2
  ...
6:2345:respawn:/usr/sbin/mingettytty6

mingetty会自动调用login程序
   x:5:respawn:/etc/X11/prefdm -nodaemon


===========================================================================================

chkconfig 命令

   SysV的服务脚本放置于/etc/rc.d/init.d(/etc/init.d)

 管控/etc/init.d/每个服务脚本在各级别下的启动或关闭状态:

查看:
   chkconfig [--list] [name]
添加:
   chkconfig  --add name
       能被添加的脚本定义格式:
            #!/bin/bash
            #LLLL 表示初始在哪个级别下启动,-表示都不启动
            # chkconfig: LLLL nnnn
删除:
   chkconfig --del name
修改指定的链接类型
    chkconfig [--level levels] name <on|off|reset>
         --level LLLL: 指定要设置的级别;省略时表示2345

[root@CentOS6 ~]# chkconfig --list
NetworkManager 	0:off	1:off	2:off	3:off	4:off	5:off	6:off
abrt-ccpp      	0:off	1:off	2:off	3:on	4:off	5:on	6:off
abrtd          	0:off	1:off	2:off	3:on	4:off	5:on	6:off
acpid          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
atd            	0:off	1:off	2:off	3:on	4:on	5:on	6:off
auditd         	0:off	1:off	2:on	3:on	4:on	5:on	6:off
autofs         	0:off	1:off	2:off	3:on	4:on	5:on	6:off
bgpd           	0:off	1:off	2:off	3:off	4:off	5:off	6:off
blk-availability	0:off	1:on	2:on	3:on	4:on	5:on	6:off
[root@CentOS6 ~]# chkconfig --list NetworkManager
NetworkManager 	0:off	1:off	2:off	3:off	4:off	5:off	6:off
[root@CentOS6 ~]# chkconfig --level 35 NetworkManager on
[root@CentOS6 ~]# chkconfig --list NetworkManager
NetworkManager 	0:off	1:off	2:off	3:on	4:off	5:on	6:off
[root@CentOS6 ~]# chkconfig --level 35 NetworkManager off
[root@CentOS6 ~]# chkconfig NetworkManager on
[root@CentOS6 ~]# chkconfig --list NetworkManager
NetworkManager 	0:off	1:off	2:on	3:on	4:on	5:on	6:off




总结:CentOS 5用户空间的启动流程:/sbin/init(/etc/inittab)

     /sbin/init--> (/etc/inittab) --> 设置默认运行级别--> 运行系统初始脚本、完成系统初始化--> (关闭对应下需要关闭的服务)启动需要启动服务--> 设置登录终端



CentOS 6

  • init程序为: upstart, 但依然为/sbin/init;

  • 其配置文件:/etc/inittab(仅用于定义默认级别), /etc/init/*.conf;

  • 配置文件的语法遵循upstart配置文件语法格式,和CentOS5不同

文件如下:

    /etc/init/*.conf  rcS.conf,rc.conf,tty.conf

[root@CentOS6 ~]# cd /etc/init
[root@CentOS6 init]# ls
ck-log-system-restart.conf  init-system-dbus.conf   quit-plymouth.conf  rcS-sulogin.conf                 serial.conf
ck-log-system-start.conf    kexec-disable.conf      rc.conf             readahead-collector.conf         splash-manager.conf
ck-log-system-stop.conf     plymouth-shutdown.conf  rcS.conf            readahead.conf                   start-ttys.conf
control-alt-delete.conf     prefdm.conf             rcS-emergency.conf  readahead-disable-services.conf  tty.conf


CentOS 6启动流程

    POST --> Boot Sequence(BIOS) --> Boot Loader --> Kernel(ramdisk) --> rootfs--> switchroot--> /sbin/init-->(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别--> 系统初始化脚本rc.sysinit--> 关闭或启动对应级别的服务--> 启动终端



CentOS 7

  • init程序:systemd

  • 配置文件:/usr/lib/systemd/system/*,/etc/systemd/system/*

  • 完全兼容SysV脚本机制;因此,service命令依然可用;不过,建议使用systemctl来控制服务

  • # systemctl {start|stop|status|resport} name.[service]

    文件如下:

[root@centos7 ~]# ls /usr/lib/systemd/system
abrt-ccpp.service                        gdm.service                         ntpdate.service                    sys-fs-fuse-connections.mount
abrtd.service                            geoclue.service                     oddjobd.service                    sysinit.target
abrt-oops.service                        getty@.service                      paths.target                       sysinit.target.wants
abrt-pstoreoops.service                  getty.target                        plymouth-halt.service              sys-kernel-config.mount
abrt-vmcore.service                      graphical.target                    plymouth-kexec.service             sys-kernel-debug.mount
abrt-xorg.service                        graphical.target.wants              plymouth-poweroff.service          syslog.socket
accounts-daemon.service                  gssproxy.service                    plymouth-quit.service              syslog.target.wants
alsa-restore.service                     halt-local.service                  plymouth-quit-wait.service         sysstat.service
alsa-state.service                       halt.target                         plymouth-read-write.service        systemd-ask-password-console.path
alsa-store.service                       halt.target.wants                   plymouth-reboot.service            systemd-ask-password-console.service
anaconda-direct.service                  hibernate.target                    plymouth-start.service             systemd-ask-password-plymouth.path
anaconda-nm-config.service               htcacheclean.service                plymouth-switch-root.service       systemd-ask-password-plymouth.service
anaconda-noshell.service                 httpd.service                       polkit.service                     systemd-ask-password-wall.path

 



如上:

  CentOS系统的启动流程包括:内核空间的启动流程户空间的启动流程 

如下图所示:

技术分享

CentOS 系统启动流程