
В репозитории systemd — системы инициализации, с которой стартует подавляющее большинство Linux-серверов мира, — появился, судя по всему, первый код на Rust. По объёму изменение скромное, по смыслу — знаковое: язык с гарантиями безопасности памяти официально добрался до самого чувствительного слоя дистрибутива, туда, где ещё недавно сама мысль о чём-либо кроме C считалась ересью. Что именно Rust может закрыть в системном коде, чему научил опыт ядра Linux и что смена языка значит для надёжности инфраструктуры, на которой держится интернет, — обо всём по порядку.

systemd — вовсе не «просто автозагрузка». Это процесс с номером PID 1, прямой наследник ядра: он запускает сервисы и следит за их жизнью, поднимает упавших, монтирует файловые системы, ведёт журнал (journald), настраивает сеть (networkd), резолвит DNS (resolved), управляет пользовательскими сессиями, контейнерами и таймерами. Debian, Ubuntu, Fedora, RHEL, SUSE и большинство производных дистрибутивов ставят его по умолчанию — фактически это и есть стандартный способ, которым Linux-машина становится Linux-машиной.
Отсюда и цена вопроса. И это не риторика: зависший PID 1 — мёртвый сервер, уязвимость в парсере — готовый вектор входа. Биография у systemd в этом смысле небезупречна: дыры находили и в DNS-заглушке resolved, и в DHCP-клиенте, и в обработке журналов. Кодовая база, по разным оценкам, давно перевалила за сотни тысяч строк на C, а темп разработки высок даже по меркам открытого кода. В таком режиме каждая новая строчка на C — лотерея, причём список проигрышных билетов известен заранее.

Цифры, которые в индустрии уже цитируют без ссылок: Microsoft ещё несколько лет назад признавала, что около 70% её критических уязвимостей — ошибки безопасности памяти. Google приводил почти ту же статистику по Android, а потом продемонстрировал и хорошую новость: как только новые компоненты перевели на Rust, доля таких дефектов устойчиво пошла вниз. Логичный вывод сделали и ведомства — NSA и CISA в последние годы прямо рекомендуют писать системный код на память-безопасных языках.
Rust закрывает эти дыры ещё до запуска программы. Владение и заимствование данных проверяет компилятор, поэтому use-after-free, выход за границы буфера и гонки данных в безопасном подмножестве языка просто не скомпилируются. Сборщика мусора нет, накладные расходы — на уровне C. Для systemd это ровно те места, где исторически селились баги: разбор недоверенного ввода — DNS-ответов, DHCP-пакетов, записей журнала, путей cgroups. Первые Rust-фрагменты, судя по сообщениям, невелики, но миграцию будут вести поступательно, компонент за компонентом.

До systemd ту же тропу протопало ядро: поддержка Rust официально вошла в него с релиза 6.1, и с тех пор появились первые настоящие драйверы. Без трений, судя по публичным дискуссиям, не обошлось — мейнтейнеры спорили о смешивании языков, о времени сборки, о том, кому чинить Rust-обвязки. Но главный итог, как принято считать, зафиксирован: соседство C и Rust в одном зрелом проекте возможно, а память-безопасные драйверы уже приносят реальную пользу.
Авторы systemd на этот эксперимент давненько поглядывали. Поддержка Rust встроена в систему сборки Meson, а Леннарт Поэттеринг, если верить его словам, ожидал, что роль языка будет расти — вплоть до возможного превращения в обязательную зависимость. Правду, сборку без Rust, судя по всему, пока сохранят. Дальше — классическая траектория принятия технологии: сначала язык допускают для отдельных утилит, затем новые модули пишут преимущественно на нём, а под конец он и есть мейнстрим проекта.

Российские дистрибутивы — Astra Linux, «Альт», RED OS, РОСА — построены вокруг того же systemd: в рамках импортозамещения на них переводят и государственные системы, и корпоративную инфраструктуру. Ситуация двойственная. С одной стороны, миграция в апстриме — многолетняя работа над надёжностью PID 1, которая достанется и отечественным сборкам. С другой — сертифицированные ветки обновляются, похоже, консервативно и от апстрима отстают, так что плоды этих трудов доберутся до защищённых контуров ещё не скоро.
Есть вопрос и приземлённее — сама цепочка сборки. Чтобы собрать systemd с Rust-компонентами, нужен актуальный компилятор Rust в доверенных репозиториях и воспроизводимая сборка. Задача решаемая, но инженерных ресурсов попросит. Компетенции в Rust в стране, судя по всему, растут: язык применяют крупные IT-компании в высоконагруженных сервисах, развиваются курсы и сообщество. Для разработчиков отечественных дистрибутивов это может стать окном возможностей — самим включиться в системную повестку апстрима, а не оставаться вечными потребителями готовых обновлений.
PID 1 ещё долго будет преимущественно C-кодом — проект такого масштаба не переписывают за квартал, и миграция, как ожидают, растянется на годы. Но главное не в сроках, а в направлении: оно зафиксировано. Безопасность памяти перестаёт быть темой вечных споров и становится базовым требованием к системному коду — как когда-то системы контроля версий или автотесты. Пользователи этого не заметят: серверы будут просто чуть реже падать и чуть реже отдаваться взломщикам. Зато для индустрии путь Rust от ядра к systemd — весомый аргумент в споре о том, каким быть фундаменту Linux. Эра «чистого C» в системной инфраструктуре, похоже, уходит в прошлое.