为什么我支持 systemd 掌控世界的计划

这并非邪恶的计划,只是为了将服务管理带入 21 世纪。
67 位读者喜欢这篇文章。
A rack of servers, blue background

opensource.com

多年来,我阅读过许多关于 systemd 如何试图取代一切并掌控 Linux 中一切的文章和帖子。我同意;它确实几乎掌控了一切。

但并非真正地“一切-一切”。只是内核与 GNU 核心实用程序、图形用户界面桌面和用户应用程序等事物之间的中间服务层中的“一切”。

检查 Linux 的结构是探索这一点的途径。下图显示了操作系统中发现的三个基本软件层。底层是 Linux 内核;中间层由可能执行启动任务的服务组成,例如启动各种其他服务,如网络时间协议 (NTP)、动态主机配置协议 (DHCP)、域名系统 (DNS)、安全外壳 (SSH)、设备管理、登录服务、gettys、网络管理器、日志和日志管理、逻辑卷管理、打印、内核模块管理、本地和远程文件系统、声音和视频、显示管理、交换空间、系统统计信息收集等等。顶层还有成千上万个新的、强大的应用程序。

systemd services

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 上找到。

接下来阅读什么

学习喜爱 systemd

systemd 是所有进程之母,负责将 Linux 主机启动到可以进行生产性工作的状态。

(通讯员)
2020 年 4 月 16 日
David Both
David Both 是一位开源软件和 GNU/Linux 倡导者、培训师、作家和演讲者。自 1996 年以来,他一直从事 Linux 和开源软件工作,自 1969 年以来一直从事计算机工作。他是“系统管理员 Linux 哲学”的坚定支持者和传播者。

9 条评论

David,您就 SysV init 的年代久远提出了一个很好的观点,它也存在于 Solaris 操作系统中,而 Sun 着手替换它。他们的解决方案是 SMF,即服务管理工具。因此,我认为您支持 systemd 的论点非常有效。

因此,我们又看到一篇专注于将 systemd 插入生态系统的积极方面的文章,但完全忽略了如果您想要获得好处,则必须承担的所有其他负面影响。最初的“让我们把 init 做得更好”的概念是好的,我曾经是 systemd 的坚定拥护者,直到决定切换到所有相关功能的现有机制。如果发生灾难性故障,需要大量工作的二进制日志文件毫无意义,而且不断扩大的范围并没有激发信心。
如果 systemd 中存在混合搭配功能,敌意会大大减少,但全有或全无的性质简单地证明了未能从过去吸取教训(一个词概括了这一点:regedit.exe)

Systemd 是两件事

(A)桌面 Linux “尾巴”摇晃服务器/嵌入式“整只狗”,以及(B)至少对于服务器和嵌入式世界来说,是对一个未被提出的问题的回答。

基本上,Systemd 的所有“功能”——从使用 Microsoft INI 格式的定义文件配置服务,到将整个操作系统配置捆绑到一个单独的程序中,都是仅在桌面环境中“有意义”的事情……

更快到达登录提示符的目标——所有这些的主要理由——同样是“桌面事物”……

但是……桌面 Linux(除了 ChromeOS)无关紧要,而且永远都是如此……

这不是业余爱好者/传道者社区想听到的,但这是事实。

在服务器环境中,没有必要将解析器、网络配置管理器、记录器、init 系统、设备节点命名和进程间通信总线组合成一个不可分割的大 blob……

这些东西都不会改善无头 Linux 服务器的运行方式……这一切都只是为了改变而改变……

它所做的只是增加复杂性、混乱(启动不再按顺序完成,而是事物随机并行启动)和攻击面……

有什么好处?为了满足 Pottering 先生对 .ini 文件格式而不是 shell 脚本或二进制“日志”而不是基于文本的日志文件的偏好?

幸运的是,即使 RedHat 也没有完全采用最后一种——日志仍然最终出现在 /var/log 中……

哇!David,您的学术造诣令人惊叹。我再次从阅读本文中受益匪浅。

我在文章中看到了很多次“新”这个词。新有多新?Fedora Linux 15 是第一个将 systemd 作为默认设置的发行版,它在 10 年前(几天后)发布。RHEL 7 将其作为默认设置,Debian 8 及更高版本和 Ubuntu LTS 16.04 及更高版本也是如此。当然,systemd 经常添加新功能。

关于二进制日志与文本日志……您不必在持久模式下运行 systemd,如果您愿意,可以运行您首选的更传统的日志记录系统。嘿,这就是 RHEL7 和 8 默认情况下一直在做的事情。我个人更喜欢二进制日志,并且在使用它的这些年中没有遇到任何“灾难性故障”。如果丢失日志将是灾难性故障,则可以根据需要以各种基于文本的格式导出它们……以及备份……不,systemd 不是一个完成所有事情的大型二进制文件。有几十个甚至几十个二进制文件。

我假设你们都切换到 Devuan 了?没有?

多年来,我真的开始喜欢 systemd 了。我记得第一年有点恼火,当时我正在学习新的做事方式。enable、start、stop、restart、reload、mask(?!!!) 但标准化的模式开始变得清晰,然后当我深入挖掘时,我发现我可以轻松编写自己的单元并将软件集成到生态系统中。嘿,这很酷。

关于 journald 使用二进制日志文件的抱怨起初看起来有点吓人,但当我熟悉 journalctl 后,这些担忧也消失了。我对 journalctl 唯一剩下的抱怨是,我无法排除垃圾日志的单元或模式,除非求助于“grep -v”或类似的东西。像 journalctl -X /regex/ 这样的东西会在这些情况下让我非常高兴。

多年来,我真的开始讨厌 systemd 了。主要原因是,如果事情出错,几乎不可能进行故障排除。几年前我升级了一台 Ubuntu Linux 机器,从那以后,它只有大约 3/4 的时间可以正确启动。论坛上的问题,请帮助,结果要么是“蟋蟀”,要么是“重新安装”。那台 Linux 机器现在已经被淘汰了——我的环境中少了一台 Linux 机器。不。拜托。不要。

Poettering 是否为微软收购 Linux 做准备?

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.