LWN:Rust重写Linux最基本的软件包!

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

Rewriting essential Linux packages in Rust

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

大多数 Linux 系统都依赖于一套核心实用程序,这些程序是 GNU Project (GNU 项目) 在几十年前开始开发的,当然,它们都是用 C 语言编写的。在 FOSDEM 2025 上,Sylvestre Ledru 在 他的主旨演讲 中提出,现代系统需要更安全、更易于维护的工具。在过去的几年里,Ledru 一直领导着使用 Rust 重新编写 GNU Core Utilities (GNU 核心实用程序,coreutils) 的工作,这个项目就是采用 MIT 许可证的 uutils 项目。目标是提供他所说的更安全、性能更高的、可直接替换 Linux 用户所依赖工具的替代品。在 FOSDEM 上,Ledru 宣布 uutils 项目正在将目光投向更高的目标。

Ledru 担任 Debian 开发者已超过 20 年,并且是 LLVM/Clang 以及其他项目的贡献者。他是 Mozilla 的一名主管,但他表示他将要谈论的工作与他的日常工作无关。

面包、木工…… 还是 Rust?

Ledru 说,学习 Rust 是他在 COVID 封锁期间开始的一个项目。有些人选择学习烘焙,有些人开始做木工,而他则带着他的儿子重新组装家里所有的乐高玩具。但他想要一个晚上的项目,可以帮助他学习 Rust。“在 Mozilla 巴黎办公室里,我一直被上游的 Rust 开发者包围着,所以我自己也想学习它。” 他不想承担一个只会躺在他的硬盘上的业余项目,他想做一些有影响力的事。

“所以我在想,用 Rust 重新实现 coreutils 怎么样?” 早在 COVID 之前,Ledru 就致力于使用 Clang 重新构建 Debian 归档,这个项目记录在 clang.debian.net 上。Ledru 说,他受到了 Chris Lattner 在 Clang 上的工作的启发。他说,Clang 的核心基础之一是这样的理念:“如果你有与 GCC 不同的行为,那就是一个 bug。”

接下来,他问听众谁知道 GNU coreutils 中有哪些程序。大多数人至少知道一个,很多人至少知道五个。但他很确定,除非他们恰好是该项目的上游开发者,否则听众中没有人知道 coreutils 列表中的所有内容。Ledru 说, pr ,用于格式化文本以便“在实际纸张上”打印,是他最喜欢的 coreutils 程序之一。为了让这个项目顺利开始,他选择了“那些令人瞩目的程序”,比如 chmod 、 chown 、 ls 和 mkdir —— Linux 和 macOS 用户几乎每天都在他们的工作中使用这些命令。

接近完全完成

现在,五年过去了,Ledru 说他有了更多的白头发,并且该项目已经用 Rust 替换了 coreutils 中的所有 100 多个命令。该项目有超过 530 位贡献者,并且在 GitHub 上有超过 18,000 颗星,“[它们] 没有意义,但它是我们拥有的一个指标”。

衡量该项目成功与否的更有意义的指标是它与 GNU coreutils 测试套件的比较结果。他说,该项目在 2021 年开始测试时只通过了 139 项测试,而现在已经接近通过 617 项测试中的 500 项了。“我本应该上周末努力达到 500 项,但我没有时间”,Ledru 说。(根据 结果的 JSON 文件,它在 2 月 4 日通过了 500 项测试,此外 42 项被跳过,75 项失败。)他展示了一张幻灯片,其中包含从 2021 年 4 月到 2025 年 1 月下旬的测试套件运行图,如下图所示。

22c3d14be37c62722da00a7c4eb55580.png

该项目仍然失败的大部分测试都有修复问题的 pull request,或者可能是“没有人关心”的事情,以及一些“奇怪的排序”问题。例如,如果用户尝试在没有适当权限的目录中使用 rm ,则输出可能略有不同。“GNU 会先显示一些内容,而我们在最后显示它,这可能会产生一些小的差异”。

越来越多的程序通过了所有 GNU 测试,但这可能并不意味着 Rust 版本与 GNU 实现完全兼容,因为测试套件本身存在一些限制。Ledru 说,当该项目发现未测试的内容时,它一直在为 GNU coreutils 项目做出贡献。

