systemd 单元文件基础知识

欢迎回到 systemd 系列,我们将在其中探索更多关于您的核心部分如何 Fedora 系统工作。 本期讨论单元文件。

作为长期 Fedora 用户,直到最近我才真正想到 systemd 实际工作。 systemd 是划分的,因此可以更轻松地管理系统的组件。 systemd 使用单元文件来配置和管理系统资源,例如进程和文件系统。 使用这些文件,您可以使用 systemd 来管理您的 Fedora 系统的方式你想要的。

单元文件:它们是什么?

系统上的单元文件决定了 systemd 将如何启动和运行。 每一个都对应一个活动或组件——或 systemd 术语中的单元。 每个单元文件都是一个简单的文本文件,描述了一个单元、它的作用、之前或之后需要运行的内容以及其他详细信息。

单元文件可以存储在系统上的几个不同位置。 systemd 按以下顺序查找系统单元文件:

  1. /etc/systemd/系统
  2. /运行/systemd/系统
  3. /usr/lib/systemd/系统

早期目录中的单元文件会覆盖后面的。 这是一个有用的方案,因为它允许您在需要配置的 /etc 目录中进行更改。 您应该避免在 /usr 中进行更改。 您的系统会在那里安装预计不会更改的包数据。

systemd 还可以在用户上下文中运行,除了系统端之外,还可以管理每个用户的资源。 用户单元的单元文件类似地存储在 /etc/systemd/user、/run/systemd/user 和 /usr/lib/systemd/user 中。 优先顺序的工作原理类似。

您可以使用 systemctl 命令检查有关这些单元文件的一些详细信息。 如果要查看系统上安装的所有单元文件的列表,请运行以下命令:

systemctl list-unit-files

每个单元文件都包含 OptionName=value 形式的选项,分为标记为 [SectionName]. 这些选项描述了该单元是如何工作的,以及 systemd 如何处理它。

systemd 可以理解多种类型的单位。 系统所有者最常处理的两个是服务单元和目标单元。 要列出系统上每种类型的单元文件,请使用 systemctl 命令:

systemctl list-unit-files --type service
systemctl list-unit-files --type target

服务单位

这些是描述 systemd 可以启动和监视的进程的单元。 服务单位是您日常使用的最常见单位。 它们使用 systemctl 作为 root 进行控制:

sudo systemctl [command] NAME.service

典型的命令包括:

  • start: 启动一个 systemd 单元
  • 停止:尝试“很好地”结束服务
  • 状态:提供有关服务的详细信息
  • restart:重新启动(停止然后启动)指定的服务
  • enable:将一个单元挂钩(链接)到不同的地方,例如在启动时运行
  • 禁用:取消挂钩(取消链接)一个单元,因此它不会被激活

以下 example 是 sshd.service 单元文件。 它允许 systemd 控制 sshd 守护程序,该守护程序允许通过 SSH(安全外壳)远程访问您的系统。

[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
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

该单元具有一些常见的单元文件选项和特定于服务单元的选项。 此处看到的常见选项包括描述和在哪里可以找到文档。 这个单元文件中的内容显然比本文所能解释的要多。 但正如您可能从 ExecStart 选项中猜到的那样,该单元在启动时会运行 sshd 守护进程。

服务拥有的流程

systemd 的一个有趣特性是它监视从服务单元开始的进程。 要找出正在监视的进程,请使用 systemctl status 命令。 例如,这是检查 sshd.service 单元状态的命令的输出:

● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2015-10-20 14:51:24 EDT; 1 weeks 0 days ago
   Docs: man:sshd(8)
         man:sshd_config(5)
   Main PID: 1090 (sshd)
   CGroup: /system.slice/sshd.service
           └─1090 /usr/sbin/sshd -D

我们可以看到这个服务启动的进程的进程ID(PID)为1090,这个进程会继续被systemd监控。

另请注意,该服务已将此进程放置在一个特别命名的控制组中。 控制组(或“cgroup”)允许 systemd 一起管理关联的进程。 在本系列的后续文章中,我们将探讨此功能如何让您调整性能和资源限制。

由于了解该服务拥有的进程,systemd 还可以帮助您管理错误的服务。 通常,当您停止服务时,您将使用前面提到的 systemctl 命令。 为了 example停止 Web 服务器服务:

systemctl stop httpd.service

但是如果服务没有响应或合作怎么办? 在这种情况下, systemctl 有一个内置的终止开关:

systemctl kill httpd.service

目标单位

目标单元用于将其他单元链接和组合在一起以描述所需的系统状态。 其中一些单位可能是服务。 其他可能是具有自己的单位组的附加目标单位。

这是一个 examplemulti-user.target 单元文件。

[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes

请注意,此目标单元文件不包含要执行的命令。 相反,它的功能纯粹是作为一种将其他单元(在这种情况下,主要是目标)连接在一起的方式。 在这种情况下:

  • multi-user.target 要求在 multi-user.target 运行时 basic.target 运行成功。
  • 如果rescue.service 或rescue.target 单元运行,它们将导致该单元停止,反之亦然。
  • multi-user.target 单元在 basic.target 启动后启动,并且在rescue.service 和rescue.target 运行后启动(如果它们已启动)。

此外,此目标单元包括 AllowIsolate 选项。 此选项允许您的系统使用 systemctl isolate 命令将 multi-user.target 单元视为引导目标。

目标单元将其他单元组合在一起,而不仅仅是它们的单元文件内容。 目标也可以有一个 .wants 目录,该目录链接到将与目标一起启动的单元。 例如,/usr/lib/systemd/system/multi-user.target 文件有一个关联的文件夹 /usr/lib/systemd/system/multi-user.target.wants。 此目录包含指向将在运行此目标时运行的单元(不仅是服务,还包括其他目标)的链接。 其中每一个都可能有自己的依赖项,或者像上面的 Requires 这样的单元文件选项。

有用的参考资料

要深入了解常见的单元部分选项,您可以阅读单元的手册页:

man systemd.unit

服务和目标文件也有特定的文档文件。 您可以使用以下命令阅读它们:

man systemd.service
man systemd.target

如果您正在寻找有关 systemd 中进程和控制组管理的更多信息,请参阅 这个有用的博客条目.