Systemd

背景

自从服务器换成了 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 的架构

Systemd_第1张图片
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 [email protected]
# 等同于
$ sudo ln -s '/usr/lib/systemd/system/[email protected]' '/etc/systemd/system/multi-user.target.wants/[email protected]'

配置文件的后缀名,就是该 unit 的种类,比如 sshd.socket。如果省略,systemd 默认后缀名为 .service,所以 sshd 会被理解成sshd.service。

配置文件的格式

配置文件就是普通的文本文件,可以用文本编辑器打开。systemctl cat 命令可以查看配置文件的内容。

$ systemctl cat nginx.service

参考资料

  • Wiki 百科
  • systemd 入门 - 阮一峰
  • Init - Wiki
  • systemd 配置文件说明
  • systemctl 命令完全指南

你可能感兴趣的:(Systemd)