多年来,我阅读了许多关于 systemd 如何试图取代一切并掌控 Linux 中一切的文章和帖子。我同意;它确实在掌控几乎一切。
但并非真正意义上的“一切”。只是“一切”都在内核和 GNU core utilities、图形用户界面桌面和用户应用程序等事物之间的中间服务层中。
检查 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 主机,这种缺乏标准化是一个问题。我还遇到了由试图赶上 Linux 潮流并且不知道如何为 Linux 创建软件(尤其是必须包含在 Linux 启动序列中的服务)的开发人员创建的可怕的配置文件和 SystemV 启动文件。
systemd 单元文件标准化了配置,并强制执行启动方法和组织,从而提供了一定程度的安全性,避免了编写不佳的 SystemV 启动脚本。它们还提供了系统管理员可以用来监控和管理服务的工具。
Lennart Poettering 写了一篇简短的博客文章,描述了常用关键 systemd 配置文件的标准名称和位置。这种标准化使系统管理员的工作更容易。它还使在具有多个 Linux 发行版本的环境中自动化管理任务变得更容易。开发人员也从这种标准化中受益。
有时,痛苦是难免的
像替换和扩展整个 init 系统这样大规模的 undertaking 在过渡期间会造成一定程度的痛苦。我不介意学习新命令以及如何创建各种类型的配置文件,例如 targets、timers 等。这确实需要一些工作,但我认为结果非常值得付出努力。
新的配置文件和拥有和管理它们子系统的更改起初也可能看起来令人生畏。更不用说有时像 systemd-resolvd 这样的新工具可能会破坏长期以来的工作方式,正如我在使用 Ansible 解决 systemd-resolved 名称服务故障中指出的那样。
脚本和 Ansible 等工具可以在我们等待解决痛苦的更改时减轻痛苦。
结论
正如我在学习喜爱 systemd中写到的,我可以使用 SystemV 或 systemd init 系统,并且我有喜欢和不喜欢它们各自的理由
“……SystemV 和 systemd 之间的大部分争议的真正问题和根本原因是,在系统管理员级别没有选择。是否使用 SystemV 或 systemd 的选择已经由各种发行版本的开发人员、维护人员和打包人员做出——但这是有充分理由的。由于 init 系统的极端侵入性,将其移除和替换会产生许多后果,这些后果在发行版本设计过程之外很难解决。”
由于这种大规模的替换是一项如此庞大的 undertaking,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 的详细技术信息以及创建它的原因,请查看 Freedesktop.org 的 systemd 描述。此页面是我发现的最好的页面之一,因为它包含许多指向其他重要且准确文档的链接。
- Linux.com 的“更多 systemd 乐趣”提供了更高级的 systemd 信息和技巧。
Lennart Poettering(systemd 的设计者和主要开发者)还为 Linux 系统管理员撰写了一系列深入的技术文章。他在 2010 年 4 月至 2011 年 9 月期间撰写了这些文章,但它们现在仍然像当时一样具有现实意义。关于 systemd 及其生态系统的大部分优秀文章都基于这些论文。这些链接都可以在 FreeDesktop.org 上找到。
9 条评论