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

CentOS系统启动

CentOS(RHEL)系列操作系统的启动流程: Intel X86兼容架构

    Linux的系统组成: 内核+应用程序(GNU/Linux): 单纯的指Linux内核

    从硬盘存储和启动操作系统的角度:

        Linux的系统组成: 内核+根文件系统(rootfs)

        内核功能: 进程管理, 文件系统管理, 内存管理, 网络协议, 驱动程序, 安全功能, ......

        Linux系统的系统运行环境可以分为两部分:

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

                就是内核进程占用的CPU和内存资源的总和;

            用户空间: 应用程序(进程或线程)

                就是各种存储于文件系统中的应用程序, 在发起为进程或线程之后, 占据的CPU和内存资源的总和;

    操作系统内核的设计流派:

        单内核设计:

            所有的功能全部几种于同一个程序; 运行时表现为一个进程;

            Linux就是单内核设计,(原因: 我们不需要Linux成为最先进的, 我们只是要使用它.)

        微内核设计:

            每种功能使用一个单独的子系统来实现;

            Windows,Solaris都是微内核设计

    Linux内核的特点:

        单内核+模块化: 内核之中的功能+各个模块提供的功能之和;

        为了能够提效, 会为速度比较慢的IO设备提供缓冲和缓存;

    Linux内核的组成部分:

        内核核心文件: /boot/vmlinux-VERSION-release

        CentOS5: /boot/vmlinux-2.6.18-398.el5

        CentOS6: /boot/vmlinux-2.6.32-573.el6.x86_64

        CentOS7: /boot/vmlinux-3.10.0-327.el7.x86_64

        最新的内核版本: 4.17

        内核模块文件: /lib/modules/KERNEL_VERSION/kernel/

        ramdisk:

            CentOS5: /boot/initrd-2.6.18-398.el5.img

            CentOS6: /boot/initramfs-2.6.32-573.el6.x86_64.img

        ramfs:

            CentOS7: /boot/initramfs-3.10.0-327.el7.x86_64.img

        生成ramdisk的工具:

            CentOS5/6:    mkinitrd

            CentOS7:    dracut    mkinitrd

       ramdiskramfs的区别:

            ramdisk:双缓冲和双缓存

            ramfs:提效, 避免双缓冲和双缓存

CentOS系列操作系统的启动流程(2)

    整个系统启动的流程基本可以分为POST-->MBR(GRUB)-->Kernel-->Init-->Runlevel

    BIOS(BasicInput/Output System):

        基本输入输出系统, 改系统存储于主板的ROM芯片上, 计算机在开机时, 会最先读取该系统, 然后会有一个加电自检过程, 这个过程其实就是检查CPU和内存, 计算机最基本的组成单元(控制器, 运算器和存储器), 还会检查其他硬件, 若没有异常就开始加载BIOS程序到内存中. BIOS主要的一个功能就是存储了磁盘的启动顺序, BIOS会按照启动顺序去查找第一个磁盘头的MBR信息, 并加载和执行MBR中的Bootloader程序, 若第一个磁盘不存在MBR, 则会继续查找第二个磁盘(PS: 启动顺序可以在BIOS的界面中进行设置), 一旦BootLoader程序被检测并加载内存中, BIOS就将控制权交给了BootLoader程序.

    MBR(Master BootRecord):

        主引导记录, MBR存储于磁盘的头部, 大小为512bytes, 启动, 446bytes用于存储BootLoader程序, 64bytes用于存储分区表信息, 最后2bytes用于MBR的有效行检查.

    GRUB(GrandUnified Bootloader):

        多系统启动程序, 其执行过程可分为三个步骤:

            Stage1:这个其实就是MBR, 它的主要工作就是查找并加载第二段Bootloader程序(stage2), 但系统在没启动时, MBR根本找不到文件系统, 也就找不到stage2所存放的位置, 因此, 就有了stage1_5

            Stage1_5:该步骤就是为了识别文件系统

            Stage2:GRUB程序会根据/boot/grub/grub.conf文件查找Kernel的信息, 然后开始加载Kernel程序, kernel程序被检测并加载到内存中, GRUB就将控制权交给Kernel程序.

        PS:实际上这个步骤/boot还没被挂载, GRUB直接识别grub所在磁盘的文件系统, 所以实际上应该是/grub/grub.conf文件, 改配置文件的信息如下:

