systemd 接纳 Rust:只进叶子二进制,核心共享库仍归 C
来源:amutable.com — 2026-11-03
📋 概述
Christian Brauner 与 Lennart Poettering 说明 systemd 合并了 Rust 支持,但把「Rust 支持」拆成两种含义:叶子组件(单个二进制)可以,根组件(进 libsystemd-shared.so 本体)目前不行。原因是 Rust 缺一等公民的共享库支持,即所谓「稳定 ABI 问题」;在它解决前把 Rust 塞进核心,会让每个共享库和许多二进制被重复的 Rust 代码撑大。而 systemd 有 180 多个小二进制,静态链接在这里既不实际也不可取。
🔑 核心要点
- 做法是反向包装:共享代码保持纯 C,再包成 Rust crate 给 Rust 二进制用,C 与 Rust 组件因此能一致地消费同一套核心 API。
- 行为必须一致:Rust 二进制的选项解析、帮助与错误输出不许与 C 二进制有差异,用户不该关心某个程序用什么语言写的。
- 构建系统不引入 cargo,继续用 meson,同时把 cargo 在供应链安全上的争议作为理由;依赖也极度克制,目前只链 libc。
- 不使用 Rust 标准库,也自己提供 fallible 分配器 crate——Rust 默认的分配失败即 panic 不符合 systemd 的容错要求。
- 不做无谓重写:路径查找才是真正的攻击面,把这类组件换个语言只是 bug-for-bug 移植,收益不如直接消减攻击面。
- Rust 仍是可选项,无 Rust 的 systemd 继续完全可用;Rust 1.100 曾差点破坏刚合并的支持,社区迅速回滚,被作者视为积极信号。
💡 金句
Rust 编译出的程序与 systemd 的 C 程序出现无谓差异,本身就是不可接受的。
👍 0
👎 0
← 返回 Lobsters 首页