Команда разработчиков Ubuntu была вынуждена вновь переключиться на классическую утилиту cp из пакета GNU Coreutils. Причиной стала критическая несовместимость в реализации аналогичного инструмента, написанного на языке Rust (Rust Coreutils), из-за которой процесс автоматической сборки Live-образов системы (скрипт livecd-rootfs) стал завершаться с ошибкой.
История проблемы и детали сбоя
Ранее, при подготовке релиза Ubuntu 24.04, разработчики уже временно возвращались к стандартным утилитам cp, mv и rm из состава GNU Coreutils из-за обнаруженных уязвимостей. Однако с выходом обновления пакета coreutils-from-uutils 0.0.0~ubuntu26 было вновь активировано использование инструментов из проекта Rust Coreutils.
Сбой в работе сборочного конвейера был вызван тем, что скрипт вызывал утилиту cp с флагами -afL. В классической реализации GNU Coreutils эти опции обрабатывались корректно, но Rust-версия утилиты в ответ на этот запрос начала выдавать ошибку: «cp: -r not specified; omitting directory ‹dir-name›».
Технический разбор конфликта опций
Ошибка была спровоцирована различиями в логике обработки конфликтующих параметров -L и -a:
- Флаг
-Lтребует разыменовывать символические ссылки. - Составная опция
-a(эквивалент-dR --preserve=all) включает флаг-d, который, напротив, запрещает разыменование символических ссылок.
Выяснилось, что в Rust Coreutils реализация в случае конфликта просто отбрасывала всю составную опцию -a целиком, а не пыталась исключить только противоречивый флаг -d. В результате система теряла флаг -R, отвечающий за рекурсивное копирование директорий, и параметр --preserve=all, необходимый для сохранения оригинальных атрибутов файлов в процессе копирования. Подобное поведение привело к невозможности полноценной сборки корневой файловой системы для Live-образов Ubuntu.






