用心打造
VPS知识分享网站

Ubuntu Rust Coreutils 迁移再遇兼容性问题,cp 命令临时回退到 GNU 版本

Ubuntu 向 Rust Coreutils 迁移的过程中,又遇到了一个新的兼容性问题。这次出问题的是 Unix 系统中非常基础的 cp 命令,也就是日常用于复制文件和目录的工具。

在最新的 Ubuntu Foundations 团队更新中,Canonical 工程师 Benjamin Drung 提到,团队已经在 Ubuntu 26.04 LTS 上针对 Rust Coreutils 0.8 验证了 Zellic 审计中提出的修复。不过,Ubuntu 目前已经将 cp 临时回退到 GNU Coreutils 版本,并向上游提交了底层修复方案。

Ubuntu Rust Coreutils 迁移再遇兼容性问题,cp 命令临时回退到 GNU 版本

这个问题已在 Launchpad 中跟踪,编号为 bug #2158691,涉及 Ubuntu 的 coreutils-from 软件包。简单来说,coreutils-from 负责决定某些基础命令到底使用传统的 GNU Coreutils 实现,还是使用基于 Rust 的 uutils 实现。

根据错误报告,Ubuntu 曾在 coreutils-from 0.0.0~ubuntu26 中短暂恢复 Rust Coreutils 版本的 cp。但这次切换很快引发了问题,导致 livecd-rootfs 构建失败。livecd-rootfs 是 Ubuntu 用来构建 Live 镜像的重要组件之一,因此该问题被标记为严重级别较高的错误。

直接的处理方式也很明确:先恢复 GNU cp。随后发布的 coreutils-from 0.0.0~ubuntu28 已重新启用 GNU 版本的 cp,避免继续影响 Ubuntu 镜像构建流程。

这次问题的关键不在于 cp 完全不能用,而是 Rust 实现对部分参数组合的处理与 GNU 版本不完全一致。触发问题的场景与 -a-f-L 等选项组合有关,例如 cp -afL

在 GNU cp 中,-a 是归档模式,等价于 -dR --preserve=all,其中包含递归复制和保留文件属性等行为。而 -L 则会让命令跟随符号链接,复制链接指向的实际内容。

问题在于,Rust Coreutils 的 cp 在处理这些选项组合时,对部分互斥或覆盖关系判断得过于激进。结果是在某些情况下,-a 隐含的递归复制行为可能丢失,进而出现类似“未指定 -r,跳过目录”的错误。对于普通用户来说,这看起来可能只是一个小差异,但对于自动化脚本和系统镜像构建工具来说,就足以导致构建失败。

这也是基础命令重写最难的地方。cpmvrm 这类工具看起来简单,但背后承载了几十年的 Unix 行为习惯、脚本兼容性和各种边界场景。只要新实现和 GNU Coreutils 在细节上有一点不同,就可能影响发行版构建、CI 流程或老脚本。

需要说明的是,这并不代表 Rust Coreutils 整体失败。Rust 版本的 Coreutils 目标是提供更好的内存安全性,并尽可能兼容 GNU 行为。uutils 项目本身也将与 GNU Coreutils 的差异视为需要修复的问题。

这次事件更像是迁移过程中的一次兼容性暴露。Ubuntu 在尝试把更多基础命令切换到 Rust 实现时,发现 cp 在关键构建流程中仍有边界问题,因此选择先回退到更稳妥的 GNU 版本。

对于普通 Ubuntu 用户来说,目前不需要恐慌。Ubuntu 并不会在稳定系统中贸然发布一个会破坏基础复制命令的版本。相反,回退到 GNU cp 正是发行版开发过程中比较保守、也比较合理的处理方式。

从长期看,Ubuntu 继续推进 Rust Coreutils 仍然有意义,但这类问题也提醒大家:内存安全 不等于完全兼容。对 Linux 发行版来说,系统基础工具不仅要安全,还必须精准复现用户和脚本已经依赖多年的行为。

整体来看,这次 cp 回退事件并不是大故障,但很有代表性。它说明 Rust 正在进入越来越底层的 Linux 系统组件,同时也说明像 Coreutils 这种基础工具的替换,远比普通软件升级更复杂。

赞(0)
未经允许不得转载;国外VPS测评网 » Ubuntu Rust Coreutils 迁移再遇兼容性问题,cp 命令临时回退到 GNU 版本
分享到