grub.conf:
#boot=/dev/sda
default=0        #
设定默认启动的title的编号,从0开始
timeout=5        #等待用户选择的超时时间
splashimage=(hd0,0)/boot/grub/splash.xpm.gz        #GRUB的背景图片
hiddenmenu        #隐藏菜单
title CentOS (2.6.18-194.el5PAE)        #内核标题
root (hd0,0)        #内核文件所在的设备
kernel /vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/        #内核文件路径以及传递给内核的参数
initrd /initrd-2.6.18-194.el5PAE.img       #ramdisk文件路径

    Kernel

        内核, KernelLinux系统最主要的程序, 实际上, Kernel的文件很小, 只保留了最基本的模块, 并以压缩的文件形式存储在硬盘中, GRUBKernel读进内存, 内存开始解压内核文件. 将内核启动, 应该先讲下initrd这个文件.

         initrd(InitialRAM Disk), 它在stage2这个步骤就被拷贝到了内存中, 这个文件实在安装系统时产生的, 是一个临时的根文件(rootfs). 因为Kernel为了精简, 只保留最基本的模块, 因此,Kernel上并没有各种硬件的驱动程序, 也就无法识别rootfs所在的设备, 故产生了initrd这个文件, 该文件装载了必要的驱动模块, Kernel启动时, 可以从initrd文件中装载驱动模块, 直到挂载真正的rootfs, 然后将initrd从内存中移除.

        Kernel会以只读方式挂载根文件系统, 当根文件系统被挂载后, 开始装载第一个进程(用户空间的进程), 执行/sbin/init之后就将控制权交给init程序.

    Init

        初始化, 该程序就是进行OS初始化操作, 实际上是根据/etc/inittab(定义了系统默认运行级别)设定的动作进行脚本的执行, 第一个被执行的脚本为/etc/rc.d/rc.sysinit, 这个是真正的OS初始化脚本, 简单讲下这个脚本的任务:

            1.激活udevselinux;

            2.根据/etc/sysctl.conf文件, 来设定内核参数;

            3.设定系统时钟;

            4.装载硬盘映射;

           5.启动交换分区;

            6.设置主机名;

            7.根文件系统检测, 并以读写方式重新挂载根文件系统;

            8.激活RAIDLVM设备;

            9.启动磁盘配额;

           10.根据/etc/fstab, 检查并挂载其他文件系统;

            11.清理过期的锁和PID文件;

        执行完后, 根据配置的启动级别, 执行对应目录底下的脚本, 最后执行/etc/rc.d/rc.local这个脚本, 至此, 系统启动完成.

    Runlevel

        runlevel,运行级别, 不同的级别会启动的服务不一样, init会根据定义的级别去执行相应目录下的脚本, Linux的启动级别分为以下几种:

            0: 关机

            1: 单一用户模式(直接以管理员身份进入)

            2:多用户模式(无网络)

            3:多用户模式(命令行)

            4:保留

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

           6: 重启

        在不同的运行级别下, /etc/rc.d/rc这个脚本会分别执行不同目录下的脚本

            Runlevel 0 - /etc/rc.d/rc0.d/

            Runlevel 1 - /etc/rc.d/rc1.d/

            Runlevel 2 - /etc/rc.d/rc2.d/

            Runlevel 3 - /etc/rc.d/rc3.d/

            Runlevel 4 - /etc/rc.d/rc4.d/

            Runlevel 5 - /etc/rc.d/rc5.d/

            Runlevel 6 - /etc/rc.d/rc6.d/

        这写目录下的脚本只有K*S*开头的文件, K开头的文件为开机需要执行关闭的服务, S开头的文件为开机需要执行开启的服务.