他说,Rust coreutils 现在“已准备好投入生产”,并且它们支持 Linux、FreeBSD、NetBSD、OpenBSD、Illumos、Redox、Android、macOS 和 Windows。还有 Wasm 版本。根据 Ledru 的说法,Rust coreutils 被基于 Debian 的 Apertis 发行版用于电子设备、Spectacles 智能眼镜,并且 Microsoft 正在 将该项目用于 Visual Studio Code for the web。Serpent OS 发行版默认使用它们,他说。他指出,由于该项目是开源的,因此它可能在其他地方被使用而他不知情,并要求任何使用它们的公司告知他。“我总是很高兴知道人们正在使用我们的代码”。

为什么选择 Rust

Ledru 的演讲紧随 Miguel Ojeda 关于 Linux 的 Rust 主题演讲 之后。Ledru 说,Ojeda 已经介绍了使用 Rust 的一些原因,但他也会提供他的观点。

作为 Firefox 发布管理团队的一员,他参与了浏览器开始发布 Rust 代码的过程。这使他对 Rust 适用于浏览器用例的情况“完全有偏见”。他指出,Chrome、Linux 内核和 Microsoft Windows 正在开始包含 Rust。“我要说的是显而易见的事情,Rust 非常适合安全性、并行性和性能”。

然而,用 Rust 版本替换 GNU coreutils 的想法并非关于安全性,因为 GNU 版本已经非常安全。“他们做得非常出色。他们的代码库中几乎没有任何安全问题。” 并且这与许可无关,他说。“我对那场辩论不感兴趣。”

他说,Ledru 喜欢 Rust 用于此项目的原因之一是它非常便于移植。他“几乎可以肯定”他在 Rust 中编写的代码可以在从 Android 到 Windows 的所有平台上运行良好。他说,考虑到“我们所做的一切”的复杂性,这非常令人惊讶,但是将更改移植到操作系统的成本很小,“这要归功于 Rust 的生态系统和质量”。

Ledru 认为,懒惰是使用 Rust 的另一个原因。“因此,如果有一个 crate 或库在做这项工作,我就会使用它。我不会[自己]实现它。” uutils 项目中有 200 到 300 个依赖项。他说,他理解总是存在供应链攻击的风险,“但那是我们愿意承担的风险”。他说,现在有越来越多的工具可以帮助减轻这种风险。

他正在思考“我们将留给下一代什么”。他说,刚开始工作的开发人员不想使用 COBOL、Fortran 或 C。他们想使用像 Rust、Swift、Go 或 Kotlin 这样的花哨的东西。现在就开始为未来做计划,并过渡到 Linux 和整个计算机生态系统的新语言,这是一项很好的投资。

演示时间

即使目标是使 Rust coreutils 成为可直接替换的替代品,Ledru 说,“我们有时会自由地将自己与 GNU 实现区分开来”。在这里,他展示了带有 --progress 选项的 cp 命令的演示,该选项在标准 GNU 版本的 cp 中不可用。他说它也可用于 mv 命令,并邀请观众询问是否应该在其他地方添加它。“在 Rust 中,添加它非常容易”。

他还演示了一个比较 Rust 实现的 sort 与 GNU 的实现的演示。他使用了 hyperfine 命令行基准测试工具来运行测试十次;对包含莎士比亚所有作品的文本文件进行排序,以查看哪个实现更快。第一次执行测试时,他使用了 Rust 版本的 sort 的调试版本。在该演示中,Rust 的版本比 GNU 版本快 1.45 倍。然后,他再次运行测试,使用非调试版本,结果显示 Rust 版本执行测试的速度比 GNU 实现快六倍。

目前,该项目为其支持的大多数平台都具有持续集成 (CI) 和构建系统,并且几乎 88% 的代码都包含在测试套件中。“如果你的覆盖率超过 80%,你通常会非常高兴。在这里,我们对接近 90% 的覆盖率更加满意”。尽管试图证明 Rust 实现比 GNU 更好,但 Ledru 强调说,项目之间存在友好的协作,并且他们一直在向上游发送 GNU coreutils 的错误报告和补丁。

接下来是什么

用一种新语言重写 100 多个基本的 Unix 和 Linux 实用程序是一项令人印象深刻的成就。有些人,在接近完成这样的项目时,可能会退后一步,欣赏这项工作,并考虑收工了。显然,Ledru 不是那些人之一。

