Systemd 正式拥抱 Rust,但核心模块仍需等待

Mark Do · · 97 次阅读 · linux软件

Systemd 正式拥抱 Rust,但核心模块仍需等待

Systemd 开启 Rust 支持新篇章

作为主流 Linux 发行版广泛采用的 init 系统和服务管理器,systemd 近期正式合并了对 Rust 语言的支持。这一变更通过一个包含 19 个提交的拉取请求(PR #44324)并入主分支,为未来更多组件的 Rust 化奠定了基础。

此次合并遵循了柏林最近一次开发者大会上维护者们达成的共识规则,是对此前提案的优化替代方案。

首个采用 Rust 重写的程序是 systemd-keyring-setup,它负责在系统启动时将 X.509 证书添加到内核密钥环(如 dm-verity 和 fs-verity),并在锁定前完成相关配置。

Rust,但必须遵循 systemd 的规则

在当前的实现方案下,Rust 支持完全是可选的,systemd 依然可以在不依赖 Rust 的情况下正常构建。

具体限制包括:

  • Rust 代码范围仅限于全新的独立程序,且不能有其他组件对其产生依赖
  • 构建系统继续使用 Meson,而非 Cargo
  • 仅允许使用 core 和 libc crate,这意味着无法使用标准库和 alloc
  • 程序必须使用 systemd 自定义的 Box 和 Vec 类型,内存分配失败时返回错误而非 panic
  • 若声明了相同的命令行接口,还必须通过测试确保行为与 C 版本一致

要构建 Rust 版本的程序,需要以下工具链:

  • rustc 1.85
  • bindgen 0.71.1
  • meson 1.4.0 或更新版本

对于像 Arch Linux 和 openSUSE OBS 这样默认启用全部功能的发行版,必须安装 Rust 工具链或在构建时关闭 Rust 支持。

共享库难题尚未解决

目前,systemd 程序共用的 libsystemd-shared 库仍保持 C 语言实现。要实现 Rust 代码的融入,需要 Rust 语言本身提供更完善的共享库支持,而 Rust 至今尚无稳定的 ABI。

此外,还有一个实际的问题:如果将 Rust 代码放入共享库中,会导致同样的代码在库文件和众多 systemd 二进制文件中重复出现,造成体积膨胀。

文件系统访问也是另一个障碍。systemd 出于安全考虑,通过文件描述符来查找路径,而非依赖 Rust 的标准路径处理方式。项目方希望 Rust 社区能够支持这种访问模式。

尽管存在挑战,systemd 团队明确表示:未来仍希望将 Rust 引入核心模块,并愿意与 Rust 社区合作推动这一目标的实现。

Linux 生态的 Rust 浪潮

Systemd 并非 Linux 栈中唯一拥抱 Rust 的项目。

  • Linux 内核:自 6.1 版本起以探索性方式引入 Rust,至 2025 年底官方宣布该实验阶段已结束
  • Ubuntu:已率先将 sudo-rs 和 uutils coreutils 作为默认工具,开启了核心组件的 Rust 化之路

种种迹象表明,随着 2027 年临近,Rust 在 Linux 生态中的采用速度将只会越来越快。


关注微信号:智享开源 ,及时了解更新信息。

阅读原文

Mark Do

关注我的头条 不要放弃,百折不挠,坚强、自信。

还没有任何评论,你来说两句吧!

发表评论