LWN:systemd的14年!

关注了就能看到更多这么棒的文章哦~

14 years of systemd

By Joe Brockmeier
February 17, 2025
FOSDEM
Gemini-1.5-flash translation
https://lwn.net/Articles/1008721/

通常,项目会使用一些里程碑来回顾其取得的成就,例如首次发布或首次提交的周年纪念日。这些纪念日通常以五年或十年为间隔来庆祝,例如 1.0 版本发布的十周年,或首次公开宣布后的 25 周年等等。然而,在 FOSDEM 2025 大会上,Lennart Poettering 采取了一种不同的方式,他发表了主题演讲,纪念 systemd 诞生 14 周年,并简要展望了 systemd 未来的目标和挑战。

他首先提醒听众 systemd 是什么,以便“让大家了解最新情况”,并直接引用了 systemd 首页上的定义:

Systemd is a suite of basic building blocks for building a Linux OS. It provides a system and service manager that runs as PID 1 and starts the rest of the system.

史前史

在 systemd 之前,Linux 已经有了几个先驱,最早的是 System V init。它的设计可以追溯到 1983 年的 System V Unix。Poettering 说,目前在某些 Linux 发行版中仍然可以找到的 System V 风格程序 项目可以追溯到 1992 年,并且他称其既陈旧又晦涩。

接下来是 2006 年的 Upstart。它是由 Canonical 当时的员工 Scott James Remnant 为 Ubuntu 开发的基于事件的 init 守护进程。Upstart 的设计目的是取代传统的 System V init 守护进程。而且它确实在一段时间内取代了。它被 Ubuntu、Fedora、Red Hat Enterprise Linux (RHEL) 以及其他发行版所采用。但最终,它还是被淘汰了,最后一次更新是在 2014 年,寿命只有短短的八年。

他表示,为什么各个发行版没有坚持使用 Upstart 这个问题值得解答。其中一个原因是 Upstart 并没有真正解决服务管理器、init 系统应该解决的问题。它需要“管理员/开发人员类型”的人来弄清楚系统中应该发生的所有事情,“然后将这些事件和这些操作粘合在一起”。他说,这太手动了。另一方面,systemd 允许用户简单地指定目标,“然后计算机来完成剩下的工作”。Poettering 说,Upstart 还有其他问题。他提到了开发缓慢以及由于 Canonical 的版权转让政策而造成的政治障碍。(LWN 在 2009 年 报道 了 Canonical 的版权转让政策。)

Babykit

Poettering 和 Kay Sievers 在 2009 年从 Linux Plumbers Conference 返回的航班上讨论了最初名为 "Babykit" 的基本想法。他说,最初的名字反映了那个时代将守护进程命名为 something-kit 的趋势。“我认为这是我们从 Apple 那里引进的东西。” 他说,大多数这样的命名都已经消失了,尽管我们仍然有 Polkit 和 PackageKit。他和 Sievers 希望做一个真正的开源项目,在开放的环境中进行开发,没有版权转让,并使用 LGPL 协议。

他说,从一开始,它就不仅仅是一个 init 系统,不仅仅是 PID 1。例如,部分目标是处理现代 Linux 系统上的启动工作,这是一个“需要发生的一系列过程”。从一开始,它就不仅仅是一个二进制文件。人们抱怨 systemd 患有“非我发明 (not-invented-here, NIH) 综合症”,“当然,在某种程度上,每个人都是受害者”,他说。“但是,我真的会尽力做好我的功课”。

他所说的“功课”是指在 systemd 实现某些功能之前,研究其他项目在做什么以及现状如何。“我们希望有充分的理由来解释为什么我们要以不同的方式做事”。System V init 和 Upstart 对 systemd 产生了影响,因为这是 Linux 发行版实际使用的东西。但是,他说,Apple 的 launchd 更有趣。他们特别喜欢其中的一个功能,即它的 套接字激活 (socket activation) 概念。互联网服务守护进程 (internet service daemon, inetd) 中也存在类似的概念,它是当时大多数 Linux 和 Unix 类型系统的标准组件。但是,他说,Apple 将其发挥到了极致,这在某种程度上摆脱了“显式的依赖关系配置”。

Solaris 的 服务管理工具 (service management facility, SMF) 是另一个主要的影响因素,“因为它具有所有这些企业级的东西,而且我们想进军企业级市场”。Systemd 也有一些原创的想法——但只是几个。

I mean, I wouldn't claim that the concepts that Systemd is built from are purely ours. They are not. We looked at what's there and then tried to do maybe a little bit better at least.

