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

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

opensource.com

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

但并非真正意义上的“一切”。只是“一切”都在内核和 GNU core utilities、图形用户界面桌面和用户应用程序等事物之间的中间服务层中。

检查 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 主机,这种缺乏标准化是一个问题。我还遇到了由试图赶上 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 上找到。

接下来阅读

学习喜爱 systemd

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

David Both
David Both 是一位开源软件和 GNU/Linux 倡导者、培训师、作家和演说家。他自 1996 年以来一直从事 Linux 和开源软件工作,自 1969 年以来一直从事计算机工作。他是“系统管理员 Linux 哲学”的坚定拥护者和传播者。

9 条评论

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

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

Systemd 是两件事

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

从使用 Microsoft INI 格式的定义文件配置服务,到将整个 OS 配置集中到一个单独的程序中,Systemd 的“功能”本质上都“只在桌面环境中才有意义”……

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

但是……桌面 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 做准备?

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.