Red Hat Training

A Red Hat training course is available for RHEL 8

第 13 章 systemd 简介

Systemd 是 Linux 操作系统的系统和服务管理器。它旨在与 SysV 初始化脚本向后兼容,它提供很多功能,比如在引导时并行启动系统服务、按需激活守护进程或基于依赖项的服务控制逻辑。从 Red Hat Enterprise Linux 7 开始, systemd 替换了 Upstart 作为默认 init 系统。

systemd 引进了 systemd 单元 的概念。这些单元由位于下表中列出的目录之一的单元配置文件来表示。

表 13.1. systemd 单元文件位置

目录描述

/usr/lib/systemd/system/

安装的 RPM 软件包中的 systemd 单元文件。

/run/systemd/system/

在运行时创建的 systemd 单元文件。该目录优先于安装了的服务单元文件的目录。

/etc/systemd/system/

Systemd 单元文件由 systemctl enable 创建,并添加用于扩展服务的单元文件。这个目录优先于带有运行时单元文件的目录。

单元封装了以下相关信息:

  • 系统服务
  • 侦听套接字
  • 与 init 系统相关的其他对象

有关可用 systemd 单元类型的完整列表,请查看下表。

表 13.2. 可用的 systemd 单元类型

单位类型文件扩展描述

服务单元

.service

系统服务。

目标单元

.target

一组 systemd 单元。

Automount 单元

.automount

文件系统自动挂载点。

设备单元

.device

内核可识别的设备文件。

挂载单位

.mount

文件系统挂载点。

路径单元

.path

文件系统中的一个文件或者目录。

Scope 单元

.scope

外部创建的进程。

Slice 单元

.slice

一组管理系统进程的分层组织单元。

套接字单元

.socket

进程间的通信套接字。

Swap 单元

.swap

一个交换设备或者一个交换文件。

计时器单元

.timer

systemd 计时器。

使用 system.conf 覆盖默认的 systemd 配置

默认 systemd 配置是在编译过程中定义的,它可在 /etc/systemd/system.conf 的 systemd 配置文件中找到。如果您想与那些默认值分离,并全局覆盖所选的 systemd 单元默认值,请使用这个文件。

例如:要覆盖超时限制的默认值(设置为 90 秒),请使用 DefaultTimeoutStartSec 参数输入所需的值,以秒为单位。

DefaultTimeoutStartSec=required value

有关详情请参考 例 17.2 “更改超时限制”

13.1. 主要特性

systemd 系统和服务管理器提供以下主要功能:

  • 基于套接字的激活 - 在引导时, systemd 会为所有支持这类激活的系统服务创建侦听套接字,并在启动后将套接字传递给这些服务。这不仅允许 systemd 并行启动服务,还可以在不可用时丢失任何信息来重启服务:对应的套接字可一直访问,并将所有信息放入队列。

    Systemd 使用 套接字单元进行基于套接字的激活。

  • 基于总线的激活 - 使用 D-Bus 进行进程间通信的系统服务可以按需启动,同时客户端应用程序第一次尝试与它们通信。Systemd 使用 D-Bus 服务文件 进行基于总线的激活。
  • 基于设备的激活 - 支持基于设备的激活的系统服务可以按需启动,当特定类型的硬件插入或变得可用时。systemd 使用设备单元作为基于设备的激活。
  • 基于路径的激活 - 当某个特定文件或目录改变其状态时,支持基于路径的激活的系统服务可以按需启动。systemd 使用 路径单位作为基于路径的激活。
  • 挂载和自动挂载点管理 - Systemd 监控并管理挂载和自动挂载点。Systemd 使用 mount 单元用于挂载点, automount 单元 用于自动挂载点。
  • 活跃的 并行化 - 因为使用基于套接字的激活,所以 systemd 可以在所有监听套接字都存在后马上并行启动系统服务。和支持按需激活的系统服务相结合,并行激活可大大减少引导系统所需的时间。
  • 事务单元激活逻辑 - 在激活或取消激活一个单元前, systemd 计算其依赖项,创建一个临时事务,并验证这个事务是否一致。如果事务不一致, systemd 会自动尝试更正它,并在报告错误前从中移除非必要作业。
  • 与 SysV init 的后向兼容性 - Systemd 支持 SysV init 脚本,如 Linux Standard Base Core Specification 所述,这可简化对 systemd 服务单元的升级路径。

13.2. 兼容性更改

systemd 系统和服务管理器的主要设计思想是与 SysV init 和 Upstart 兼容。以下是与使用 SysV init 的 Red Hat Enterprise Linux 6 系统相关的最显著兼容性更改:

  • Systemd 只对运行级别(runlevel)提供有限支持。它提供了很多目标单元,它们可以直接映射到这些运行级别,并且出于兼容性的原因,它也会使用之前的 runlevel 命令发布。不是所有 systemd 目标都可以直接映射到运行级别,因此这个命令可能会返回 N 以指示未知运行级别。建议您尽可能避免使用 runlevel 命令。
    有关 systemd 目标及其与运行级别比较的详情请参考 第 15 章 使用 systemd 目标
  • systemctl 工具不支持自定义命令。除了标准命令,如 startstopstatus 外,SysV 初始化脚本的作者也可以实现对任意任意命令的支持,以便提供额外的功能。例如: iptables 的初始化脚本可以使用 panic 命令执行,该命令会立即启用 panic 模式并重新配置系统以开始丢弃所有传入和传出的数据包。systemd 不支持这个设置, systemctl 只接受记录的命令。
  • systemctl 实用程序不会与 systemd 启动的服务进行通信。当 systemd 启动系统服务时,它会保存其主进程的 ID 以跟踪它。然后, systemctl 工具会使用这个 PID 来查询和管理该服务。因此,如果用户直接在命令行启动特定的守护进程, systemctl 将无法决定其当前状态或停止它。
  • Systemd 只停止运行的服务。在以前的版本中,当启动关闭序列时,Red Hat Enterprise Linux 6 以及之前的发行本都使用位于 /etc/rc0.d/ 目录中的符号链接停止所有可用的系统服务,而不考虑它们的状态。使用 systemd 时,只有运行的服务才会在关闭时停止。
  • 系统服务无法从标准输入流读取。当 systemd 启动服务时,它会将其标准输入连接到 /dev/null,以防止与用户交互。
  • 系统服务不会从调用用户及其会话继承任何上下文(如 HOMEPATH 环境变量)。每个服务在干净执行环境中运行。
  • 当载入 SysV init 脚本时, systemd 会读取 Linux Standard Base(LSB)标头中编码的依赖项信息,并在运行时解释它。
  • 服务单元中的所有操作都会被默认超时 5 分钟,以防止出现故障的服务中断。这个值在从 initscripts 生成的且无法更改的服务中是被硬编码的。但是,各个配置文件可以用来指定一个较长的超时值,请参阅 例 17.2 “更改超时限制”

有关使用 systemd 引进的兼容性更改的详细列表,请查看 Red Hat Enterprise Linux 7 的 迁移规划指南