当然,另一个主要的影响因素是 Unix。但是,Poettering 说,他并不真正了解 Unix 是什么,并且进行了一段关于 Linux 和 systemd 是否是“Unix”的哲学上的题外话。最终,他得出结论,“也许在某些方面是。在其他方面,可能不是”。

“全世界都在运行它”

Fedora 是第一个从 Upstart 切换到 systemd 的主要 Linux 发行版,那是 2011 年的 Fedora 15 版本。Poettering 说,默认情况下使用 systemd 对 systemd 来说是一个巨大的胜利,并且从一开始的目标就是使 systemd 成为可以在主流中使用的东西。Arch Linux 和 openSUSE 在一年后效仿了 Fedora 的做法,然后在 2014 年发布的 RHEL 7 中包含了 systemd。“所以那是它开始的时候,就像整个世界都开始在 systemd 上运行一样”。除了 Debian 和 Ubuntu 之外的整个世界。这些发行版在 2015 年转移到了 systemd,他说这是该项目“最复杂的胜利”。

13d2a9443be936a7342e936c7d89a221.png

尽管 systemd 取得了如此大的成功,但在 Tobias Bernard 设计并在 2019 年发布徽标之前,它一直没有徽标。现在 systemd 有了自己的 品牌页面,以及包括“systemd 绿色”在内的配色方案。该项目于 2015 年开始了它自己的会议,最初称为 systemd.conf,该会议扩展了其关注范围,超越了 systemd,并在 2017 年更名为 All Systems Go!。Poettering 为今年的 All Systems Go! 做了一个宣传,并建议“如果你对底层操作系统之类的东西感兴趣,你应该完全去那里。不过仅限于用户空间”。

Poettering 问道:那么,我们今天在哪里?所有主要的 Linux 发行版都使用 systemd,“特别是,商业发行版都默认使用它”,这基本上意味着“世界都在运行它”。

他说,该项目拥有一个充满活力的社区。它由包括 Poettering 在内的六名核心贡献者和 60 名具有提交权限的人员组成。多年来,有超过 2,600 人为 systemd 贡献了代码。他说,该项目可以做得更好的一件事是更频繁地发布版本。Systemd 具有六个月的发布周期,这“实际上并不是很好,我们应该做得更好”,但他说,为一个如此庞大的项目进行发布管理是很困难的。

Systemd 还通过向 公共利益软件 (Software in the Public Interest, SPI) 的捐款以及来自 拨款 获得了“一点资金”,这些资金来自 主权技术机构 (Sovereign Tech Agency)(以前的主权技术基金)。Poettering 说,该项目已将这些资金用于核心开发人员不感兴趣的事情,例如重新设计 systemd 网站。

systemd 有多大?

如今,systemd 是一套大约 150 个独立的二进制文件。Poettering 说,该项目有时会收到关于它过于庞大的抱怨,但他辩称该项目并不是庞大的,实际上“非常模块化”。但这并不意味着项目中的所有内容都是模块化的,或者可以在任何其他环境中使用,但是“它是一套具有中心组件的不同事物”,该中心组件将所有内容组合在一起。“你可以关闭其中的很多内容。不是全部,而是很多”。Poettering 说,它主要是一个 C 项目,但也有一些例外。某些组件是用 Python 编写的,并且该项目已经尝试过 Rust,但它最终还是一个 C 项目。

他说,systemd 核心团队并没有完全相同的看法,但他们确实都认为 systemd 是“基于 Linux 的操作系统需要的共同核心”。它涵盖了从登录、网络名称解析、联网、时间同步以及用户主目录管理的基本功能。每个组件都在某些 Linux 发行版中找到了采用,尽管每个发行版选择采用 systemd 的不同部分。

他还讨论了 systemd 在代码行数和依赖项方面的占用空间。他说,该项目包含 690,000 行代码,而 wpa_supplicant 大约有 460,000 行代码,GNU C 库 (GNU C library, glibc) 超过 140 万行。“这算多还是少?我不知道。” 他过去喜欢将 systemd 与 wpa_supplicant 进行比较,因为它的大小与 systemd 大致相同,但是在过去的三年中,“我们显然加速了”并超过了它。但是,systemd 的大小仍然约为 glibc 的一半。至于磁盘上的大小,Poettering 说,在 Fedora 上完全安装 systemd 大约需要 36MB,而 GNU Bash 大约需要 8MB。他说,如果仅 shell 就需要 8MB,“那么” systemd 需要 36MB “也没那么糟糕”。

Poettering 说,该项目在依赖项方面一直很保守,因为如果它引入一个库作为依赖项,那么它实际上会影响所有 Linux 用户。大约在两年前,该项目已切换为对所有运行基本系统所不需要的依赖项使用 dlopen()。他说,对于不知道这个动作的目的人来说,简单理解就是 dlopen() 代表着直到绝对需要时才加载共享库。

