第 10 章 使用 systemd 管理服务
10.1. systemd 简介
Systemd 是 Linux 操作系统的系统和服务管理器。它设计为与 SysV init 脚本向后兼容,并提供许多功能,如在引导时并行启动系统服务、按需激活后台程序或基于依赖项的服务控制逻辑。在 Red Hat Enterprise Linux 7 中,systemd 替换 Upstart 作为默认的 init 系统。
systemd 引进了 systemd 单元的概念。这些单元由位于 表 10.2 “systemd 单元文件位置” 中列出的目录中的单元配置文件来表示,并封装有关系统服务、侦听套接字以及与 init 系统相关的其他对象的信息。有关可用 systemd 单元类型的完整列表,请参阅 表 10.1 “可用的 systemd 单元类型”。
单位类型 | 文件扩展 | 描述 |
---|---|---|
服务单元 |
| 系统服务。 |
目标单元 |
| 一组 systemd 单元。 |
Automount 单元 |
| 文件系统自动挂载点。 |
设备单元 |
| 内核可识别的设备文件。 |
挂载单位 |
| 文件系统挂载点。 |
路径单元 |
| 文件系统中的一个文件或者目录。 |
Scope 单元 |
| 外部创建的进程。 |
Slice 单元 |
| 一组管理系统进程的分层组织单元。 |
快照单元 |
| 已保存的 systemd 管理器状态。 |
套接字单元 |
| 进程间的通信套接字。 |
Swap 单元 |
| 一个交换设备或者一个交换文件。 |
计时器单元 |
| systemd 计时器。 |
目录 | 描述 |
---|---|
| 安装的 RPM 软件包中的 systemd 单元文件。 |
| 在运行时创建的 systemd 单元文件。该目录优先于安装了的服务单元文件的目录。 |
|
Systemd 单元文件由 |
使用 system.conf 覆盖默认 systemd 配置
默认 systemd 配置是在编译过程中定义的,可以在 /etc/systemd/system.conf
中的 systemd 配置文件中找到。如果您想与那些默认值分离,并全局覆盖所选的 systemd 单元默认值,请使用这个文件。
例如,若要覆盖设为 90 秒的超时限制的默认值,可使用 DefaultTimeoutStartSec
参数输入所需的值(以秒为单位)。
DefaultTimeoutStartSec=required value
另请参阅 例 10.21 “更改超时限制”。
10.1.1. 主要功能
在 Red Hat Enterprise Linux 7 中,systemd 系统和服务管理器提供以下主要功能:
基于套接字的激活 - 在引导时,systemd 会为支持这类激活的所有系统服务创建侦听套接字,并在套接字启动后立即将套接字传递给这些服务。这不仅允许 systemd 并行启动服务,还使得可以在服务不可用时重新启动服务而不丢失发送到该服务的任何消息:对应的套接字可被访问,所有消息都已排队。
Systemd 使用套接字单元进行基于套接字的激活。
- 基于总线激活 - 将 D-Bus 用于进程间通信的系统服务可以按需启动,当客户端应用第一次尝试与之通信时。Systemd 使用 D-Bus 服务文件进行基于总线的激活。
- 基于设备的激活 - 当特定类型的硬件插入或可用时,支持基于设备的激活的系统服务可以按需启动。Systemd 使用设备单元进行基于设备的激活。
- 基于路径激活 - 当特定文件或目录更改其状态时,支持基于路径激活的系统服务可以按需启动。Systemd 使用路径单元作为基于路径的激活。
- 挂载和自动挂载点管理 - Systemd 监控和管理挂载和自动挂载点。Systemd 使用 mount 单元作为挂载点 ,自动挂载单元用于自动挂载点。
- 积极并行化 - 由于使用了基于套接字的激活,因此所有监听套接字都就 systemd 可以并行启动系统服务。和支持按需激活的系统服务相结合,并行激活可大大减少引导系统所需的时间。
- 事务性单元激活逻辑 - 在激活或停用单元之前,systemd 计算其依赖项,创建临时交易,并验证此事务是否一致。如果事务不一致,systemd 会自动尝试更正它并从中删除非必要作业,然后再报告错误。
- 与 SysV init 的后向兼容性 - Systemd 支持 SysV init 脚本,如 Linux 标准基础核心规范 中所述,简化了到 systemd 服务单元的升级路径。
10.1.2. 兼容性更改
systemd 系统和服务管理器的主要设计思想是与 SysV init 和 Upstart 兼容。以下是与之前的 Red Hat Enterprise Linux 系统主发行版本相关的最显著兼容性变化:
Systemd 仅对运行级别提供有限支持。它提供了多个可直接映射到这些运行级别的目标单元,出于兼容性的原因,它也通过之前的
运行级别
命令进行分发。然而,并非所有 systemd 目标都可以直接映射到运行级别,因此此命令可能会返回N
来指明未知运行级别。建议您尽可能避免使用runlevel
命令。有关 systemd 目标及其与运行级别比较的详情请参考 第 10.3 节 “使用 systemd 目标”。
systemctl
程序不支持自定义命令。除了启动
、停止
和状态
等标准命令外,SysV init 脚本的作者还可以实施对任意命令的支持,以提供额外的功能。例如,可以使用panic
命令执行 Red Hat Enterprise Linux 6 中iptables
的 init 脚本,该命令会立即启用 panic 模式,再重新配置系统以开始丢弃所有传入和传出数据包。systemd 不支持,systemctl只
接受记录的命令。有关
systemctl
工具及其与之前的服务
工具比较的更多信息,请参阅 第 10.2 节 “管理系统服务”。-
systemctl
实用程序不会与 systemd 启动的服务通信。当 systemd 启动系统服务时,它会保存其主进程的 ID 以跟踪它。然后,systemctl
程序使用这个 PID 来查询和管理该服务。因此,如果用户直接在命令行启动某个特定的守护进程,systemctl
就无法决定其当前状态或停止它。 -
systemd 只停止运行的服务。在以前的版本中,当启动关闭序列时,Red Hat Enterprise Linux 6 及更早版本的系统使用位于
/etc/rc0.d/
目录中的符号链接来停止所有可用系统服务,而不考虑它们的状态。使用 systemd 时,只有运行的服务才会在关闭时停止。 -
系统服务无法从标准输入流读取。当 systemd 启动服务时,它会将其标准输入连接到
/dev/null
,以防止与用户进行任何交互。 -
系统服务不继承调用用户及其会话的任何上下文(如
HOME
和PATH
环境变量)。每个服务在干净的执行上下文中运行。 - 加载 SysV 初始化脚本时,systemd 会读取 Linux Standard Base(LSB)标头中编码的依赖信息,并在运行时对其进行解读。
- 服务单元中的所有操作都会有默认的 5 分钟超时,以防止出现故障的服务中断。这个值在从 initscripts 生成的且无法更改的服务中是被硬编码的。但是,单独的配置文件可用于指定每个服务更长的超时值,请参阅 例 10.21 “更改超时限制”
有关 systemd 引入的兼容性更改的详细列表,请参阅红帽企业 Linux 7 的迁移规划指南。