CentOS系统启动流程

1 CentOS系统

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

  • 内核:进程管理、内存管理、网络协议栈、文件系统、驱动程序、安全功能
  • IPC:Inter Process Communication
    • 消息队列、semerphor、shm
    • socket

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

  • 用户空间:应用程序 ( 进程或线程 )
  • 内核空间:内核代码 ( 系统调用 )

1.3 内核设计流派

1.3.1 单内核设计:把所有功能集中于同一个程序

  • Linux

1.3.2 微内核设计:每种功能使用一个单独的子系统实现 ( 模块 )

  • Windows,Solaris

1.3.4 Linux内核特点:

  • 支持模块化:.ko(kernel object)
  • 支持模块运行时动态装载或卸载
  • 组成部分:
    • 核心文件:/boot/vmlinuz-VERSION-release

      • vmlinuz --> z表示压缩的意思
    • ramdisk:

      • CentOS5:/boot/initrd-VERSION-release.img
      • CentOS6,7:/boot/initramfs-VERSION-release.img
    • 模块文件:/lib/modules/VERSION-release

2 CentOS系统的启动流程

2.1 POST:加电自检

  • ROM :CMOS
    • BIOS:Basic Input and Output System
  • ROM+RAM

2.2 Boot Sequence

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

2.3 bootloader:引导加载器,程序

  • Windows :ntloader

  • Linux:

    • LILO:LInux LOader
    • GRUB:Grand Uniform Bootloader
      • GRUB 0.x:Grub Legace
      • GRUB 1.x:Grub2
  • 功能:提供一个菜单,允许用户选择要启动的系统或不同的内核版本,把用户选定的内核装载到RAM中的特定空间中,解压、展开,而后把系统控制权转交给内核

  • MBR:Master Boot Record

    • 512bytes:
      • 446bytes:bootloader
      • 64bytes:磁盘分区
      • 2bytes:55AA(表示此磁盘为主引导盘或系统盘)
  • GRUB:

    • bootloader:1st stage (在mbr中)
    • Partition:filesystem driver 1.5 stage (mbr之后的扇区)
    • Partition:/boot/grub 2nd stage (在/boot/grub中)

