Переход Ubuntu на Rust Coreutils столкнулся с очередной проблемой совместимости. На этот раз она затронула важную команду Unix cp.

В последнем отчёте команды Ubuntu Foundations инженер Canonical Бенджамин Друнг сообщил, что команда проверила исправления, подготовленные по результатам аудита Rust Coreutils от Zellic, на версии 0.8 в Ubuntu 26.04 LTS. Тем не менее Ubuntu откатила cp на GNU Coreutils и предложила апстрим-пулл-реквест с основным исправлением.

Проблема отслеживается в Launchpad как баг #2158691 и связана с пакетом Ubuntu coreutils-from, который определяет, использовать ли команду из GNU Coreutils или из Rust-реализации uutils.

Согласно отчёту, Ubuntu на короткое время вернула Rust-версию cp в составе coreutils-from 0.0.0~ubuntu26. Это изменение вызвало сбои в livecd-rootfs, пакете для сборки live-образов Ubuntu. Баг получил статус Critical, и немедленным решением стало возвращение GNU cp.

Техническая проблема заключалась в том, как uutils cp обрабатывает комбинации опций архивирования и работы с символьными ссылками, в частности cp -afL. В GNU cp опция -a эквивалентна -dR --preserve=all, что подразумевает рекурсивное копирование и сохранение атрибутов.

Rust-реализация, однако, слишком агрессивно обрабатывала некоторые взаимоисключающие флаги. При комбинации опций -a и -L рекурсивное поведение, подразумеваемое -a, могло теряться, что приводило к ошибкам вроде “-r not specified; omitting directory”, хотя режим архива должен включать рекурсивное копирование.

Важно понимать, что это не катастрофический провал Rust Coreutils в целом. Это всего лишь небольшое, но болезненное различие в совместимости, которое проявляется только тогда, когда десятилетия скриптов, сборочных инструментов и дистрибутивной инфраструктуры сталкиваются с переизобретением очень старого поведения командной строки.

Поэтому конечным пользователям паниковать не стоит. Ubuntu не поставляет сломанный cp в стабильных релизах, а возврат к GNU cp — это именно тот консервативный шаг, которого следует ожидать на этапе разработки.