CentOS 5SysV Init的工作过程:

    CentOS 5 SysVInit:

        运行级别(run level): 为了系统的运行或维护等目的而设置的管理机制;

            0-6:七个运行级别:

                #0 - 关机, halt, shutdown

               # 1 - 单用户模式(Single user mode), root, 无需验证; 维护模式;

                #2 - 多用户模式(Multiuser), 会启动网络功能; 但不会启动NFS, 维护模式;

                #3 - 多用户模式(Full multiuser mode), 完全的功能模式), 仅使用CLI, 不激活GUI;

                #4 - 预留级别, 目前无特别使用的目的; 但是习惯上认为与3运行级别相同;

                #5 - 多用户模式(Full multiuser mode), 完全的功能模式, 默认激活GUICLI, 默认使用的是GUI;

                #6 - 重启, reboot

            通常会使用3, 5运行级别作为此次系统启动的默认运行级别;

        查看当前系统的运行级别:

            who-r

            runlevel

        切换运行级别:

            init[0-6]

        Init的配置文件: /etc/inittab, 此配置文件有如下功能:

            1.在整个系统初始化的过程中要做哪些任务;

                启动或关闭哪些后台服务;

                如何进行系统初始化;

                在验证用户的身份无误之后, 如何为用户提供登陆提示符, 还要区分是图形界面还是文件界面;

                当备用电源失效或重新生效时, 如何指挥系统操作;

                定义了按下"Ctrl+Alt+Del"组合键时, 系统将采取什么行为;

            2.所有规定的任务如何执行;

                每一行定义一种操作, 格式如下:

                    id:runlevels:action:process

                        id:一种操作的唯一标识符;

                            1#,id, pf, pr, #, x,

                        runlevels:指定任务执行所依赖的运行级别;

                            ####,#, 留空

                       action: 在何种条件下启动此任务;

                            wait:等待切换至此任务所在的运行级别时, 运行一次;

                            respawn:一旦此任务结束, 就自动重新启动此任务;

                            initdefault:用于设定默认的运行级别, 通常后面的process省略

                            sysinit:设置系统初始化的方式, 一般情况下此处运行/etc/rc.d/rc.sysinit脚本

           /etc/rc.d/rc.sysinit, 此文件的功能如下:

                1.设置主机名称;

                2.设置启动的欢迎信息;

                3.激活udevSELinux

                4.挂载/etc/fstab文件中定义的所有有效文件;

                5.激活各个swap设备;

                6.检测rootfs, 并且以读写的方式重新挂载rootfs;

                7.设置系统时间;

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

                9.激活lvm和软RAID等高级逻辑设备;

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

                11.完成清理工作;

            /etc/rc.d/rc,此文件的功能如下:

                根据特定的运行级别, 启动或关闭/etc/rc.d/rd$runlevel.d/*

                    K*:要停止的服务; K字母后面的两位数字表示优先级; 数字越小优先级越高; 依赖其他服务的服务应该优先关闭, 被其他服务依赖的服务应该稍后关闭;    

                    S*:要启动的服务; S字母后面的两位数字表示优先级; 数字越小优先级越高; 被其他服务依赖的服务应该优先启动, 依赖其他服务的服务应该稍后启动;

                    rc脚本可以接受一个运行级别作为其参数运行内容的;

               其脚本框架:

                    fori in /etc/rc.d/rc#.d/K* ; do
                        $istop
                   done
                    fori in /etc/rc.d/rc#.d/S* ; do
                        $istart
                    done

        所有由rc脚本关闭或启动的链接文件的源文件都存在于/etc/rc.d/init.d, 系统为了方便使用, 为此目录创建了链接/etc/init.d

        所有/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命令: 查看系统服务相关运行级别下的运行状态;

                格式: chkconfig --list [name]

                管理系统服务在/etc/rc.d/rc#.d/目录下的服务脚本的链接:

                    chkconfig--add name

                    chkconfig--del name

               为了能够让chkconfig命令管理系统服务的脚本的链接, 每个脚本中都必须有这样的格式:

                    #chkconfig: 2345 90 60

                        2345:在哪个运行级别下, 此服务是自动启动状态; 也就是说, 在对应的运行级别的rc#.d目录中, 是以S开头的文件; 如果该位置为"-", 则表示所有运行级别都为K开头的;

                        90:如果在某个运行级别下为开启状态, 该数字为S后面的优先级数字;

                        60:如果在某个运行级别下为停止状态, 该数字为K后面的优先级数字;

                    #description: 对于此系统服务的摘要性描述信息;

                单独设置指定运行级别下系统服务的自动启动或关闭的状态:

                    chkconfig[--level levels] name <on|off|reset>

            /etc/rc.d/rc.local脚本的功能:

                它是init程序在引导用户空间进程启动的过程中, 所执行的最后一个脚本; 因此, 以便于或不需要写在系统服务相关的脚本中的内容但又期望可以开机即运行的功能, 可以直接卸载此脚本中;

       /etc/inittab的文件的第二部分:

            #Run gettys in standard runlevels

            1:2345:respawn:/sbin/mingettytty1

            2:2345:respawn:/sbin/mingettytty2

            3:2345:respawn:/sbin/mingettytty3

           4:2345:respawn:/sbin/mingetty tty4

            5:2345:respawn:/sbin/mingettytty5

            6:2345:respawn:/sbin/mingettytty6

            mingetty会调用login程序, 打开虚拟终端; 除了mingetty之外, 诸如getty之类的程序也可以生成虚拟终端控制台;

            如果默认的运行级别是5, 则我们需要/etc/x11/prefdm脚本打开图形界面终端; 操作如下:

                X6R11- X Version 6 Release 11

    小结:(用户空间的启动流程), /sbin/init

        /sbin/init--> /etc/inittab --> 设置默认运行级别 --> /etc/rc.d/rc.sysinit脚本, 完成系统初始化 -->关闭那些对应运行级别下需要停止的服务, 启动那些对应运行级别下需要开启的服务 --> Ctrl+Alt+Del热键功能 --> UPS电源的失效与恢复之后的操作 --> 生成终端[启动图形界面]

CentOS 6:

    Init程序: uupstart, 其应用程序依然是/sbin/init, 其配置文件:

        /etc/inittab:仅仅只是用于定义默认运行级别:

        /etc/init/*.conf:

            rcS.conf:执行系统初始化脚本的任务;

            rc.conf:执行根据运行级别关闭或开启系统服务的任务;

            start-ttys.conf:执行打开终端相关的任务;

            prefdm.conf:执行打开图形界面的任务;

        upstart机制: 基于事件驱动的程序管理模型: Driven-envet

    系统的启动流程:

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

CentOS 7:

    Init程序: Systemd, 与经典的Init程序完全不同: 其配置文件:

        /etc/systemd/system/*

        /usr/lib/systemd/system/*:systemdUNIT文件;

       /etc/inittab: 已废除;

        systemd完全兼容SysV分格的Init程序及其脚本; 因此, service类的命令在CentOS7中依然可用; 但是, 建议使用CentOS 7标配的systemctl命令来控制和管理系统服务;

        systemctl命令: 该系统和服务系统的管理控制

            格式: systemctl [OPTIONS...] COMMAND [NAME...]

        使用systemctl管理服务的一般方式:

            ~]#systemctl {start|stop|restart|status} name[.service]

        设置CentOS 7的默认运行级别:

            ~]#systemctl set-default {multi-user.target | graphical.target}

        查看CentOS 7的默认运行级别:

            ~]#systemctl get-default

Bootloader:

    GRUB: GRandUniform Bootloader, 通用统一引导加载器;

        grub0.x: grub legacy

        grub1.x: grub2

    grub legacy:

        1ststage: stage1, MBR的前446Bytes;

        1.5stage: stage1_5, MBR之后的若干个扇区中; stage1中的bootloader程序能够识别stage2所在额分区的文件系统;

        2ndstage: stage2, 磁盘的启动分区;

            注意: stage2及内核核心文件必须放置在同一个基本磁盘分区上;

            stage2提供的功能:

                1.加载操作系统内核核心文件;

                2.提供一个菜单和交互接口;

                3.允许用户编辑菜单内容;

               4.命令行接口操作模式;

                5.身份认证机制, 以保证菜单编辑和内核启动的安全;

        grub的命令行界面:

            提示符: grub>

            grub的命令行界面中的常用命令:

                help:获取所有的grub命令的名称列表和简要使用方法;

                helpGRUB_CMD: 显示特定命令的详细帮助信息;

                root(hd#,#): 将指定磁盘的指定分区作为grub程序的根设备;

                    hd#:磁盘编号, #一般是从0开始的数字; hd0表示第一块磁盘;

                    #:分区编号, #一般也是从0开始的数字, 0拜师第一个分区;

                   示例: (hd0,0): 当前计算机上的第一块磁盘的第一个分区;

                find(hd#,#): 从指定的分区中搜索文件, 并显示出文件所在位置;

                kernel/PATH/TO/KERNEL_CORE_FILE: 设定本次启动时用到的内核文件的绝对路径; 额外还可以在kernel 命令中, 为内核启动添加更多的内核参数;

                    roroot=/dev/sda3 selinux=0 init=/sbin/init(/bin/bash) quiet rhgb {1|s|S|single}

                initrd/PATH/TO/initramfs-VERSION-release.img

        grub的配置文件:

            /boot/grub/grub.conf

            /etc/grub.conf:链接文件, 链接到/boot/grub/grub.conf

            其文件内容:

default=0    #设定默认菜单项;整个菜单中的所有的title是从0开始编号的;
timeout=5    #等待用户做出选择的时间;若用户不做选择,grub会自动引导默认菜单项;
splashimage=(hd0,0)/grub/splash.xpm.gz   #grub的背景图片对应的路径;
hiddenmenu    #隐藏grub的启动菜单
passwordd --md5 CRYPTED_PASSWOED    #为保护菜单设置的密码, 通常用于防止随意进入单用户模式;
title CentOS 6 (2.6.32-573.el6.x86_64)   #菜单项中的"标题"
    root (hd0,0)    #指定grub的根设备, 通常是用来安装grub的那个分区;
    kernel/vmlinuz-2.6.32-573.el6.x86_64.img    #内核所对应的ramdisk(ramfs)文件
    password --md5 CRYPTED_PASSWORD    #保护操作系统内核的启动;

Systemd:

    Systemd的新特性:

        1.在系统引导的时候可以实现服务的并行启动;

        2.能够实现按需激活进程; 在系统启动时, 需要随系统启动服务, 其服务进程并没有启动, 但是Systemd为每一个此类服务进程都注册了对应的套接字; 我们称这种服务处理方式为"半激活状态";

        3.能够对当前系统的用户空间的每个进程进行状态快照; 以后如果进程出现问题或故障, 可以迅速恢复进程状态至过去的某一时刻;

        4.systemd内部有一种基于依赖关系来定义的服务控制逻辑;

    核心管理概念: unit文件

        systemd相关的配置文件进行标识, 识别和配置功能的实现的基础;

        unit的文件分类: 系统服务类 socket 目标类快照类 ......

        其配置文件

            /usr/lib/systemd/system/*:主要的配置文件

            /etc/systemd/system/*:符号链接文件, 链接到/usr/lib/systemd/system/*

            /run/systemd/system/*:非配置关键项

        Unit文件的常见类型:

            Serviceunit: 文件的扩展名为.service, 用于定义系统服务, 一般.service扩展名可以省略;

            Targetunit: 文件的扩展名为.target, 用于模拟实现"init程序的运行级别";

            Deviceunit: 文件的扩展名为.device, 用于定义内核识别出来的各设备;

            Mountunit: 文件的扩展名为.mount, 用于定义可以被systemd管理的文件系统的挂载点;

            Automountunit: 文件的扩展名为.automount, 用于定义文件系统自动挂载点的位置;

            Socketunit: 文件的扩展名为.socket, 用于标识进程间通信所用到的socket文件;

            Swapunit: 文件的扩展名为.swap, 用于标识swap设备;

            Pathunit: 文件的扩展名为.path, 用于监控指定目录中的一个文件或一个子目录; 如果被监控的文件或目录不存在, systemd可以自动创建;

    systemd特性的实现方式:

        1.基于socket unit的方式实现进程激活机制;

        2.基于device unit的方式实现设备的自动识别, 挂载;

        3.基于bus的激活机制;

        4.基于path的激活机制;

    systemd的兼容和不兼容:

        兼容: SysV init的脚本;

        不兼容: 不许使用systemctl命令来管理系统, systemctl命令的格式是固定不变的; 所有不经由systemd启动的系统服务或系统功能, systemctl命令无法与之直接通信, 也就以为此类服务或功能无法通过systemctl来控制;

    systemctl命令系统和服务系统的管理控制

        格式: systemctl [OPTIONS...] COMMAND [NAME...]

        管理服务类的操作:

            启动: service NAME start ==> systemctlstart NAME[.service]

            停止: service NAME stop ==> systemctl stopNAME[.service]

            重启: service NAME restart ==> systemctlrestart NAME[.service]

            状态: service NAME status ==> systemctlstatus NAME[.service]

            设置服务的开机自启: chkconfig --level runlevels NAME on==> systemctl enable NAME[.service]

            禁止服务的开机自启: chkconfig --level runlevels NAME off==> systemctl disable NAME[.service]

            查看某服务是否开机自启: chkconfig --list NAME ==> systemctlis-enabled NAME.service

            条件式重启: service NAME condrestart ==>systemctl try-restart NAME.service

            重载或重启: systemctl reload-or-restartNAME[.service]

            重载或条件式重启: systemctl reload-or-try-restartNAME[.service]

            查看某服务当前是否处于激活状态: systemctl is-active NAME[.service]

            查看所有已处于激活状态的服务: systemctl list-units

                --type=UNITTYPE: 查看指定unit类型和处于活跃状态的服务;

                --all:显示所有, 包括处于活跃状态和处于非活跃状态的各服务;

           查看依赖指定服务的其他服服务: systemctl list-dependencies NAME[.service]

            禁止某服务被设定为开机自启: systemctl mask NAME[.service]

            取消禁止某服务被设定为开机自启: systemctl unmask NAME[.service]

        管理target unit:

            为兼容init的运行级别, systemd中模拟了运行级别:

                0==> runlevel0.target, poweroff.target       

                1==> runlevel1.target, rescue.target

                2==> runlevel2.target, multi-user.target

                3==> runlevel3.target, multi-user.target

                4==> runlevel4.target, multi-user.target

                5==> runlevel5.target, graphical.target

                6==> runlevel6.target, shutdown.target

            运行级别间切换: init # ==> systemctl isolateNAME.tartet

                注意: 不是所有的target都能使用上述命令进行级别切换的; 只有那些在对应的unit文件中包含了AllowIsolate=yes的语法的target才能用于切换;

                修改了unit文件之后, 需要通过命令才能使之生效: # systemctl daemon-reload

            查看运行级别: runlevel ==> systemctl list-units--type=target --all

            查看默认运行级别: /etc/inittab(id:3:initdefault:) ==>systemctl get-default

            修改默认运行级别: /etc/inittab(id:3:initdefault:) ==>systemctl set-default NAME.target

            rescue.target:紧急救援模式

                切换命令: systemctl isolate rescue.target 

                                systemctlrescue

            emergency.target:紧急调试模式

               切换模式: systemctl emergency

            rescue模式, 相当于安全模式, 在切换到此模式时, 操作系统会运行最底层的驱动程序, 以保证服务器可以运行起来;

            emergency模式: 一般来说, 通常是硬件故障, 或者硬件不可识别, 或者硬件可识别但不可用等关乎于计算机设施的问题, 通常系统会启动emergency模式;

        除上述模式之外,传统的init命令, shutdonw命令, poweroff命令, halt命令, reboot命令其实都是systemctl的符号链接;

        可以使用systemctl命令来直接实现上述功能:

            关机: systemctl halt, systemctl poweroff

            重启: systemctl reboot

           挂起: systemctl suspend

            休眠(进程快照): systemctl hibernate

            挂起并休眠: systemctl hybrid-sleep

    Service unit file的基本文件格式:

        /etc/systemd/system:存放的都是各个unit file的符号链接;

        /usr/lib/systemd/system:主要的存放路径

        如果自行编写unit file, 可以直接将文件放置于/etc/systemd/system目录中; 也可以将其放在/usr/bib/systemd/system目录中, 但是需要为其提供一个符号链接文件放置于/etc/systemd/system目录中;

        Serviceunit file文件的基本格式:

            此类unit file通常分为三段:

                [Unit]:定义与Unit类型无关的通用选项; 用于提供当前unit的描述信息, unit的行为信息, unit的依赖关系, unit相关帮助文档信息等;

                    常用的选项语句:

                        Description:定义了相关服务的描述信息; 意义性的介绍性的描述;

                        After:定义了此服务在启动前必须依赖的其他服务;

                        Before:定义了依赖此服务启动的其他服务;

                        Wants:指明依赖关系, 说明该服务依赖于哪些其他的unit; 弱依赖, 即使被依赖的服务并没有被正确激活, 也不会影响当前服务是否可以被激活;

                        Requires:指明依赖关系, 说明该服务依赖于哪些其他的unit; 强依赖关系, 只要被依赖的unit无法被正确激活, 则当前服务一定无法激活;

                        Conflict:定义了各unit之间可能存在冲突;

                        Documentation:定义了跟当前unit相关的管理命令的文档所在;

                [Service]:定义与系统服务相关的专用的选项语句;

                    常用的选项语句:

                        Type:用于定义影响ExecStart即相关参数的功能的unit进程的启动类型

                            simple:默认值, 表示由ExecStart语句指明的应用程序启动的进程就是主进程;

                            forking:复制自身, 表示有ExecStart语句指明的应用程序所启动的进程中众多的子进程中一个将成为主进程, 而一旦启动完成, 父进程会退出

                            oneshot:一次性进程, 功能类似于simple, 在启动后续的unit之前, 主进程会退出;

                            notify:功能类似于simple, 但是其后续的unit仅在通过sd_notifu()函数发送通知之后, 才会运行ExecStart所指明的应用程序;

                        EnvironmentFile:环境配置文件, 此文件一般用于在ExecStart之前被读取, 并为ExecStart执行后面的应用程序提供必要的变量以及其他自定义功能等;

                        ExecStart:指明启动服务所需要运行的命令或脚本;

                        ExecReload:指明重载配置文件所需要运行的命令或脚本;

                        ExecStop:指明停止服务所需要运行的命令或脚本;

                        ExecStartPre:指明在执行ExecStart指明的命令之前需要运行的命令或脚本;

                        ExecStartPost:指明在执行ExecStart指明的命令之后需要运行的命令或脚本;

                        Restart:表示如果服务遭遇有意外而终止, 则会自动重启该服务;

                [Install]:定义由"systemctlenable""systemctl disable"命令在实现服务启动或禁用时用到的专用选项语句;

                    WantedBy:弱依赖关系, 指的是该服务被哪些其他units所依赖;

                    RequiredBy:强依赖关系, 指的是该服务被哪些其他units所依赖;

CentOS 7系统引导过程:

    1.POST

    2.选择启动设备, 读取引导程序

    3.装载引导程序(CentOS 7使用的grub2)

    4.装载引导程序的配置文件: /etc/grub.d/, /etc/default/grub,/boot/grub2/grub.cfg

    5.加载initramfs驱动模块

    6.加载内核

    7.内核以只读方式挂载rootfs, 启动systemd进程;

    8.执行initrd-*.target所有的unit, 包括挂载/etc/fstab文件中所有有效的文件系统;

    9.根切换

    10.systemd执行默认的target 

CentOS系统启动