CentOS 系统启动流程

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

概述:


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

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

内核的功能:

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

  • 内存管理;

  • 网络管理;

  • 文件系统;

  • 驱动程序;

  • 安全功能;

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

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

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

内核的设计流派:

单内核设计:

  • 把所有功能集成在同一程序;Linux

微内核设计:

  • 每种功能使用一个单独的子系统实现:Windowns

Linux内核的特点

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

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

Linux内核的组成部分:

核心文件:

  • /boot/vmlinuz-VERSION-release

  • 内核官方站点:https://www.kernel.org

ramdisk:辅助的伪根文件系统 

 作用:加载驱动(非必要的):

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

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

模块文件:

  • /lib/modules/VERSION-release

演示:

[root@centos7 ~]# ll /boot
总用量 107024
-rw-r--r--. 1 root root   126426 11月 20 2015 config-3.10.0-327.el7.x86_64
drwxr-xr-x. 2 root root       26 11月  6 18:35 grub
drwx------. 6 root root      104 11月  6 20:01 grub2
-rw-r--r--. 1 root root 57647694 11月  6 19:55 initramfs-0-rescue-1f994a0be331417fbd2b30aef742752e.img
-rw-r--r--. 1 root root 28088280 11月  6 20:01 initramfs-3.10.0-327.el7.x86_64.img  # ramdisk 文件,加载驱动
-rw-r--r--. 1 root root 10189916 11月  6 19:46 initrd-plymouth.img
-rw-r--r--. 1 root root   252612 11月 20 2015 symvers-3.10.0-327.el7.x86_64.gz
-rw-------. 1 root root  2963044 11月 20 2015 System.map-3.10.0-327.el7.x86_64
-rwxr-xr-x. 1 root root  5156528 11月  6 19:56 vmlinuz-0-rescue-1f994a0be331417fbd2b30aef742752e
-rwxr-xr-x. 1 root root  5156528 11月 20 2015 vmlinuz-3.10.0-327.el7.x86_64   # 核心文件

[root@centos7 ~]# ls /lib/modules/3.10.0-327.el7.x86_64/kernel/
arch  crypto  drivers  fs  kernel  lib  mm  net  sound

CentOS系统启动流程概述

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

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

CentOS 系统启动流程_第1张图片

附图:

CentOS 系统启动流程_第2张图片

内核空间详细启动过程如下

 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

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

windows: 

  • ntloader,仅是启动OS;

Linux的引导加载器:

  • LILO:LInux LOader (早期)

  • GRUB:GRand Unified Bootloader  (现在)

         GRUB 0.X(较早系列版本):Grub Legacy,

         GRUB 1.X(现在使用版本):Grub2

grub功能

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

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

   512bytes :

  • 446bytes:bootloader,

  • 64bytes:分区表

  • 2bytes:55AA(有效标识)

GRUB(2个阶段)

  • bootloader : 1st stage

  • Partitioon :1.5 stage  filesystem driver

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

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

自身初始化:

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

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

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

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

ramdisk:

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

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

  • CentOS 5:initrd, 创建工具程序:mkinitrd

  • CentOS 6:initramfs,创建工具程序:mkinitrd,dracut

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

 


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

作用:

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

init功能:

  • 设定默认运行级别;

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

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

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

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

  • 启动图形终端;

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


总结:

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

  • 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:系统初始化脚本

CentOS 系统启动流程_第3张图片

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

每一行定义一种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

示例:

     id:3:initdefault:默认的运行级别为3

     si::sysinit:/etc/rc.d/rc.sysinit :无论运行哪个级别都会运行此脚本,系统初始化

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

     l1:1:wait:/etc/rc.d/rc 1

     ........

     l6:6:wait:/etc/rc.d/rc 6  表示级别切换,开机要启动的服务等

演示:

centos 6 兼容 centos 5
[root@CentOS6 ~]# cat /etc/inittab  
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
id:3:initdefault:   # 默认运行级别为 3

 6.rc脚本及如何启动或关闭所对应的服务

l0:0:wait:/etc/rc.d/rc 3  意味着去启动或关闭/etc/rc.d/rc3.d/目录下的服务脚本所控制的服务;

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

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

rc脚本:

  • 接受一个运行级别数字为参数,如下:

CentOS 系统启动流程_第4张图片


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}

注意:

  • 正常级别下,最后启动一个服务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

 8.chkconfig 命令

chkconfig命令:

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

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

用法:

查看:

  • chkconfig [--list] [name]

添加:

  • chkconfig  --add name

  • 能被添加的脚本定义格式:

 #!/bin/bash
 #
 #chkconfig:LLL NN NN  表示初始在哪个级别下启动,-表示都不启动
 #describtion

删除:

  • chkconfig --del name

修改指定的链接类型

  • chkconfig [--level levels] name

        --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

[root@CentOS6 ~]# chkconfig NetworkManager off
[root@CentOS6 ~]# chkconfig --list NetworkManager
NetworkManager 	0:off	1:off	2:off	3:off	4:off	5:off	6:off

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

总结:

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

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



CentOS 6 和CentOS 7 用户空间的启动流程:

CentOS 6

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

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

.conf 配置文件的语法遵循upstart配置文件语法格式,和CentOS 5不同,文件如下:

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

启动流程

  • 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]

centos 6 配置文件

[root@CentOS6 ~]# ls /etc/init
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

centos7 配置文件

[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                        [email protected]                      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 系统启动流程_第5张图片

参考启动流程图(二)


CentOS 系统启动流程_第6张图片