#25 centos7(RHEL)系列操作系统的启动流程systemd的特性与命令systemctl的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#25 centos7(RHEL)系列操作系统的启动流程systemd的特性与命令systemctl的使用相关的知识,希望对你有一定的参考价值。

  systemd的新特性:

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

    2.能够实现按需激活进程;

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

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

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


  核心管理概念;unit文件

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

    unit的文件分类:

      系统服务类

      socket

      目标类

      快照类

      ...


    这些配置文件主要保存在:

      /usr/lib/systemd/system/*

      /etc/systemd/system/*         符号链接(如果自己写入添加配置文件,可以直接放在该目录,不用创建符号链接)

      /run/systemdsystem/*          非配置关键项;


    unit文件的常见类型:

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


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


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


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


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


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


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


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


  systemd特性的实现方式:

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

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

    3.基于bus的激活机制;

    4.基于path的激活机制;


  systemd的兼容和不兼容;

    兼容:sys V init的脚本;

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


  systemctl命令:

    systemctl - Control the systemd system and service manager

    systemctl [OPTIONS...] COMMAND [NAME...]


    管理服务类操作:

      启动:service name start ==> systemctl start name[.service]

      停止:service name stop ==> systemctl stop name[.service]

      重启:service name restart ==> systemctl restart name[.service]

      状态:service name status ==> systemctl status name[.service]

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

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

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

      条件是重启:service name condrestart ==> systemctl try-restart name.service

      重载配置文件:service name reload ==> systemctl reload name.service


      重载或重启:systemctl reload-or-restart name.service

      重载或条件式重启:systemctl reload-or-try-restart name.service


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

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

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

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

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


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

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


    管理target unit:

      模拟运行就别:

        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 isolate name.target

        注意:不是所有的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

        systemctl rescue


      emergency.target:紧急调试模式

        systemctl emergency


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


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


    除上述模式之外,传统的init命令,shutdown命令,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目录中,但是需要为其提供一个符号链接文件放置于/etc/systemd/system目录中;


    service unit file文件的基本格式;

      此类unit file通常分为三段;

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

          常用的选项语句:

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

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

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

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

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

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

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


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

          常用的选项语句:

            Type:用于定义影响execstart即相关参数的功能的unit进程

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

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

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

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

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

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

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

            execstop:指明停止服务所需要运行或脚本;

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

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

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



        [install]:定义由“systemctl enable”和“systemctl disable”命令在实现服务启动或禁用时用到的专用选项语句:

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

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


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;


以上是关于#25 centos7(RHEL)系列操作系统的启动流程systemd的特性与命令systemctl的使用的主要内容,如果未能解决你的问题,请参考以下文章

RHEL7/CentOS7服务控制之systemctl命令

简单的 centos7&rhel7 系统初始化脚本

RHEL7 or CentOS7 的系统密码如何重置

RHEL7/CentOS7服务控制之systemctl命令 򌔛

RHEL7/CentOS7服务控制之systemctl命令 񸪚

RHEL7/CentOS7服务控制之systemctl命令 񬬻