19.04.2021

Адаптация Debian для использования реализации coreutils на языке Rust

Сильвестр Ледрю (Sylvestre Ledru), известный своей работой по сборке Debian GNU/Linux с использованием компилятора Clang, сообщил об успешном проведении эксперимента по задействованию альтернативного набора утилит coreutils, переписанного на языке Rust. В состав coreutils входят такие утилиты, как sort, cat, chmod, chown, chroot, cp, date, dd, echo, hostname, id, ln и ls. Для первого этапа интеграции в Debian варианта coreutils на языке Rust были поставлены следующие цели:

  • Создание пакета с альтернативным вариантом coreutils на языке Rust для Debian и Ubuntu.
  • Загрузка Debian с рабочим столом GNOME, используя rust-coreutils.
  • Установка 1000 наиболее популярных пакетов из репозитория.
  • Cборка из исходных текстов Firefox, LLVM/Clang и ядра Linux в окружении с rust-coreutils.

После создания более 100 патчей для Rust/coreutils удалось успешно реализовать все намеченные цели. Из продолжающейся работы отмечается реализация недостающих утилит и опций, улучшение качества и единообразия кода, развитие тестового набора, устранение сбоев, возникающий при запуске тестового набора от GNU Coreutils (пока успешно выполняется 141 тест из 613).

При создании пакета rust-coreutils было решено не заменять пакет coreutils, а обеспечить возможность их параллельной работы. Варианты утилит на языке Rust устанавливаются в /usr/lib/cargo/bin/ и активируются через добавление данного каталога в переменную окружения PATH. Создание пакета rust-coreutils усложняла необходимость загрузки в репозиторий и всех сборочных зависимостей, включая Rust и различные мелки crate-пакеты.

С созданием загрузочного образа особых проблем не возникло, но адаптация пакетов для окружения с rust-coreutils потребовала большой работы, так как многие скрипты post-install вызывают утилиты из набора coreutils. Наибольшее число проблем было вызвано отсутствием необходимых опций, например, в утилите «cp» отсутствовали опции «—archive» и «—no-dereference», в «ln» не было поддержки опции «—relative», в mktemp — «-t», в sync «-fs», в install — «—owner» и «—group». Другие проблемы всплыли из-за различий в поведении, например, утилита install не поддерживала указание /dev/null в качестве входного файла, в mkdir вместо «—parent» присутствовала опция «—parents» и т.п.

При тестировании сборки крупных кодовых баз больших проблем не возникло. При сборке Firefox и LLVM/Clang применяются python-скрипты и cmake, поэтому замена coreutils на них не повлияла. Сборка ядра Linux прошла относительно гладко, всплыли лишь две проблемы: вывод ошибки при использовании chown с символической ссылкой и отсутствие опции «-n» в утилите ln.

Источник.