Ubuntu如何利用Rust重建核心系统工具
本文基于 RustRover 的一场直播,由我们的开发者布道师 Orhun Parmaksız 主持,嘉宾是 Canonical 工程副总裁 Jon Seager。他们讨论了 Ubuntu、Rust 以及核心系统软件的未来,包括 Canonical 如何推进 Rust 采用,以及为什么一些最重要的变化正发生在用户很少看到、却每天都依赖的系统部分。
点击此处观看完整视频 👇
关于这个故事,有一种版本是:有人用 Rust 重写了 ls,并称之为革命。Ubuntu 则采取了更审慎的做法。一切始于 Jon Seager 在接手 Ubuntu 领导工作后不久问自己的一个问题:让我们走到今天的东西,很可能无法支撑我们走过未来 20 年——那么,我们应该改变什么?
事实证明,答案涉及大量内存安全、乐于承担经过计算的风险,以及比任何人预想都更多的关于 sudo 密码提示的意见。
为什么 Ubuntu 押注 Rust
Ubuntu 已经存在了 20 多年。它运行在 1500 万个部署上,你可以在服务器、桌面、边缘设备甚至汽车中找到它。正是这种覆盖面,让 Jon 对安全性和韧性的思考并非抽象理论。它必须在大规模、跨行业的广泛环境中工作,并且要能应用于安全关键系统——在这些系统中,崩溃不仅仅是“不方便”而已。
当 Jon 以工程副总裁的身份加入时,Rust 并不一定是既定计划。当他思考 Ubuntu 在未来几十年需要什么样的平台时,他的想法发生了改变。
“在我看来,在我们可用的系统编程语言中,Rust 为推进这一议程提供了最有说服力的一套工具。”
[LOADING...]
Jon Seager Canonical 工程副总裁
安全性、韧性与内存安全
支持 Rust 的最明显理由是内存安全,但 Jon 对此有不同的阐述角度。他谈到韧性(resilience)位于安全性和可靠性的交叉点。他认为安全性和可靠性是密切相关但不同的问题。
一个未处理的 panic 可能同时造成安全风险和可靠性故障。在汽车系统、工业控制软件和安全关键基础设施中,这种区别远不如最终结果重要:系统在不该停止工作时停止了。更少的内存 bug 意味着更少的崩溃、更少的攻击面,以及一个整体上更难被攻破的系统。Canonical 的收入在很大程度上依赖于修补漏洞和提供支持。
Jon Seager 的长期平台视角
Jon 将转向 Rust 描述为一个长期平台决策,而不是一场重写运动。
技术理由只是故事的一部分。Jon 同样关注 Rust 吸引了哪些人。这些人关心正确性、认真思考安全性,并希望投身于 Ubuntu 需要解决的问题。通过在平台中更多地使用 Rust 构建,Canonical 正在为该社区创造一条更清晰的贡献路径。
GNU coreutils 已经存在了 30 年,而且是很棒的软件。Jon 对此非常明确。但 30 年也意味着积累了 30 年的 bug。而“Rust 版本也有 bug”这种说法其实偏离了重点。更长远的问题是:如果平台的更多基础部分默认就是内存安全的,那么 20 年后这个平台是否会处于一个更好的状态。
Ubuntu 正在发生哪些变化
Ubuntu 并不是用 Rust 重写一切。 这类故事的标题常常让人以为如此,但 Canonical 正在安全与维护收益最明显的地方进行有选择、审慎的替换,并且从 LTS 版本边界开始——因为那里用户有回退选项,成功概率也最高。
coreutils、sudo-rs、ntpd-rs 与 UPKI
第一批组件已进入 Ubuntu 26.04 LTS。uutils coreutils 是 GNU coreutils 的 Rust 重实现,它以默认工具的形式发布,目标是实现与 GNU 工具 100% 的逐 bug 兼容。
sudo-rs 是 26.04 中的另一个重要组件,它采用了截然不同的方法。uutils 目标是做直接替代品,sudo-rs 则在问一个完全不同的问题:如果经过 30 年的安全经验教训之后,今天重新设计 sudo,它实际上会是什么样子?答案涉及一些有意的行为变化。
ntpd-rs 是名单上的下一个。Canonical 在 2026 年 6 月宣布资助 Trifecta Tech Foundation,要将 ntpd-rs 作为 Ubuntu 的默认时间同步工具,最终用一个同时处理 NTP、NTS 和 PTP 的单一工具取代 chrony 和 linuxptp。计划是在 Ubuntu 26.10 中将其纳入软件仓库,并在 Ubuntu 28.04 中全面切换为默认工具。
UPKI 则采用了不同的方法。这是一个与 Rustls 项目合作构建的全新项目,目标是为 Linux 系统工具带来证书撤销能力。浏览器多年前就实现了这一点,但 curl、wget 和 OpenSSL 至今仍未处理。UPKI 将 Ubuntu 26.10 作为其证书撤销功能的首个交付里程碑。
为什么 ntpd-rs 不仅仅是直接替代品
精确计时在更多地方属于安全关键需求,可能比你想象的更普遍:飞机、汽车和机器人中的微控制器;密钥频繁轮换的密码系统;以及时钟漂移会产生实际后果的定位系统。Chrony 能很好地处理基础 NTP,但当需要 PTP(精确时间协议)来处理高精度同步时,问题就会出现。
在今天的 Linux 上,这意味着要同时运行 chrony 和 linuxptp,可能还要配置专用或卫星授时源,然后让它们全部互相通信。Jon 称这“相当无趣”,这说法其实还轻了。ntpd-rs 的目的是将这一切整合到一个工具、一个配置文件中,同时还有内存安全和高效的优势。
取舍与代价
Jon 明确表示,他们确实破坏了一些东西。他们知道会这样,但仍然选择这么做,因为他们接受短期破坏以换取长期收益,并设计了过渡机制,让需要的人可以退回。
兼容性 vs. 有意的行为变化
- uutils coreutils 力求 100% 兼容,因此任何与 GNU 行为的差异都会被视为 bug,而不是特性。实践中,这很难。Jon 分享了一个最近的例子:当你让
head从一个空文件中读取 N 个字节时,GNU coreutils 返回 0。而 uutils 实现最初返回了一个错误,这可以说更正确。但它破坏了一个埋在 Obsidian snap 中的脚本,所以维护者还是把它改回,以匹配 GNU 行为。兼容性优先。 - sudo-rs 不做这样的承诺。它问的是 sudo 应该是什么,而不是它过去是什么。一个引发大量争议的变化是,默认情况下,sudo-rs 现在在终端输入密码时会显示星号。这个看似很小的 UX 变化,却引发了异常强烈的反应。Jon 的看法基本上是:新行为更好——他们深思熟虑过,并且坚持这个决定。
为什么 Ubuntu 在 LTS 边界推出这些变化
LTS 的时间安排是经过深思熟虑的。长期支持版本是企业升级的节点,也是回退选项最重要的时刻。通过在 LTS 边界进行这些更改,Canonical 可以确保如果某些变化对你造成了影响,你可以在上一个版本上获得 15 年的维护支持,同时解决问题。旧工具仍然保留在软件仓库中。没有人会在没有警告的情况下,被迫在运行中的生产系统上使用新行为。
Ubuntu Rust:打包与交付
交付内存安全的系统软件是一回事。真正以发行版规模将 Rust 代码集成到 Linux 发行版中又是另一回事,大量不起眼的工作就发生在这个阶段。
Crates、cargo auditable 与 snaps
Canonical 对 Rust 依赖采用 vendoring 方式,而不是将每个 crate 打包成独立的 deb 包。某个包的所有 crate 会被一起捆绑到一个 tarball 中,并作为最终产物的一部分发布,这与 Nix 的做法类似。这样可以让依赖面保持可控,并使构建具有确定性,即使它们不是严格意义上的可复现构建。
2026 年初,cargo auditable 已在 Ubuntu 软件仓库中的所有 Rust 包中部署。现在,每个 Rust 二进制文件都携带内嵌的 SBOM(软件物料清单),列出构建它所使用的确切 crate 和版本。当包被重新构建时,SBOM 会自动更新。这让发现漏洞时更容易确认具体存在哪些 crate 版本。
然后是 snaps。无论你对它们观感如何,Jon 都承认,在 Ubuntu 的规模下,snaps 解决了一个很难用其他方式解决的特定问题:让现代软件在旧版本上运行。由于 snap 自带运行时,你可以发布一个基于 Ubuntu 26.04 构建的 snap,并让它在 22.04 或 24.04 上正确运行。对于 MSRV(最低支持 Rust 版本)不断升高的 Rust 包来说,这可不是一件小事。JetBrains 也正是用这种方式在多个 LTS 版本上分发 RustRover 的——这个话题在对话中被提到了。
下一步是什么
Canonical 正在以渐进方式推进这件事。每个发布周期,团队都会评估替换或重建哪个组件能带来最明确的安全或维护收益。
系统软件中的更多 Rust 以及生态资助
在 ntpd-rs 和 UPKI 之后,压缩库是下一个重点。Canonical 正在评估 bzip2-rs、zlib-rs 和 zstd-rs。这里同样有权衡。其中一个 zstd 实现会捕获当前 C 库允许的一类不安全操作,但除非关闭这些检查,否则会带来一些性能开销。以开启还是关闭这些检查的状态发布,是一种听起来很小、但实际上并非如此的决定。
Jon 在直播中说得很直白。Ubuntu 的目标超越了发布 Rust 代码本身,还包括上游贡献、安全审计、资助维护者,以及参与基础设施层面的供应链安全讨论。Canonical 也希望其中一些工作可以被其他 Linux 发行版复用或采纳。