• 青蛙学Linux—systemd


    1、替代init的systemd

    在CentOS的最新版本CentOS 7系列中,已经开始使用systemd替代init成为服务管理体系。CentOS 7中的第一个进程PID1从init更换成了systemd。init启动时只能串行执行脚本,一个服务启动后才能启动下一个服务,而systemd则可以并行启动服务。使用systemd在启动速度上比init快的多。这也是使用systemd替代init的原因。但systemd也有自身的缺点,systemd虽然功能强大,但是其体系庞大,非常复杂。systemd不仅仅可以用来管理系统服务,它涉及了系统管理的方方面面。

    1.1、systemd相关命令

    因为systemd涉及系统管理的方方面面,所以它使用多个命令来实现众多的功能:

    systemctl:主要使用的命令,用于管理系统
    
    systemd-analyze:用于查看启动耗时
    
    hostnamectl:用于查看当前主机信息
    
    localectl:用于查看本地化设置
    
    timedatectl:用于查看当前时区设置
    
    loginctl:用于查看当前登录的用户

    1.2、Unit

    在systemd中,其管理的不同资源称为Unit(单位)。一共有12种Unit:

    • Service Unit:系统服务
    • Target Unit:多个Unit构成的一个组
    • Device Unit:硬件设备
    • Mount Unit:文件系统的挂载点
    • Automount Unit:自动挂载点
    • Path Unit:文件或路径
    • Scope Unit:不是由systemd启动的外部进程
    • Slice Unit:进程组
    • Snapshot Unit:systemd快照,可以切回某个快照
    • Socket Unit:进程间通信的socket
    • Swap Unit:swap文件
    • Timer Unit:定时器

    1.3、运行目标Target

    运行目标Target是一组Unit,systemd使用运行目标Target取代了init的运行级概念。Target与运行级的对应关系如下:

    init0 -> poweroff.target
    init1 -> rescue.target
    init2 -> multi-user.target
    init3 -> multi-user.target
    init4 -> multi-user.target
    init5 -> graphical.target
    init6 -> reboot.target

    2、systemd相关

    2.1、systemd涉及的文件及目录

    PID1进程启动的systemd:

    /usr/lib/systemd/systemd

    开机时默认的Target:

    /etc/systemd/system/default.target

    这个文件其实是一个符号链接,链接到/lib/systemd/system目录下的指定Target:

    [root@localhost system]# pwd
    /etc/systemd/system
    [root@localhost system]# ll default.target
    lrwxrwxrwx. 1 root root 37 10月 18 11:27 default.target -> /lib/systemd/system/multi-user.target

    Unit的配置文件位于:

    /usr/lib/systemd/system

    2.2、修改默认Target

    从2.1中的介绍可知,默认启动的Target其实是一个文件,链接到/lib/systemd/system目录下的指定Target,所以只要删除原有的default.target,然后通过ln –s命令建立新的符号链接即可修改默认Target,如

    # 当前默认Target为multi-user.target,要把它修改成graphical.target
    rm -f default.target    # 删除default.target
    ln -s /lib/systemd/system/graphical.target default.target    # 建立新的符号链接

    在使用systemd后,init配置默认运行级的/etc/inittab文件已经弃之不用,但init机制的相关文件及目录仍然保留在/etc目录下,所以我们依旧可以看到/etc/inittab文件的存在,打开该文件,可以看到以下内容:

    # inittab is no longer used when using systemd.
    #
    # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
    #
    # Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
    #
    # systemd uses 'targets' instead of runlevels. By default, there are two main targets:
    #
    # multi-user.target: analogous to runlevel 3
    # graphical.target: analogous to runlevel 5
    #
    # To view current default target, run:
    # systemctl get-default
    #
    # To set a default target, run:
    # systemctl set-default TARGET.target
    #

    大意为inittab文件在systemd下面已经不使用了,同时为我们推荐了两个命令:

    # 查看当前运行的默认Target
    systemctl get-default
    
    [root@localhost etc]# systemctl get-default
    multi-user.target
    # 修改默认Target
    systemctl set-default TARGET.target
    
    # 当前默认Target为multi-user.target,将其修改为graphical.target
    [root@localhost etc]# systemctl set-default graphical.target

    3、Unit配置文件及相关命令

    3.1、Unit配置文件概述

    Unit的配置文件用于告诉systemd怎么启动这个Unit,开机启动也在配置文件中声明。配置文件的后缀名就是该Unit的类型,比如在Unit配置文件目录/usr/lib/systemd/system下有sshd.socketsshd.service两个文件,分别为SSH的Socket Unit和Service Unit。当在命令中省略后缀名时,默认指的是.service的Service Unit。我们使用systemd基本上是用来管理系统服务,所以基本上都是对.service文件的操作。

    3.2、Unit配置文件的状态

    虽然Unit的配置文件位于目录/usr/lib/systemd/system目录下,但是systemd默认是从/etc/systemd/system目录下读取配置文件的,该目录下的文件大部分都是符号链接,指向的就是/usr/lib/systemd/system目录。

    通过以下命令可以建立一个Unit配置文件到/etc/systemd/system目录的符号链接,如果该配置文件中设置了开机启动,该动作就相当于激活开机启动:

    systemctl enable unit.service

    通过以下命令可以解除符号链接,相当于取消了开机启动:

    systemctl disable unit.service

    一个Unit配置文件一共有四种状态,分别为:

    • enabled:已建立启动链接
    • disabled:没有建立启动链接
    • static:该配置文件没有[Install]部分,无法执行,只能作为其他配置文件的依赖
    • masked:该配置文件被禁止建立启动链接

    使用以下命令可以查看Unit的状态:

    # 输出所有Unit及其状态
    systemctl list-unit-files
    
    # 输出指定Unit的状态
    systemctl list-unit-files Unit
    # 例子:输出SSH服务的Unit状态
    [root@localhost system]# systemctl list-unit-files sshd.service
    UNIT FILE    STATE  
    sshd.service enabled
    
    1 unit files listed.
    
    # 输出指定类型的Unit状态
    systemctl list-unit-files --type=Unit type
    # 例子:输出所有Service Unit的状态
    [root@localhost system]# systemctl list-unit-files --type=service
    UNIT FILE                                     STATE   
    abrt-ccpp.service                             enabled 
    abrt-oops.service                             enabled 
    abrt-pstoreoops.service                       disabled
    abrt-vmcore.service                           enabled 
    abrt-xorg.service                             enabled 
    …

    3.3、Unit配置文件详解

    我们来看下sshd.service文件中的内容:

    [Unit]
    Description=OpenSSH server daemon
    Documentation=man:sshd(8) man:sshd_config(5)
    After=network.target sshd-keygen.service
    Wants=sshd-keygen.service
    
    [Service]
    Type=notify
    EnvironmentFile=/etc/sysconfig/sshd
    ExecStart=/usr/sbin/sshd -D $OPTIONS
    ExecReload=/bin/kill -HUP $MAINPID
    KillMode=process
    Restart=on-failure
    RestartSec=42s
    
    [Install]
    WantedBy=multi-user.target

    从上面可以看出,Unit的配置文件分为几个块和一些字段,配置文件中的块名和字段名都为大小写敏感,等号的两边不能有空格。

    [Unit]块通常是配置文件的第一个块,用来定义Unit的元数据,以及配置该Unit与其他Unit的关系,该块中主要的字段如下:

    • Description:简短描述
    • Documentation:文档地址
    • Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败
    • Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败
    • BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行
    • Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动
    • After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动
    • Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行
    • Condition...:当前 Unit 运行必须满足的条件,否则不会运行
    • Assert...:当前 Unit 运行必须满足的条件,否则会报启动失败

    [Install]通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动,该块中的主要字段如下:

    • WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中,当该Target启动时会启动这些Unit
    • RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中
    • Alias:当前 Unit 可用于启动的别名
    • Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit

    [Service]块只有Serivce Unit才有,该块中的主要字段如下:

    • Type:定义启动时的进程行为。可能的值有:simple,默认值,ExecStart字段启动的进程为主进程; forking,ExecStart字段以 fork 方式启动,此时父进程将会退出,子进程称为主进程;oneshot,类似simple,但只执行一次,systemd会等待其执行完毕才启动其他进程;dbus,类似simple,但会等待D-Bus信号后启动;notify,类似simple,启动结束后会发出通知信号,然后systemd再启动其他服务;idle,类似simple,但是要等到其他任务执行完才启动该服务
    • ExecStart:启动当前服务的命令
    • ExecStartPre:启动当前服务之前执行的命令
    • ExecStartPost:启动当前服务之后执行的命令
    • ExecReload:重启当前服务时执行的命令
    • ExecStop:停止当前服务时执行的命令
    • ExecStopPost:停止当其服务之后执行的命令
    • RemainAfterExit:yes|no,进程退出后服务仍然保持执行,即当进程停止后会重新执行ExecStart定义的命令
    • KillMode:定义了systemd如何停止一个服务。可能的值有:control-group,默认值,当前服务的所有子进程都会被杀掉;process,只杀掉主进程;mixed,主进程将收到SIGTERM信号,子进程收到SIGKILL信号;none,没有进程会被杀掉,只是执行服务的stop命令
    • RestartSec:自动重启当前服务间隔的秒数
    • Restart:定义何种情况 systemd 会自动重启当前服务,可能的值有:no,退出后不重启;on-success,只有正常退出时(退出状态码为0)才会重启;on-failure,非正常退出时(退出状态码非0),包括被信号终止和超时才会重启;on-abnormal,只有被信号终止和超时才会重启;on-abort,只有在收到没有捕抓到的信号终止时才会重启;on-watchdog,超时退出才会重启;always,不管什么原因退出总是重启
    • EnvironmentFile:指定环境参数文件

     注意:对于任何配置文件的修改都必须使用以下命令重新加载配置文件,然后重启Unit,才能使配置生效:

    systemctl daemon-reload

    3.4、Unit管理相关命令

    启动|停止|重启动|重新加载|查看运行状态:

    systemctl start|stop|restart|reload|status Unit

    注意:对一个Unit执行启动|停止|重启动|重新加载命令均不会有回显,所以无法知道该Unit的相应操作是否成功,必须使用systemctl status命令查看当前Unit的运行状态。

    使用以下命令可以查看某个Unit在当前环境下的状态:

    systemctl is-enabled Unit
    
    [root@localhost system]# systemctl is-enabled sshd.service
    enabled

    在使用systemd的CentOS 7中,仍然可以使用serivcechkconfig命令。

  • 相关阅读:
    利用树莓派把普通打印机变成网络打印机方法
    Python之datetime库
    CentOS7从默认/home中转移空间到根分区/
    更改Azure虚拟机账号密码
    创建一个托管磁盘的Windows定制镜像
    IO多路复用详解
    玩转redis
    EF Linq to Sql 多表left join查询并对结果group by分组之后进行count,max等处理
    免费,主流的在线办公/协作,会议,文档,调查,分享工具推荐(持续维护中)
    多sql查询count合并为一行
  • 原文地址:https://www.cnblogs.com/yu2006070-01/p/9830383.html
Copyright © 2020-2023  润新知