多年来,我阅读过许多关于 systemd 如何试图取代一切并掌控 Linux 中一切的文章和帖子。我同意;它确实几乎掌控了一切。
但并非真正地“一切-一切”。只是内核与 GNU 核心实用程序、图形用户界面桌面和用户应用程序等事物之间的中间服务层中的“一切”。
检查 Linux 的结构是探索这一点的途径。下图显示了操作系统中发现的三个基本软件层。底层是 Linux 内核;中间层由可能执行启动任务的服务组成,例如启动各种其他服务,如网络时间协议 (NTP)、动态主机配置协议 (DHCP)、域名系统 (DNS)、安全外壳 (SSH)、设备管理、登录服务、gettys、网络管理器、日志和日志管理、逻辑卷管理、打印、内核模块管理、本地和远程文件系统、声音和视频、显示管理、交换空间、系统统计信息收集等等。顶层还有成千上万个新的、强大的应用程序。

systemd 及其管理的服务,以及内核和应用程序程序,包括系统管理员使用的工具。(David Both, CC BY-SA 4.0)
这张图表(以及系统管理员在过去几年中的集体经验)清楚地表明,systemd 的确旨在完全取代旧的 SystemV init 系统。但我也知道(并在本 systemd 系列的前几篇文章中解释过),它显着扩展了 init 系统的功能。
同样重要的是要认识到,虽然 Linus Torvalds 重写了 Unix 内核作为一项练习,但他没有做任何事情来改变系统服务的中间层。他只是重新编译了 SystemV init 以与他全新的内核一起工作。SystemV 比 Linux 早得多,并且几十年来一直需要彻底改变为全新的东西。
因此,内核是新的,并且通过 Torvalds 的领导和全球数千名程序员的工作而频繁更新。上图顶层的所有程序也做出了贡献。
但在最近之前,init 系统和系统服务管理方面一直没有重大改进。
在编写 systemd 时,Lennart Poettering 为系统服务所做的事情,就像 Linus Torvalds 为内核所做的事情一样。像 Torvalds 和 Linux 内核一样,Poettering 已成为这个中间系统服务层内部发生的事情的领导者和仲裁者。我喜欢我所看到的。
更多管理员数据
systemd 的新功能包括关于服务的更多状态信息,无论它们是否正在运行。我喜欢拥有更多关于我正在尝试监控的服务的信息。例如,看看 DHCPD 服务。如果我使用 SystemV 命令 service dhcpd status
,我只会收到一条简单的消息,指示服务正在运行还是已停止。使用 systemd 命令 systemctl status dhcpd
,我会获得更有用的信息。
此数据来自我个人网络上的服务器
[root@yorktown ~]# systemctl status dhcpd
● dhcpd.service - DHCPv4 Server Daemon
Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2021-04-09 21:43:41 EDT; 4 days ago
Docs: man:dhcpd(8)
man:dhcpd.conf(5)
Main PID: 1385 (dhcpd)
Status: "Dispatching packets..."
Tasks: 1 (limit: 9382)
Memory: 3.6M
CPU: 240ms
CGroup: /system.slice/dhcpd.service
└─1385 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid
Apr 14 20:51:01 yorktown.both.org dhcpd[1385]: DHCPREQUEST for 192.168.0.7 from e0:d5:5e:a2:de:a4 via eno1
Apr 14 20:51:01 yorktown.both.org dhcpd[1385]: DHCPACK on 192.168.0.7 to e0:d5:5e:a2:de:a4 via eno1
Apr 14 20:51:14 yorktown.both.org dhcpd[1385]: DHCPREQUEST for 192.168.0.8 from e8:40:f2:3d:0e:a8 via eno1
Apr 14 20:51:14 yorktown.both.org dhcpd[1385]: DHCPACK on 192.168.0.8 to e8:40:f2:3d:0e:a8 via eno1
Apr 14 20:51:14 yorktown.both.org dhcpd[1385]: DHCPREQUEST for 192.168.0.201 from 80:fa:5b:63:37:88 via eno1
Apr 14 20:51:14 yorktown.both.org dhcpd[1385]: DHCPACK on 192.168.0.201 to 80:fa:5b:63:37:88 via eno1
Apr 14 20:51:24 yorktown.both.org dhcpd[1385]: DHCPREQUEST for 192.168.0.6 from e0:69:95:45:c4:cd via eno1
Apr 14 20:51:24 yorktown.both.org dhcpd[1385]: DHCPACK on 192.168.0.6 to e0:69:95:45:c4:cd via eno1
Apr 14 20:52:41 yorktown.both.org dhcpd[1385]: DHCPREQUEST for 192.168.0.5 from 00:1e:4f:df:3a:d7 via eno1
Apr 14 20:52:41 yorktown.both.org dhcpd[1385]: DHCPACK on 192.168.0.5 to 00:1e:4f:df:3a:d7 via eno1
[root@yorktown ~]#
在一个命令中获得所有这些可用信息,使我能够更轻松地确定问题。我在一开始就获得了更多信息。我不仅看到服务已启动并正在运行,还看到了一些最新的日志条目。
这是另一个使用非操作系统工具的示例。BOINC,伯克利开放基础设施网络计算客户端,用于从全球数百万家庭计算机中创建临时超级计算机,这些计算机已注册参与许多类型科学研究的计算阶段。我已注册 IBM World Community Grid 并参与关于 COVID-19、绘制癌症标记、非洲降雨等的研究。
来自此命令的信息让我更全面地了解此服务的运行状况
[root@yorktown ~]# systemctl status boinc-client.service
● boinc-client.service - Berkeley Open Infrastructure Network Computing Client
Loaded: loaded (/usr/lib/systemd/system/boinc-client.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2021-04-09 21:43:41 EDT; 4 days ago
Docs: man:boinc(1)
Main PID: 1389 (boinc)
Tasks: 18 (limit: 9382)
Memory: 1.1G
CPU: 1month 1w 2d 3h 42min 47.398s
CGroup: /system.slice/boinc-client.service
├─ 1389 /usr/bin/boinc
├─712591 ../../projects/www.worldcommunitygrid.org/wcgrid_mcm1_map_7.43_x86_64-pc-linux-gnu -SettingsFile MCM1_0174482_7101.txt -DatabaseFile dataset>
├─712614 ../../projects/www.worldcommunitygrid.org/wcgrid_mcm1_map_7.43_x86_64-pc-linux-gnu -SettingsFile MCM1_0174448_7280.txt -DatabaseFile dataset>
├─713275 ../../projects/www.worldcommunitygrid.org/wcgrid_opn1_autodock_7.17_x86_64-pc-linux-gnu -jobs OPN1_0040707_05092.job -input OPN1_0040707_050>
├─713447 ../../projects/www.worldcommunitygrid.org/wcgrid_mcm1_map_7.43_x86_64-pc-linux-gnu -SettingsFile MCM1_0174448_2270.txt -DatabaseFile dataset>
├─713517 ../../projects/www.worldcommunitygrid.org/wcgrid_opn1_autodock_7.17_x86_64-pc-linux-gnu -jobs OPN1_0040871_00826.job -input OPN1_0040871_008>
├─713657 ../../projects/www.worldcommunitygrid.org/wcgrid_mcm1_map_7.43_x86_64-pc-linux-gnu -SettingsFile MCM1_0174525_7317.txt -DatabaseFile dataset>
├─713672 ../../projects/www.worldcommunitygrid.org/wcgrid_mcm1_map_7.43_x86_64-pc-linux-gnu -SettingsFile MCM1_0174529_1537.txt -DatabaseFile dataset>
└─714586 ../../projects/www.worldcommunitygrid.org/wcgrid_opn1_autodock_7.17_x86_64-pc-linux-gnu -jobs OPN1_0040864_01640.job -input OPN1_0040864_016>
Apr 14 19:57:16 yorktown.both.org boinc[1389]: 14-Apr-2021 19:57:16 [World Community Grid] Finished upload of OPN1_0040707_05063_0_r181439640_0
Apr 14 20:57:36 yorktown.both.org boinc[1389]: 14-Apr-2021 20:57:36 [World Community Grid] Sending scheduler request: To report completed tasks.
Apr 14 20:57:36 yorktown.both.org boinc[1389]: 14-Apr-2021 20:57:36 [World Community Grid] Reporting 1 completed tasks
Apr 14 20:57:36 yorktown.both.org boinc[1389]: 14-Apr-2021 20:57:36 [World Community Grid] Not requesting tasks: don't need (job cache full)
Apr 14 20:57:38 yorktown.both.org boinc[1389]: 14-Apr-2021 20:57:38 [World Community Grid] Scheduler request completed
Apr 14 20:57:38 yorktown.both.org boinc[1389]: 14-Apr-2021 20:57:38 [World Community Grid] Project requested delay of 121 seconds
Apr 14 21:38:03 yorktown.both.org boinc[1389]: 14-Apr-2021 21:38:03 [World Community Grid] Computation for task MCM1_0174482_7657_1 finished
Apr 14 21:38:03 yorktown.both.org boinc[1389]: 14-Apr-2021 21:38:03 [World Community Grid] Starting task OPN1_0040864_01640_0
Apr 14 21:38:05 yorktown.both.org boinc[1389]: 14-Apr-2021 21:38:05 [World Community Grid] Started upload of MCM1_0174482_7657_1_r1768267288_0
Apr 14 21:38:09 yorktown.both.org boinc[1389]: 14-Apr-2021 21:38:09 [World Community Grid] Finished upload of MCM1_0174482_7657_1_r1768267288_0
[root@yorktown ~]#
关键是 BOINC 客户端作为守护程序运行,应由 init 系统管理。所有作为守护程序运行的软件都应由 systemd 管理。事实上,即使是仍然提供 SystemV 启动脚本的软件也由 systemd 管理。
systemd 标准化配置
多年来,我遇到的问题之一是,即使“Linux 就是 Linux”,并非所有发行版都将它们的配置文件存储在相同的位置,或者使用相同的名称,甚至格式。在全球拥有大量 Linux 主机的情况下,缺乏标准化是一个问题。我还遇到过糟糕的配置文件和 SystemV 启动文件,这些文件是由试图赶上 Linux 潮流并且不知道如何为 Linux 创建软件的开发人员创建的,尤其是必须包含在 Linux 启动序列中的服务。
systemd 单元文件标准化了配置,并实施了一种启动方法和组织,从而提供了一定程度的安全性,防止编写不佳的 SystemV 启动脚本。它们还提供了系统管理员可以用来监控和管理服务的工具。
Lennart Poettering 写了一篇简短的博文,描述了常见关键 systemd 配置文件的标准名称和位置。这种标准化使系统管理员的工作更加轻松。它还使在具有多个 Linux 发行版本的环境中自动化管理任务变得更容易。开发人员也从这种标准化中受益。
有时,痛苦是难免的
任何像替换和扩展整个 init 系统这样庞大的事业,在过渡期间都会造成一定程度的痛苦。我不介意学习新命令以及如何创建各种类型的配置文件,例如目标、计时器等等。这确实需要一些工作,但我认为结果非常值得付出努力。
新的配置文件和拥有并管理它们的子系统中的更改,一开始也可能让人望而生畏。更不用说有时像 systemd-resolved 这样的新工具会破坏长期以来的工作方式,正如我在使用 Ansible 解决 systemd-resolved 名称服务故障中指出的那样。
在我们等待解决痛苦的更改时,脚本和 Ansible 等工具可以减轻痛苦。
结论
正如我在学习喜爱 systemd中写道的那样,我可以使用 SystemV 或 systemd init 系统,并且我有喜欢和不喜欢它们各自的原因
“……SystemV 和 systemd 之间的大部分争议的真正问题和根本原因是,在系统管理员级别没有选择。是否使用 SystemV 或 systemd 的选择已经由各种发行版的开发人员、维护人员和打包人员做出——但这是有充分理由的。挖出并替换 init 系统,就其极端、侵入性的本质而言,会产生很多后果,这些后果在发行版设计过程之外很难解决。”
由于这种整体替换是一项如此庞大的事业,systemd 的开发人员多年来一直在分阶段工作,并替换 init 系统和服务的各个部分,以及不属于 init 系统但应该属于 init 系统的工具。systemd 的许多新功能只有通过其与用于管理现代 Linux 系统的服务和工具的紧密集成才有可能实现。
尽管在此过程中遇到了一些痛苦,并且无疑还会有更多痛苦,但我认为长期计划和目标是好的。我所体验到的 systemd 的优势非常显着。
没有掌控世界的邪恶计划,只是为了将服务管理带入 21 世纪。
其他资源
互联网上有大量关于 systemd 的信息,但其中很多都很简洁、晦涩甚至具有误导性。除了本文中提到的资源外,以下网页还提供了关于 systemd 启动的更详细和可靠的信息。自从我开始撰写本系列文章以来,此列表一直在增长,以反映我所做的研究。
- 系统管理员喜爱 systemd 的 5 个理由
- Fedora 项目有一个很好、很实用的systemd 指南。它几乎包含了您需要知道的一切,以便使用 systemd 配置、管理和维护 Fedora 计算机。
- Fedora 项目还有一个很好的备忘单,它将旧的 SystemV 命令交叉引用到可比较的 systemd 命令。
- systemd.unit(5) 手册页包含一个很好的单元文件部分及其配置选项列表,以及每个部分的简洁描述。
- Fedora Magazine 对单元文件结构以及其他重要信息进行了很好的描述。
- 有关 systemd 的详细技术信息以及创建 systemd 的原因,请查看 Freedesktop.org 的systemd 描述。此页面是我发现的最好的页面之一,因为它包含许多指向其他重要且准确文档的链接。
- Linux.com 的“更多 systemd 乐趣”提供了更高级的 systemd 信息和技巧。
Lennart Poettering(systemd 的设计者和主要开发人员)还为 Linux 系统管理员撰写了一系列深入的技术文章。他于 2010 年 4 月至 2011 年 9 月之间撰写了这些文章,但它们现在与当时一样具有相关性。关于 systemd 及其生态系统的大部分优秀著作都基于这些论文。这些链接都可以在 FreeDesktop.org 上找到。
9 条评论