他举了一个例子,即使用 FIDO 密钥进行全盘加密。很多人使用 FIDO,但也有很多人不使用。通过使用 dlopen(),用户仍然可以将全盘加密绑定到其他东西,而无需安装 FIDO 堆栈。“我们已经将 dlopen() 推到了极致,以至于现在只有三个真正需要的依赖项”,Poettering 说:glibc、libmount 和 libcap。Systemd 还有三个构建时可选的依赖项:libselinux、libaudit 和 libseccomp。

在 XZ 后门 事件发生后,Poettering 开始 推动其他人 也采用 dlopen() 方法。Systemd 并不是后门的目标,但是由于某些发行版将 SSH 守护进程链接到 libsystemd,然后 libsystemd 又引入了 liblzma,因此它被用来打开那扇门。“所以,那时,这不是一个 dlopen() 依赖项。这就是发生这种情况的原因。” 他说,Systemd 没有错,但是“也许我们可以为此做些什么”。(LWN 在 2024 年 报道 了这个话题。)

总而言之,他说,systemd 不是那么大,也不是很小。它适合包含在初始内存盘 (initrd) 和容器中。“Systemd 不会给你带来太大的影响,就大小而言”。

什么属于 systemd

Poettering 承认 systemd 存在一些范围蔓延 (scope creep) 的问题,但他说该项目确实有一些要求,可以明确什么属于(以及什么不属于)systemd。其中第一个是它需要解决一个通用问题,而不仅仅是一个用户的问题。它需要具有基础性,并为很多用户解决问题。

另一个经验法则是“它需要有一个未来”,他说该项目不会添加对遗留技术的支持。实现需要干净并遵循通用的风格。“如果你为了快速交付产品而偷工减料,那么你可以快速交付产品,但这不是我们希望 systemd 成为的样子。” 即使某些东西满足了所有条件,他说,这并不意味着它需要放在 systemd 中。它仍然可以在其他地方维护。一项技术还需要适合 systemd 的核心概念。

Poettering 说,没有一个包含项目核心概念的单一列表。可以从 systemd 的手册页和规范中提取它们,但是“我无法给你完整的列表”。但是,他确实提供了一些示例。其中第一个是清楚地分离 /etc=、=/run 和 /usr=; =/etc 用于配置, /run 用于“非持久性的运行时内容”, /usr 用于“来自供应商的内容”。他说,传统上,Linux 上并没有如此严格地遵循这种分离。

Hermetic /usr 是 Poettering 说 systemd 正在尝试推动的另一个概念。简而言之,这意味着 /usr 具有对系统的充分描述,即使没有 /etc=、=/var 等,也可以启动。“这基本上意味着你可以打包整个 /usr,将其放到另一台机器上,我们将启动”,它就可以正常工作。他说,他不想详细介绍每个概念,而是想举例说明这些概念如何“渗透到我们所做的其他事情中”。

Poettering 提到的另一个概念是,systemd 所做的一切都需要具有声明性行为。“你只需写下你想去的地方。你不要编写代码”。例如,他说,启动不应涉及运行 shell 脚本,因为 shell 脚本本质上是命令式的。不应该这样配置。Systemd 还有更多的概念,但重点是拥有这些概念允许 systemd 做以前很难做的事情,例如 ProtectSystem= 和 ProtectHome= 选项,它们为 沙盒 提供了“高级旋钮”。

他说,系统还需要标准,该项目试图通过以“通用方式”编写其做事方式的规范来设置标准。而且 systemd 也采用了许多标准,例如 /etc/os-release,现在大多数 Linux 发行版和基于 BSD 的操作系统都使用它。Poettering 说,该项目甚至创建了一个标准网站,即 Linux 用户空间 API (Linux Userspace API, UAPI) 组,systemd 的人员“和与我们关系密切的人”受邀在此处放置 规范。可发现磁盘映像 (discoverable disk image, DDI) 规范就是一个例子,它提供了一种自描述文件系统映像的方法,这些映像可能包含操作系统映像、系统扩展、容器等的根或 /usr 文件系统。

未来

当 Poettering 讲到 systemd 未来的目标和挑战的幻灯片时,他的时间快用完了。他谨慎地指出,他概述的目标和挑战是他个人的观点,systemd 团队中的其他人可能有不同的优先事项。就他而言,他看到了 systemd 的四个目标和挑战。

