Для многих пользователей GNU coreutils остаются незаметными рабочими лошадками Linux — стандартные утилиты вроде ls, cp, mv, cat, sort и wc присутствуют в любой системе и просто делают своё дело. Казалось, улучшать там нечего, пока несколько месяцев назад на одном из наших серверов не пришлось анализировать многогигабайтный лог Apache. sort и wc на таких объёмах работали медленнее, чем ожидалось, и это заставило задуматься: нет ли более быстрой или современной замены.

Поиски вывели на uutils-coreutils — открытый проект, полностью переписывающий GNU coreutils на Rust. Он предлагает практически все привычные команды, только написанные на Rust, а не на C. Помимо встроенной безопасности памяти, часть утилит способна показывать лучшую производительность на крупных файлах.

Мы не стали заменять системный coreutils, а установили uutils параллельно и сравнили бок о бок. Например, wc -l на 6 ГБ лог-файле версия от uutils отработала заметно шустрее — аргумент в пользу более плотного знакомства.

Далее разберём, как безопасно установить uutils-coreutils без ущерба для системных утилит, попробовать его команды одновременно с GNU-версиями и провести простые тесты производительности. Читатели смогут решить, пригодится ли этот инструмент в их Linux-задачках.

Что такое coreutils и зачем нужна версия на Rust

Пакет GNU coreutils включает базовые инструменты командной строки, на которых построена работа любого Linux-дистрибутива: ls, cp, mv, rm, cat, mkdir, echo, wc и многие другие входят именно в него.

GNU coreutils существует с начала 1990-х, подтвердив свою надёжность годами эксплуатации. Это один из краеугольных камней любой Linux-системы.

Зачем же потребовалась версия на Rust?

Оригинал написан на C — языке, дающем полный контроль, но требующем аккуратного управления памятью. Даже в тщательно протестированном коде возможны переполнения буфера и уязвимости use-after-free.

Проект uutils-coreutils с открытым исходным кодом переписывает весь набор GNU coreutils на Rust, который гарантирует безопасность памяти на этапе компиляции, предотвращая многие подобные ошибки. Цель — предоставить те же команды, параметры и поведение, к которым вы привыкли, но на более надёжном фундаменте.

Ещё один плюс: uutils-coreutils изначально работает в Linux, macOS и Windows, упрощая использование единого набора инструментов в разных ОС.

Для администраторов Linux ключевые преимущества — повышенная безопасность памяти и, в некоторых сценариях, более высокая скорость обработки больших файлов.

Шаг 1. Проверка текущей версии GNU coreutils

Прежде чем экспериментировать, полезно узнать, какая версия установлена в системе, чтобы было с чем сравнивать.

Запустите:

ls --version

Вывод будет похож на такой:

ls (GNU coreutils) 9.4
Copyright (C) 2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Richard M. Stallman and David MacKenzie.

Если нужно посмотреть версию пакета, за которую отвечает дистрибутив, выполните подходящую команду.

В Ubuntu и Debian:

apt list --installed 2>/dev/null | grep coreutils

В RHEL, Rocky Linux, AlmaLinux и Fedora:

rpm -q coreutils

Пример вывода:

coreutils/noble-updates,now 9.4-3ubuntu6.2 amd64 [installed]

Шаг 2. Установка Rust и Cargo

uutils-coreutils написан на Rust, поэтому сначала потребуется инструментарий Rust. Рекомендованный способ — официальный установщик rustup, работающий во всех распространённых дистрибутивах.

Выполните:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

После завершения загрузите окружение Rust в текущую сессию:

source "$HOME/.cargo/env"

Проверьте, что пакетный менеджер Cargo установлен корректно:

cargo --version

Ожидаемый ответ:

cargo 1.79.0 (ffa9cf99a 2024-06-03)

Осталось добавить сборочные инструменты.

В Ubuntu и Debian:

sudo apt update
sudo apt install -y build-essential pkg-config libssl-dev

В RHEL, Rocky Linux, AlmaLinux и Fedora:

sudo dnf groupinstall -y "Development Tools"
sudo dnf install -y openssl-devel

Теперь всё готово для сборки проектов на Rust.

Шаг 3. Установка uutils-coreutils

Средствами Cargo установка выполняется одной командой:

cargo install coreutils

При успешном завершении вы увидите похожий вывод:

