近日,Ubuntu 向 Rust Coreutils 的迁移过程中遇到了另一个兼容性问题,这次涉及的是至关重要的 Unix 命令,cp。
在 Ubuntu 基础架构团队 Foundations team的最新动态中,有Canonical 工程师报告称。
团队已针对 Ubuntu 26.04 LTS 上的 0.8 版本,验证了 Zellic 对 Rust Coreutils 进行审计后提出的修复方案。

然而,Ubuntu 最终还是将 cp 命令回退到了 GNU Coreutils 版本,并针对底层修复向 upstream上游项目提交了 PR拉取请求。
该问题在 Launchpad 上被追踪为 Bug 2158691,涉及 Ubuntu 的 coreutils-from 软件包。
该软件包负责决定某个命令是使用 GNU Coreutils 还是基于 Rust 的 uutils 实现。
根据错误报告,Ubuntu 曾在 coreutils-from 0.0.0~ubuntu26 版本中短暂恢复了 Rust Coreutils 版本的 cp。
这一变更导致 livecd-rootfs 出现故障,该软件包负责构建 Ubuntu Live 镜像。
该错误被标记为严重 Critical,而当务之急的解决方案便是恢复使用 GNU 版本的 cp。
技术层面的问题在于 uutils 的 cp 如何处理归档archive与符号链接symlink相关选项的组合,特别是像 cp -afL`这样的情况。
在 GNU cp 中,-a 选项等同于 -dR --preserve=all,这意味着它包含递归复制和属性保留功能。
然而,Rust 实现版本在处理某些互斥标志时过于激进。当 -a 和 -L 等选项组合使用时,-a 所隐含的递归行为可能会丢失。
从而导致诸如未指定 -r 跳过目录 -r not specified omitting directory 。之类的错误,尽管归档模式本应包含递归复制功能。
需要明确的是,这并不意味着 Rust Coreutils 整体遭遇了重大失败。这仅仅是一种细微却令人头疼的兼容性差异。
当积累了数十年的脚本、构建工具和发行版基础设施,与对古老命令行行为的重新实现发生碰撞时,这类问题往往才会显现出来。
因此,对于最终用户而言,无需担心惊慌。Ubuntu 并未在稳定版中发布存在缺陷的 cp 命令。
回退到 GNU cp 正是开发过程中所预期的那种稳健保守做法。