第一个目标是实现启动和系统完整性,以便更难以对系统进行后门攻击。不是不可能,而是更难。基本上是锁定系统以防止攻击者进入,并使系统具有一个众所周知的状态,以便返回到“你知道那里不会有任何人,因为你可以证明它”的状态。如果有人攻击服务器,他们可以从服务器上删除,因为服务器可以返回到定义的状态,并且可以以安全的方式进行更新。“换句话说,你不必总是把你的笔记本电脑放在枕头底下睡觉”,因为有人可能会修改引导加载程序。

Poettering 说,“所有大型操作系统”都以某种方式解决了启动和系统完整性的问题。但是,默认情况下,没有任何“通用发行版”采用它。他说,这是一个非常重要的可悲情况。实施启动和系统完整性的一个障碍是“它使事情变得更加复杂,因为你需要考虑密码学以及所有这些事情”。

文化问题是另一个障碍,这些问题部分基于 恐惧、不确定和怀疑 (fear, uncertainty, and doubt, FUD),例如可信平台模块 (Trusted Platform Module, TPM) 完全是关于数字版权管理 (digital rights management, DRM),“剥夺你的计算机”的想法。相反,TPM 的设计方式“实际上与我们的目标非常兼容”。基于软件包的系统也使事情变得比需要的更加复杂,但是“我们生活在一个基于软件包的世界”,因为所有主要的 Linux 发行版都默认使用软件包。

目标二是重新思考 systemd 的进程间通信 (interprocess communication, IPC),特别是从 D-Bus 转向 varlink。(LWN 在 12 月的 systemd v257 中 报道 了 varlink。)Poettering 说,虽然 D-Bus “永远不会消失”,但 varlink 允许每个连接在一个服务实例中处理 IPC 请求,这使其更易于使用。他说,编写 D-Bus 守护进程很困难,但是使用 systemd 的套接字激活将命令绑定到 Unix 流套接字以将其转换为 varlink IPC 服务很容易。

Poettering 列表中的第三件事是一个挑战,即 Rust,某种程度上——他认为 systemd 在 C 方面做得很好,至少在漏洞方面是这样。如果无论如何都要接受 CVE 作为指标的话。2023 年有三个针对 systemd 的 CVE,2024 年没有 CVE,并且其 CVE“主要与内存无关”。即便如此,他说,“我们确实认为未来可能会说 Rust”。

但是,systemd 具有复杂的构建以及许多二进制文件和测试。它不适合 Cargo,并且 systemd 当前使用的 Meson 构建系统不喜欢 Rust,尽管它最近获得了一些 Rust 功能。并且 systemd 对占用空间问题很敏感,这就是为什么它严重依赖共享库的原因。对于 150 个二进制文件进行静态链接是不可行的,但是“Rust 中的动态库不存在”。共享库需要成为一等公民。最终,Poettering 说他“很高兴参与其中”,但不希望 systemd 成为解决使用 Rust 需要解决的问题的人。他推测,Rust 和 Zig 之间可能会存在一些竞争,以提供一种内存安全的语言,该语言可以提供稳定的共享库,包括 dlopen() 、对混合代码库的支持等等。

第四个也是最后一个,但太简短了,Poettering 说,systemd 的最后一个挑战是关于基于映像的操作系统,“让我们就此打住”。演示文稿的幻灯片稍有扩展,其中包括呼吁将 Linux 生态系统从基于软件包的部署转移到基于映像的部署。它还建议使用 mkosi 使用软件包管理器构建定制映像。

Poettering 有时间回答几个问题。第一个问题是 systemd 最终是否会取代 GRUB。Poettering 说,正如你可能猜到的那样,他“不相信 GRUB”,并且替换它的所有部件都已就绪。剩下的问题是政治性的。他说,GRUB 试图做太多事情,而这些事情中的大多数都是错误的。如果仅关注 EFI,则大多数发行版都可以切换到 systemd-boot。

另一位听众问,有什么计划可以“修复 resolved 的问题”,systemd 的 DNS 解析守护进程。Poettering 说,它对他来说运行良好,但他知道有些人对“更高级的功能”有疑问,例如 DNSSEC,“并且它不稳定”,因为 DNSSEC “在现实生活中确实很难,因为服务器很糟糕”。他建议听众提交一个错误报告。

主题演讲的视频和幻灯片现在可以从 FOSDEM 网站上的 演讲页面 获得。该主题演讲是 Poettering 在 FOSDEM 期间进行的 四次演讲 之一,所有演讲现在都可以在网上获得,供那些想要更深入地了解特定 systemd 功能的人观看。

[今年我无法亲自参加 FOSDEM,但我观看了直播的演讲。非常感谢视频团队在直播所有 FOSDEM 会议并提供录音方面所做的工作。]

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

0a6e44745917f9d7fcebb824ce0aa362.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值