Building [=======================> ] 412/413: coreutils(bin)              
Finished `release` profile [optimized] target(s) in 2m 22s
  Installing /home/ravi/.cargo/bin/coreutils
  Installed package `coreutils v0.9.0` (executable `coreutils`)

В отличие от GNU coreutils, где каждая утилита — отдельный исполняемый файл, uutils предоставляет один мульти-вызовный бинарник coreutils, который сам определяет нужную команду по первому аргументу.

Чтобы бинарник был доступен из любого терминала, добавьте каталог Cargo в PATH:

echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

Теперь команда coreutils доступна глобально.

Шаг 4. Тестирование отдельных команд uutils

Бинарник coreutils может запускать любую из поддерживаемых утилит по имени, переданному первым аргументом.

Пример вызова ls от uutils:

~/.cargo/bin/coreutils ls -la

Вывод:

total 32
drwxr-xr-x  5 ravi ravi 4096 Jul  8 10:14 .
drwxr-xr-x 18 ravi ravi 4096 Jul  8 09:02 ..
-rw-r--r--  1 ravi ravi  220 Jul  8 09:02 .bash_logout
-rw-r--r--  1 ravi ravi 3771 Jul  8 09:02 .bashrc
drwxr-xr-x  8 ravi ravi 4096 Jul  8 10:11 .cargo

Аналогично проверяются другие команды:

~/.cargo/bin/coreutils wc -l /var/log/syslog
~/.cargo/bin/coreutils cat /etc/os-release
~/.cargo/bin/coreutils sort /tmp/mylist.txt

Чтобы увидеть полный список, выполните:

~/.cargo/bin/coreutils --list

Шаг 5. Симлинки для удобной работы

Постоянно набирать coreutils ls утомительно. Упростит жизнь отдельная директория с симлинками.

Создайте каталог и наполните его:

mkdir -p ~/uutils-bin

for cmd in $(~/.cargo/bin/coreutils --list); do
    ln -sf ~/.cargo/bin/coreutils ~/uutils-bin/$cmd
done

Здесь mkdir -p создаёт папку для симлинков (если её нет). Цикл проходит по всем командам из вывода --list и для каждой создаёт ссылку на единственный бинарник coreutils. Сам бинарник по имени, с которым его вызвали, понимает, какую утилиту изображать.

Важно: не прописывайте ~/uutils-bin перед /usr/bin в PATH на постоянной основе. Это подменит системные утилиты для всех сеансов и скриптов, что может привести к неожиданностям. Используйте этот путь только для временных тестов.

Для запуска временной оболочки с приоритетом uutils выполните:

PATH="$HOME/uutils-bin:$PATH" bash

Теперь ls, cat, wc и другие утилиты внутри этой сессии будут версиями от uutils. Закончив, просто выйдите:

exit

Шаг 6. Сравнение uutils-coreutils с GNU coreutils

Наглядный способ оценить разницу в скорости — прогнать тест на одном и том же файле.

Создайте крупный файл:

seq 1 20000000 > /tmp/bignum.txt

Замерьте время GNU wc:

time wc -l /tmp/bignum.txt

Пример результата:

20000000 /tmp/bignum.txt

real    0m0.412s
user    0m0.380s
sys     0m0.031s

Теперь тот же тест с uutils:

time ~/.cargo/bin/coreutils wc -l /tmp/bignum.txt

Пример вывода:

20000000 /tmp/bignum.txt

real    0m0.298s
user    0m0.271s
sys     0m0.026s

В этом примере uutils справился с подсчётом строк быстрее GNU-версии.

Как обновлять uutils-coreutils

Утилита установлена через Cargo, поэтому обновление элементарно:

cargo install coreutils --force

Флаг --force заставляет Cargo заменить текущую установку последней доступной версией.

Инструментарий Rust тоже стоит держать в актуальном состоянии:

rustup update

Это гарантирует свежий компилятор и инструменты, а с ними — исправления ошибок и приросты производительности.

Заключение

uutils-coreutils — современная реализация привычных команд GNU на Rust с упором на безопасность памяти и, в некоторых случаях, более высокую производительность. Хотя проект ещё не стал полной заменой GNU coreutils, его легко установить рядом и опробовать без риска для системы.

Если вас привлекают утилиты на Rust или вы хотите проверить, как они поведут себя на ваших задачах, uutils-coreutils стоит внимания. Протестируйте его с командами, которыми пользуетесь чаще всего, и примите решение — вписывается ли он в ваш рабочий арсенал.