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.socket和sshd.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中,仍然可以使用serivce和chkconfig命令。