为什么这些年来 Linux 的 systemd 仍然存在分歧

systemd 已有 10 年历史,但 Linux 社区对它的看法并没有缓和——它现在和过去一样存在分歧。尽管许多主要的 Linux 发行版都在使用它,但顽固的反对者并没有放松。
Linux 启动顺序
当您打开计算机电源时,硬件会启动,然后(根据计算机使用的引导扇区类型)执行主引导记录 (MBR) 或运行统一可扩展固件接口 (UEFI)。这两者的最后一个动作是启动 Linux 内核。
内核加载到内存中,自行解压并初始化。临时文件系统在 RAM 中创建,通常由名为 initramfs
或 initrd
的实用程序创建。这允许确定和加载所需的驱动程序。这反过来又允许用户空间文件系统加载并准备建立用户空间环境。
用户空间环境的创建由 init 进程处理,它是内核在用户空间中启动的第一个进程。它的进程 ID (PID) 为 1。所有其他进程都是 init 进程的直接或间接子进程。
在 systemd
之前,init 进程的主流默认是对 Unix System V init 的改造。还有其他可用的选择,但 System V init 是大多数非 Berkeley Software Distribution (BSD) 派生发行版中的标准选项。因为它直接来自 System V Unix——Linux 的精神祖先——许多人认为它是执行 init 的“官方方式”。
init 进程启动使操作系统以有意义的交互方式工作所需的所有守护进程和服务。这些守护进程处理诸如网络堆栈、启用计算机内的其他硬件以及提供启动屏幕之类的事情。
其中许多后台进程在启动后继续运行。它们执行诸如记录事件信息、在您插入或移除设备时监视硬件变化以及管理用户登录等操作。不出所料,init 系统还包括管理服务的功能。
我们可以使用 ps
查看 PID 为 1 的进程。我们将使用 f
(完整格式列表)和 p
(PID ) 选项:
ps -fp 1

我们看到 PID 为 1 的进程是 systemd
。在 Manjaro Linux 上运行相同的命令会产生不同的结果。 PID 为 1 的进程被标识为 /sbin/init
。快速查看该文件会发现它是指向 systemd
的符号链接:
ps -fp 1
ls -hl /sbin/init

使用 ppid
(父进程 ID)选项和 ps
,我们可以看到哪些进程已被 systemd
直接启动:
ps -f --ppid 1

这是一个很长的列表,如下图所示。

