Linux 内核社区因 Rust 代码集成而陷入了激烈的争论,贡献者对安全性优势、可维护性挑战以及多语言代码库的潜在风险产生了分歧。
此次讨论由Rust for Linux 首席开发人员 Miguel Ojeda 发布的一份政策文件引发,凸显了内存安全 Rust 的倡导者与内核数十年历史的 C 基础的捍卫者之间日益加剧的紧张关系。
Ojeda 发布了一份文件,概述了 Rust 的采用指南。该草案强调,子系统可能会因“带宽原因”而选择不使用 Rust,但资深内核开发人员 Christoph Hellwig 立即对其有效性提出了质疑。
“我认为任何形式的网页都没有用。如果你想让它有效,它必须位于内核树中并得到广泛认可,”Hellwig 辩称,同时指责该文件存在事实错误。
Hellwig 引用了私人谈话,其中 Linus Torvalds 据称发誓要推翻维护者对 Rust 代码的反对意见——Ojeda 承认了这一说法但淡化了,并表示这种推翻行为很少见,而且并非 Rust 独有。
技术问题:绑定和维护
Hellwig 批评 Rust 的内核绑定“与惯用的 Rust 完全不同”,警告称它们可能“像癌症一样蔓延到各处”并分裂代码库。他质疑混合使用 C 和 Rust 的长期可行性,担心语言之间无休止的重写和维护者资源紧张。
Jarkko Sakkinen 也对该过程表示担忧,并强调 Rust 补丁缺乏明确的测试指南。
“从 DMA 补丁中可以观察到一点:没有测试载荷,”Sakkinen 评论道。“据我所知,仅凭这一点就应该会导致自动且不带任何偏见的 NAK。”
Rust 可以减少 Linux 中的错误,同时提高内存安全性
包括 Greg KH 在内的支持者反驳说,Rust 消除了困扰 C 代码的所有类型的错误:
“我们遇到的大多数错误(数量,而非质量/严重性)都是由于 C 中的愚蠢小极端情况造成的,而 Rust 中则完全没有这些情况。例如简单的内存覆盖(Rust 到目前为止无法捕获所有这些情况)、错误路径清理、忘记检查错误值以及释放后使用错误。
这就是为什么我希望看到 Rust 进入内核,这些类型的问题就会消失,让开发人员和维护人员有更多时间专注于发生的真正错误(即逻辑问题、竞争条件等)”
Steven Rostedt 强调了数据,这些数据表明,在采用 Rust 之后,Android 等项目的漏洞数量呈指数级减少。“我确实认为用 Rust 编写的新驱动程序将有助于解决新驱动程序通常会给内核带来的漏洞,”他辩称。
实际障碍和维护人员倦怠
开发人员还强调了采用 Rust 的实际障碍。
Sakkinen 指出了设置的复杂性,他抱怨文档侧重于主机级工具,而不是 BuildRoot 或 Yocto 的交叉编译工作流程。“如果我收到一个用于审查周期的 Rust 补丁,我不知道该怎么处理它,”他说。
Laurent Pinchart 和 Lyude Paul 对维护人员倦怠表示担忧,并指出重新设计 API(如 V4L2 的生命周期管理)以实现与 Rust 的兼容性是一项艰巨的任务。
与此同时,Hellwig 直言不讳地警告说,维护者可能会因为 Rust 增加了复杂性而放弃内核。
“处理不受控制的多语言代码库肯定会让我把业余时间花在其他事情上,”Hellwig 说。“我听到过其他一些人嘟囔着类似的事情,但并不是每个人都这么直言不讳。”
Rust 适用于 Linux:一场持续的争论
Ojeda 重申,采用 Rust 带来的好处大于短期痛苦,并且最终“为了 Linux 而牺牲 Rust 是值得的”。
Kees Cook 将目标定为“提高代码质量”,通过减少调试来加速开发。然而,Hellwig 要求透明度,指责 Torvalds 躲在“实验”的花言巧语背后,将 Rust 强加到子系统上。
激烈的争论凸显了内核的关键时刻。虽然 Rust 提供了令人信服的安全优势,但它的集成取决于解决工具缺陷、减轻维护人员负担和促进共识——这一挑战与内核本身一样复杂。