2.3 Kernel

  • 自身初始化:

    • 探测可识别到的所有硬件设备
    • 加载硬件驱动程序:( 有可能会借助于randisk加载驱动 )
    • 以只读方式挂载跟文件系统
    • 运行用户空间的第一个应用程序:/sbin/init
  • init程序的类型

    • CentOS5:SysV init
      • 配置文件:/etc/inittab
    • CentOS6:Upstart
      • 配置文件: /etc/inittab
      • /etc/init/*.conf
    • CentOS7:Systemd
      • 配置文件: /usr/lib/systemd/system
      • /etc/systemd/systemd
  • ramdisk:

    • Linux内核的特性之一:使用缓存和缓存来加速对磁盘文件的访问
      • ramdisk --> ramfs
      • CentOS5:initrd
        • 工具程序:mkinitrd
      • CentOS6,7:initramfs
        • 工具程序:dracut,mkinitrd

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

  • POST --> Boot Sequence(BIOS) --> BootLoader(MBR) --> Kernel(ramdisk) --> rootfs(readonly) --> /sbin/init

3 CentOS 5 6 7 系统/sbin/init

3.1 CentOS5:SysV init

3.1.1 运行级别:为了系统的运行或维护等目的而设定的机制

  • 0-6:7个级别
0:关机 shutdown
1:单用户模式(single user),只能root用户登录,无须认证(可用与忘记root密码);维护模式
2:多用户模式(multi user),会启动网络功能,但不会启动NFS;维护模式
3:多用户模式(multi user),完全功能,文本界面
4:预留级别;目前无特别使用目的,但习惯以3级别功能使用
5:多用户模式(multi user),完全功能模式,图像界面
6:重启,reboot
  • 默认级别:3 ,5

  • 级别切换:# init NUM

  • 级别查看:

who -r
runlevel

3.1.2 配置文件:/etc/inittab

  • 每行定义一种action以及与之对应的process
id:runlevels:action:process

    id:一个任务的标识符
    runlevels:在哪些级别启动此任务;#,###,也可以为空:表示所有级别
    action:在什么条件下启动此任务
    process:任务
    action:
        wait:等待切换至此任务所在的级别时执行一次
        respawn:一旦此任务终止,就自动重新启动之
        initdefault:设定默认运行级别;此时,process省略
        sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit脚本
  • 例如:
id:3:initdefault
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

- 意味着去启动或关闭/etc/rc.d/rc3.d/目录下的服务脚本所控制服务
    K*:要停止的服务;K##*,表示优先级,数字越小,越是优先关闭,依赖的服务先关闭,而后关闭被依赖的服务
    s*:要启动的服务,S##*,表示优先级,数字越小,越优先开启,被依赖的服务先启动,而依赖的服务后启动

- rc脚本接收一个运行级别数字为参数

1.脚本框架:

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

2./etc/init.d/*(/etc/rc.d/init.d/*)脚本执行方式:
# /etc/init.d/SRV_SCRIPT {start|stop|restart|status}
# service SRV_SCRIPT {start|stop|restart|status}

3.chkconfig命令:管控/etc/init.d/每个服务在各级别下的启动或关闭状态
    查看:chkconfig --list [name]

    添加:chkconfig --add name

        能被添加的服务的脚本定义格式之一:
        
        #!/bin/bash
        #
        #chkconfig: LLL(默认在那些级别启动) NN(启动优先级)  NN(关闭优先级)
        #description:
        #LLLL :表示初始在哪个级别下启动,- 表示所有级别都不启动

    删除:chkconfig --del name

    修改指定的服务运行级别:
        chkconfig [--level LEVELS] name <on|off|reset>
            --level LEVELS:指定要控制的级别;默认为2345
            默认: chkconfig name on
            修改了服务优先级当前不会立即生效,下一次启动生效
  • 服务脚本示例
[root@CentOS6 ~]# cat /etc/init.d/testsrv.sh 
#!/bin/bash
#chkconfig: 35 88 22
#description:testsrv script
case $1 in
start)
        echo testsrv start
;;
stop)
        echo testsrv stop
;;
status)
        echo testsrv status
;;
*)
        echo 'testsrv start | stop | status'
;;
esac
[root@CentOS6 ~]# chkconfig --add /etc/rc.d/init.d/testsrv      //添加服务脚本开机启动
[root@CentOS6 ~]# chkconfig --list          //查看所有服务脚本
[root@CentOS6 ~]# chkconfig --level 35 testsrv off     //在35模式下关闭服务脚本的开机启动
[root@CentOS6 ~]# chkconfig --level 345 testsrv on      //在345模式下开启服务脚本的开机启动
[root@CentOS6 ~]# chkconfig --del testsrv         //删除服务脚本的开机启动

注意:正常级别下,最后启动的一个服务S99local没有链接至/etc/init.d下的某个文件,而是链接至了/etc/rc.d/rc.local(/etc/rc.local)脚本;因此,不便或不需写为服务脚本的程序期望能开启自动运行时,直接放置于此脚本文件中即可

tty1:2345:respawn:/usr/sbin/mingetty tty1
......
tty6:2345:respawn:/usr/sbin/mingetty tty6

(1)mingetty会调用login程序

(2)打开虚拟终端的程序除了mingetty之外,还有诸如getty等

x:5:respawn:/etc/X11/prefdm -nodaemon
启动图像终端X11,5级别特有

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

(1)设置主机名
(2)设置欢迎信息
(3)激活udev和selinux
(4)挂载/etc/fstab文件中定义的所有文件系统
(5)检测根文件系统,并以读写方式重新挂载根文件系统
(6)设置系统时钟
(7)根据/etc/sysctl.conf文件来设置内核参数
(8)激活lvm及软raid设备
(9)激活swap设备
(10)加载额外设备的驱动程序

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

设置默认运行级别 --> 运行系统初始化脚本,完成系统初始化 --> 关闭对应级别下需要停止的服务,启动对应级别下要启动的服务 --> 设置登录终端 [ --> 启动图像终端 ]

3.2 CentOS 6:Upstart

3.2.1 init程序:Upstart,但依然被封装成了/sbin/init,

  • 其配置文件:/etc/init/*.conf ,/etc/inittab (仅用于定义默认运行级别)
注意:*.conf为upstart风格的配置文件                
    重要的文件                
    /etc/init/control-alt-delete.conf:快捷键重启的脚本,建议注释掉,防止误操作
    /etc/init/tty.conf:重启终端脚本
    /etc/init/start-ttys.conf:登录终端脚本
    /etc/init/rc.conf:启动脚本
    /etc/init/prefdm.conf:图像界面脚本

3.2.2 CentOS 6系统启动流程

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

3.3 CentOS 7:Systemd

3.3.1 init程序:Systemd

其配置文件:/usr/lib/systemd/system/* ,/etc/systemd/system/*
  • 完全兼容SysV脚本机制;因此,service命令依然可用;不过,建议使用systemctl命令来控制服务
# systemctl {start|stop|restart|status} name[.service]

3.3.2 CentOS 7系统启动流程

POST --> BootSequence(BIOS) --> BootLoader --> Kernel (ramdisk) --> rootfs --> /sbin/systemd
posted @ 2020-01-14 17:35  evescn  阅读(262)  评论(0编辑  收藏  举报