替代品
有几个项目试图产生一种替代传统 System V init 的方法。一个主要问题是,对于 System V init,所有进程都是依次启动的,一个接一个。为了提高启动序列的效率,许多替代项目使用并行机制来并发和异步启动进程。
以下是其中一些的一些信息:
- Upstart:由 Canonical 开发,用于 Ubuntu 9.10、Red Hat、Red Hat Enterprise Linux (RHEL) 6、CentOS 6 和 Fedora 9。
- Runit:在 FreeBSD 和其他 BSD 衍生产品、macOS、Solaris 以及 Linux 系统上运行。它也是 Void Linux 上的默认初始化系统。
- s6-linux-init:这个 System V init 的替代品旨在紧密遵循 Unix 哲学,该哲学通常被简化为“做一件事,并将其做好”。
还有许多其他不同的功能和设计。然而,它们都没有像 systemd
那样引起轰动。
系统方式
systemd
于 2010 年发布,并于 2011 年在 Fedora 中使用。从那时起,它被许多发行版采用。它由 RedHat 的两位软件工程师 Lennart Poettering 和 Kay Sievers 开发。
systemd
不仅仅是 init 的替代品。相反,它是一个包含大约 70 个二进制文件的套件,用于处理系统初始化、守护进程和服务、日志记录和日志记录,以及 Linux 中已经由专用模块处理的许多其他功能。其中大部分与系统初始化无关。
systemd
提供的一些守护进程是:
- systemd-udevd:管理物理设备。
- systemd-logind:管理用户登录。
- systemd-resolved:为本地应用程序提供网络名称解析。
- systemd-networkd:管理和检测网络设备,并管理网络配置。
- systemd-tmpfiles:创建、删除和清理易失性和临时文件和目录。
- systemd-localed:管理系统区域设置。
- systemd-machined:检测和监控虚拟机和容器。
- systemd-nspawn:可以在轻量级命名空间容器中启动命令或其他进程,提供类似于 chroot 的功能。
而这只是冰山一角,也是问题的症结所在。 systemd
早已超越了 init 系统的要求,根据其反对者的说法,这正是范围蔓延的定义。
“这个太大了。它做的太多了。
systemd
的反对者指出它包含大量奇怪的功能组合。所有这些功能都已存在于 Linux 中,也许其中一些需要更新或采用新方法。然而,将所有这些功能捆绑在一个本应是 init 系统的系统中在架构上令人费解。
systemd
被称为太多关键功能的单点故障,但这似乎并不合理。诚然,它抛出了 Unix 的理念,即创建可以协同工作的小工具,而不是创建可以完成所有工作的大型软件。虽然 systemd
并不是严格意义上的单体(它由许多二进制文件组成,而不是一个巨大的二进制文件),但它确实在一个保护伞下包含了许多不同的管理工具和命令。
虽然它可能不是单一的,但它很大。为了了解规模,我们计算了内核 5.6.15 代码库和 GitHub 存储库的 systemd
master 分支中的文本行数。
这是一个相对粗略的指标。它计算文本行数,而不仅仅是代码行数。因此,这包括评论、文档和其他一切。然而,这是一个同类比较,给了我们一个简单的标准:
( find ./ -name '*.*' -print0 | xargs -0 cat ) | wc -l
内核有将近 2800 万(准确地说是 27,784,340)行文本。相比之下,systemd
有 1,349,969 个,即近 140 万个。根据我们的无忧无虑指标,systemd
的大小约为内核大小的 5%,这太疯狂了!
作为另一个比较,Arch Linux 发行版的 System V init 现代实现的行数为 1,721 行。
Poettering 显然不考虑电气和电子工程师协会 (IEEE) 计算机协会,也不考虑便携式操作系统接口 (POSIX) 标准。事实上,他鼓励开发人员忽略 POSIX:
“所以,给自己找一份 Linux 编程接口,忽略它所说的关于 POSIX 兼容性的一切,并破解你令人惊叹的 Linux 软件。真是太省心了!”
有人指责 systemd
是一个只让 Red Hat 受益的 Red Hat 项目,但它却被强行提供给更广泛的 Linux 世界。是的,它诞生于 Red Hat 内部,并受其管理和引导。然而,在 1,321 名贡献者中,只有一小部分为红帽工作。
那么,Red Hat 有什么好处呢?
曾经担任红帽 CEO 的 IBM 总裁 Jim Whitehurst 说:
“Red Hat 考虑了许多可用选项,甚至使用 Canonical 的 Upstart for Red Hat Enterprise Linux 6。最终,我们选择了 systemd,因为它是提供可扩展性、简单性、可伸缩性和定义明确的接口来解决我们所遇到问题的最佳架构今天和未来。”
怀特赫斯特还表示,他们也看到了嵌入式系统的好处。红帽与“世界上最大的嵌入式供应商合作,特别是在稳定性和可靠性是首要考虑因素的电信和汽车行业。”
这些似乎是技术上合理的理由。你可以理解公司对可靠性的需求,红帽为自己的利益着想也不是没有道理,但其他人是否应该效仿呢?
喝 systemd Kool-Aid?
systemd
的一些反对者表示发行版和人们只是盲目地追随 Red Hat 的领导并采用它。
然而,就像“喝酷爱饮料”这句话一样,这并不完全正确。 1978 年,在邪教领袖吉姆·琼斯 (Jim Jones) 强迫他的 900 多名追随者喝下掺有氰化物的葡萄味液体之后,这个词组被创造出来,这个词组错误地羞辱了酷爱饮料 (Kool-Aid)。这群人实际上喝了 Flavor Aid,但 Kool-Aid 从那以后就被这种刷子沾上了焦油。
另外,Linux 发行版并没有盲目追随 Red Hat;他们在认真考虑后采用 systemd
。争论在 Debian 邮件列表中持续了很长时间。然而,在 2014 年,社区投票采用 systemd
作为默认的初始化系统,但也支持替代系统。
Debian 是一个重要的例子,因为它不是从 RedHat、Fedora 或 CentOS 派生的。 Red Hat 没有对 Debian 进行引导。 Debian 和 PID 1 一样,有许多后代,包括 Ubuntu 及其许多衍生产品。
Debian 社区做出的决定影响深远。他们也进行了激烈的辩论,并投票决定使用 Condorcet 投票方法。社区也不会轻易做出这样的选择。
它在 2019 年 12 月再次投票决定继续关注 systemd
并继续探索替代方案。与盲目跟风相反,这其实是工作中民主自由选择的教科书范例。
选择的局限性
您通常无法选择是否将 systemd
用于特定的 Linux 发行版。相反,发行版自己选择是否要使用它,您可以选择自己喜欢的 Linux 发行版。也许您喜欢的 Linux 发行版已切换到 systemd
。就像改变流派的最喜欢的音乐家一样,这可能会很刺耳。
使用 Debian、Fedora、CentOS、Ubuntu、Arch、Solus 和 openSUSE 并反对采用 systemd
的人可能会觉得他们被排除在使用他们选择的发行版之外。如果他们对任何架构选择、范围蔓延或对 POSIX 的漠视感到足够强烈,他们可能会发现继续使用该发行版是站不住脚的。
当然,有一个范围。一方面,有些人不了解(甚至不关心)问题,另一方面,你有热情的反对者。中间的某个地方是那些不喜欢变化,但又不介意跳槽的人。但是那些因为自己的喜好或原则而不能留在自己选择的分配上的分配难民呢?
不幸的是,这并不像安装你想要的任何初始化系统那么容易。不是每个人都有能力做到这一点,更不用说当应用程序或桌面环境(例如 GNOME)依赖于 systemd
时出现的困难。
移动到另一个发行版怎么样?有些,如 Devuan,作为采用 systemd
的发行版(在本例中为 Debian)的非 systemd
分支出现。使用 Devuan 应该类似于父发行版,但并非所有非 systemd
分支都是如此。例如,如果您离开 Fedora 并转向 AntiX、Gentoo 或 Slackware,您将拥有截然不同的体验。
它不会去任何地方
我喜欢 systemd
所做的一些事情(简单和标准化的进程控制机制)。我不明白它所做的某些事情(二进制日志)的基本原理。我也不喜欢它的某些功能(修改主文件夹——谁要求的?)。
像 Debian 这样的发行版正在做聪明的事情并研究替代方案以保持其选择的开放性。然而,systemd
是长期存在的。
如果您为其他人管理 Linux 机器,请像了解 System V init 一样学习 systemd
。这样一来,无论遇到什么,都能尽职尽责。
只是在家里使用 Linux?如果是这样,请选择一个既能满足您的技术需求又能补充您的 Linux 意识形态的发行版。