他展示了一张幻灯片,上面写着熟悉的格言“种树的最佳时间是 20 年前,第二好的时间是现在”,并谈到了 Unix 核心实用程序的年龄。他说,最初的 Unix 实用程序将在四五个月后达到 55 岁。尽管它们已经存在很长时间,但这些实用程序(尽管是它们的新实现)仍然存在并不断发展。Ledru 指出,GNU 项目继续向 coreutils 添加新选项并引入新算法,“我们也将这样做”。

Ledru 说,与此同时,该项目已经开始重写 GNU Findutils 和 GNU Diffutils。他说,这些并不是重点,但人们一直在努力实现这些功能,并提高它们在用于测试 find 的 bfs 测试套件上的性能。现在,Ledru 说,“我想对 Debian 和 Ubuntu 上的大多数基本软件包做同样的事情”。他说,现在开始这项任务是最好的时机。什么是 基本软件包?他展示了他用来查找它们的命令:

$ dpkg-query -Wf '${Package;-40}${Essential}\n' | grep yes$

该列表包括 procps ( /proc 文件系统实用程序)、util-linux (各种系统实用程序)、acl (访问控制列表实用程序)、bsdutils (标准 BSD 实用程序) 和其他几个。

然后,Ledru 从台上发表了一篇 博客文章,正式宣布了用 Rust 重写现代 Linux 堆栈其他部分的计划。他说,很多人已经在为这个项目做贡献,而 uutils 正在使用已经为 Rust 中的 coreutils 所做的工作。

我们在 coreutils 中有很多很多功能,可以作为该世界的一部分用于其他程序。因此,当您需要挂载文件系统或需要查看权限时,我们已经拥有所有这些功能。

他说,该项目有很多唾手可得的成果和良好的入门级错误,供贡献者开始学习(如果他们想学习 Rust)。“这就是我学习的方式,这也是为什么我们有这么多贡献者的原因”。他说,像重写和重新发明轮子这样的项目听起来可能很疯狂,但他认为这会奏效,因为社区有这种意愿。

正如我之前所说,我越来越老了。我们都会变老,但新一代人不会想用 C。而且,为 Rust 铺平道路也是他们参与开源生态系统的好机会。

旧的工具仍然使用旧的构建管道系统,有些没有 CI 。他们仍然使用邮件列表来发送补丁。“我向这里的 Linux 开发者道歉,我仍然认为使用邮件列表进行补丁审核很糟糕”。他说,借助 GitLab 和 GitHub,有机会拥有一个带有 CI、质量工具等的适当管道,这是 uutils 优于旧项目的优势之一。“需要明确的是,这对他们来说是有效的,我很高兴看到这一点,但从社区的角度来说,我们可以做得更好。”

最后,他想再次提到 uutils 不是 Mozilla 的项目,并且没有公司支持,也没有大型科技公司的兴趣。“我这样做是出于热情,因为我关心 Debian 和 Linux,总的来说,这真的是一项社区努力,背后没有任何结构”。然后,他在剩余的一点时间里开放了提问环节。

问题

第一个问题是关于可移植性的,以及 Ledru 是否在跟踪其他 Rust 编译器方面的工作,以扩展 uutils 的覆盖范围。Ledru 说“当它们准备就绪时,我们会”。另一位听众问是否有开发 shell (例如 Zsh) 的计划。Ledru 说不,他想替换用 C 编写的现有实用程序,而不是重写 shell,因为“这方面没有需求”。

接下来的问题是关于 Ledru 对用 Rust 编写的实用程序的立场,这些实用程序是“用 Rust 重写趋势”的一部分,例如 ripgrep、bat 等。他说它们是很棒的项目,他每天都使用 ripgrep,但它们不是可直接替换的替代品。

最后一个问题是关于打包的。一位听众观察到,由于依赖项管理,打包 Rust 包非常困难,并想知道 Ledru 在这方面的经验以及将来如何解决这个问题。Ledru 同意这是一个大问题,并且 Rust “很难打包”,但他认为它会稳定下来。

[我无法亲自参加 FOSDEM,但在周六直播时观看了演讲。非常感谢视频团队在直播所有 FOSDEM 会议中的工作。]

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

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

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

fa5efba7ea030b27211ede090828c12c.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值