青蛙学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命令。

posted @ 2018-10-22 15:36  青蛙学Linux  阅读(318)  评论(0编辑  收藏  举报