systemd:掩蔽单元

[ad_1]

欢迎回到我们关于 systemd 的后续系列。 在之前的文章中,我们讨论了管理您的服务的简单命令 Fedora 系统。 在这里,我们将讨论 systemd 使其非常强大的一个微妙之处:屏蔽。 不过,在我们开始屏蔽之前,让我们回顾一下服务的其他“关闭”级别。

前两个级别的“关闭”

你可能知道这些常见的 systemctl 命令:

systemctl start httpd.service
systemctl stop httpd.service

这些命令会立即生效,以根据其单元文件启动或停止 Web 服务器 (httpd)。 您可以将停止视为 第一级“关” 对于 systemd 中的一个单元。

您可能还记得这些常用命令:

systemctl enable httpd.service
systemctl disable httpd.service

这些命令不会立即生效。 他们确保服务将在下一次系统启动后启动(或不启动)。 您可以将禁用视为 二级“关” 对于系统单位。

您可能可以知道我们将在哪里进行此操作。 掩蔽是第三层,较少使用但非常强大。 但是在我们看屏蔽之前,我们需要了解它为什么存在:依赖关系。

单元依赖

不过,重要的是要记住,systemd 比传统的 init 启动系统更强大。 旧的 init 系统将按照文件名确定的顺序启动或停止服务。 这些文件通常是放置在以它们应该在其中运行的运行级别命名的目录中的链接。 (如果您需要在运行级别上刷新内存,请参阅这篇较早的 systemd 文章。)例如,考虑这个旧的 initscript 链接:

/etc/rc3.d/S40myservice -> /etc/init.d/myservice

此链接存在于 /etc/rc3.d/ 文件夹中。 该链接确定了系统进入运行级别 3 或多用户模式时发生的情况。 名称中的 S 表示脚本将以启动模式运行。 相反,AK 将指示脚本将被停止(终止)。 数字 40 是排序的指标。 编号较低的脚本在此之前运行,编号较高的脚本稍后运行。 实际脚本本身位于 /etc/init.d/ 文件夹中。

与 systemd 的功能相比,这似乎有点原始! 回想一下,systemd 可以理解单元之间的依赖关系。 这意味着 systemd 可以判断何时必须启动一个单元以允许另一个单元运行。

此外,systemd 使用此信息来启动所需的服务, 即使被禁用, 来满足依赖。 作为一个例子,我们来看看 httpd.service 的一些依赖:

$ systemctl list-dependencies httpd.service
httpd.service
 ● ├─-.mount
 ● ├─system.slice
 ● ├─tmp.mount
 ● ├─var.mount
 ● └─basic.target
 ●   └─-.mount
 ●   ├─alsa-restore.service
...

该图向我们展示了 Web 服务器单元所依赖的所有单元。 请注意,该图是递归的,这意味着它还显示了依赖项的依赖关系。

让我们看看禁用依赖项的效果。 假设在 systemd 中启用了 httpd.service。 现在我们使用以下命令禁用 system.slice 服务:

systemctl disable system.slice

顺便说一句,禁用这个单元并不是一个好主意。 理论上它可能会影响 systemd 启动的每个服务! 然而,碰巧的是,我们是否这样做并不重要。 因为 httpd.service 依赖于 system.slice,禁用没有效果。 systemd 了解 httpd.service 的要求,因此无论如何都会启动 system.slice。

现在,您有望开始理解掩蔽存在的原因。 它允许管理员强制 systemd 按指示执行,即使它不合逻辑。

掩蔽:第三级

您可能还记得 systemd 使用多个位置来存储单元信息。 如果没有,请随时参考我们之前关于单元文件的文章以刷新您的记忆。 为了记录单元掩码,systemd 使用 /etc/systemd/ 中的本地系统配置文件。 它写入一个指向 /dev/null 的链接文件,这是 UNIX 和 Linux 中著名的“无”文件。 因此,例如,屏蔽 httpd.service 将导致此链接:

$ sudo systemctl mask httpd.service
Created symlink from /etc/systemd/system/httpd.service to /dev/null.

请注意,这等效于运行以下命令:

$ sudo ln -s /dev/null /etc/systemd/system/httpd.service

现在尝试手动启动 Web 服务器:

systemctl start httpd.service

您将看到以下错误消息:

Failed to start httpd.service: Unit httpd.service is masked

这是 第三级“关” 在系统中。 如果您使用屏蔽的单元启动,它甚至不会运行以满足依赖关系。 由于这个原因,掩蔽是强大的。 但是像其他强大的命令一样,你应该小心使用它。 如果你屏蔽了一个重要的单元(比如前面提到的 system.slice),你可以阻止你的系统正常启动。 要取消屏蔽该单元,请使用以下命令:

systemctl unmask httpd.service

希望您现在可以更加了解 systemd 单元和依赖项的强大功能。有关屏蔽的其他说明,请参阅 这个帖子 来自“systemd for administrators”博客系列。 很快再见,我们的下一个 systemd 分期付款!

[ad_2]

Related Posts