Выпуск Rust Coreutils 0.4. Расхождение поведения утилиты du в uutils и GNU Coreutils

Опубликован выпуск проекта uutils coreutils 0.4.0 (Rust Coreutils), развивающего аналог пакета GNU Coreutils, написанный на языке Rust. В состав coreutils входит более ста утилит, включая sort, cat, chmod, chown, chroot, cp, date, dd, echo, hostname, id, ln и ls. Целью проекта является создание кроссплатформенной альтернативной реализации Coreutils, среди прочего способной работать на платформах Windows, Redox и Fuchsia.

Rust Coreutils
задействован по умолчанию в выпуске Ubuntu 25.10 и применяется в дистрибутивах AerynOS (Serpent OS) и Apertis (развивается компанией Collabora). В отличие от GNU Coreutils реализация на Rust распространяется под пермиссивной лицензией MIT, вместо копилефт-лицензии GPL. Дополнительно той же командой разработчиков развиваются написанные на Rust аналоги наборов утилит util-linux, diffutils, findutils и procps, а также программ sed и login.

В новой версии Rust Coreutils:

  • Улучшена совместимость с эталонным тестовым набором GNU Coreutils, при прохождении которого успешно выполнено 544 теста, что на 12 больше, чем в прошлой версии (532). 56 (68) тестов завершилось неудачей, а 33 (33) теста было пропущено. Заявлен уровень совместимости 85.80% (было 83.91%).
  • В утилите data улучшена совместимость в GNU date при обработке часовых поясов (добавлена возможность указания сокращённых наименований часовых поясов в опции —set).
  • В утилите factor задействован пакет num_prime для ускорения факторизации типов u64/u128.
  • В утилите tsort реализация алгоритма обхода DFS переведена с рекурсивного на итеративный метод работы для предотвращения переполнения стека.
  • В утилите cksum реализована поддержка хэшей sha2 и sha3. Добавлены тесты для отслеживания изменения производительности cksum. Функциональность hashsum перенесена в cksum.
  • В утилите mkdir устранено переполнение стека, приводящее к аварийному завершению при создании большого (200+) числа вложенных каталогов.
  • У утилитах stdbuf и uptime реализована поддержка платформы OpenBSD.
  • Улучшена сборка и тестирование на платформе FreeBSD.
  • Внесены общие улучшения для повышения переносимости.
  • Расширены возможности, устранены проблемы и добавлены недостающие опции для утилит base64, cat, chown, chsum, date, dd, du, factor, hashsum, install, ls, mkdir, od, printenv, printf, readlink, stdbuf, timeout, truncate, tsort, uptime, uudoc.

Дополнительно можно отметить расхождение в поведении утилиты «du» из наборов uutils и GNU Coreutils, всплывшее после перехода Ubuntu 25.10 на uutils. Разработчики ещё не решили трактовать ли данное расхождение как ошибку, так как с одной стороны в поведении uutils есть логика и тестовый набор GNU Coreutils не выявляет проблем, но с другой стороны несовместимости с GNU Coreutils предписано обрабатывать как ошибки и поведение утилиты du из Busybox соответствует поведению GNU Coreutils.

Разное поведение наблюдается при указании в числе аргументов утилиты «du» нескольких каталогов в ситуации, когда некоторые из каталогов являются подкаталогами других каталогов (например, /var и /var/log). В итоговой строке uutils выводит суммарный размер всех указанных каталогов и показывает фактический размер каждого отдельного каталога. В итоговой строке GNU Coreutils показывается фактический размер, который указанные каталоги занимают на диске, но в списке показываются размеры каждого каталога без с вычетом вложенных каталогов, из-за чего их размер получается меньше фактического. Кроме того, значения, выводимые в GNU Coreutils и Busybox, меняются в зависимости от порядка указания каталогов.

Например, при проверке размера каталогов «/var/log» и «/var», фактический размер которых 1540 и 35494 байт, в GNU Coreutils будет выведено:


   du -smc /var/log /var
   1540    /var/log
   33954   /var # меньше фактического
   35494   total

   du -smc /var /var/log 
   35494   /var # показан только /var и не показан /var/log
   35494   total

В uutils:


   du -smc /var/log /var
   1540    /var/log
   35494   /var
   37033   total # больше фактического

   du -smc /var /var/log
   35494   /var  
   1540    /var/log
   37033   total # больше фактического

В Busybox:


   du -smc /var/log /var
   1540    /var/log
   33954   /var # меньше фактического
   35494   total

   du  -smc /var /var/log
   35494   /var # показан только /var и не показан /var/log
   35494   total

Источник: http://www.opennet.ru/opennews/art.shtml?num=64214