背景
自从服务器换成了 CentOS7 以后,经常使用 systemctl
开头的命令,比如启动 Nginx 等服务的时候。但是并没有深入了解该命令,经常在碰到启动失败的时候不知道如何是好。
目标
- systemd 是什么;
- 为什么使用 systemd;
- systemctl 和 systemd 的关系;
- systemd 和 systemctl 的常用命令;
Systemd 是什么
以下为维基百科的定义:
systemd 是 Linux 操作系统下的一套中央化系统及设置管理程序(init 软件),包括守护进程、程序库和应用软件,由 Lennart Poettering 带头开发。其开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时达到降低 Shell 的系统开销的效果,最终代替现在常用的System V 与 BSD 风格 init 程序。
通过以上定义可以看出,systems 是:
- 一套系统和服务管理器;
- 包含守护进程、程序库和应用软件;
为什么使用 systemd
systemd 出现以前
systemd 出现以前,一般都使用 Init
来启动服务。以下为 Init 的定义:
init(为英语:initialization的简写)是 Unix 和 类Unix 系统中用来产生其它所有进程的程序。它以守护进程的方式存在,其进程号为1。Linux系统在开机时加载Linux内核后,便由Linux内核加载init程序,由init程序完成余下的开机过程,比如加载运行级别,加载服务,引导Shell/图形化界面等等。
但在使用的过程中,Init 有两个比较大的缺陷:
- 启动时间长。init 进程是串行启动,只有前一个进程启动完,才会启动下一个进程;
- 启动脚本复杂。init 进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长;
在这样的情况下,Linux 的各个发行版也尝试过很多其他的系统和服务管理器,不过在 2015 年以后,Linux 的各个发行版都逐渐采用了 systemd
。
为什么使用 systemd
systemd 就是为了解决这些问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案。
systemctl 和 systemd 的关系
systemd 的架构
从上图可以直观地看出,systemctl 是 systemd 的众多工具之一,而且是主要工具。
systemd 的各种工具
- systemd-analyze。用于查看启动耗时;
- hostnamectl。用于查看当前主机信息;
- localectl。用于查看本地化设置;
- timedatectl。用于查看当前时区设置;
- loginctl。用于查看当前登陆的用户;
Unit
定义
在 systemd 中,大多数操作的目标是 unit
,它们是 systemd 知道如何管理的资源。
类型
unit 共有 12 种类型。详见阮一峰的文章。
常用命令
# 列出所有 unit
$ systemctl list-units
# 查看系统状态和单个 unit 的状态
$ systemctl status
# 显示某个 unit 是否正在运行
$ systemctl is-active application.service
# 显示某个 unit 是否处于启动失败状态
$ systemctl is-failed application.service
# 显示某个 unit 服务是否建立了启动链接
$ systemctl is-enabled application.service
# 立即启动一个服务
$ sudo systemctl start apache.service
# 立即停止一个服务
$ sudo systemctl stop apache.service
# 重启一个服务
$ sudo systemctl restart apache.service
# 杀死一个服务的所有子进程
$ sudo systemctl kill apache.service
# 重新加载一个服务的配置文件
$ sudo systemctl reload apache.service
# 重载所有修改过的配置文件
$ sudo systemctl daemon-reload
# 显示某个 Unit 的所有底层参数
$ systemctl show httpd.service
# 显示某个 Unit 的指定属性的值
$ systemctl show -p CPUShares httpd.service
# 设置某个 Unit 的指定属性
$ sudo systemctl set-property httpd.service CPUShares=500
依赖关系
# 列出所有依赖
$ systemctl list-dependencies nginx.service
配置文件
每一个 unit 都有一个配置文件,告诉 systemd 怎么启动这个 unit 。
systemd 默认从目录 /etc/systemd/system/ 读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录 /usr/lib/systemd/system/ ,真正的配置文件存放在那个目录。
systemctl enable 命令用于在上面两个目录之间,建立符号链接关系。
$ sudo systemctl enable clamd@scan.service
# 等同于
$ sudo ln -s '/usr/lib/systemd/system/clamd@scan.service' '/etc/systemd/system/multi-user.target.wants/clamd@scan.service'
配置文件的后缀名,就是该 unit 的种类,比如 sshd.socket。如果省略,systemd 默认后缀名为 .service,所以 sshd 会被理解成sshd.service。
配置文件的格式
配置文件就是普通的文本文件,可以用文本编辑器打开。systemctl cat
命令可以查看配置文件的内容。
$ systemctl cat nginx.service