Сильвестр Ледрю (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.