Проект systemd официально представил поддержку разработки программ на языке Rust после слияния запроса на слияние, отправленного разработчиком ядра Linux Кристианом Браунером. Это изменение, внесенное в основную ветку проекта, открывает новые возможности для разработки systemd, сохраняя при этом существующую архитектуру на основе языка C.
И прежде чем кто-то решит, что systemd готовится к полной переработке на Rust, скажем, что это не так. Разработчики договорились о намеренно ограниченном подходе: Rust можно использовать только для новых автономных компонентов, от которых не зависят другие части systemd. Существующие коды на C останутся нетронутыми.
Еще одно важное решение касается процесса сборки. Вместо того чтобы внедрять Cargo, стандартный менеджер пакетов и инструмент сборки Rust, systemd продолжает использовать Meson для всех сборок. Это позволяет интегрировать разработку на Rust в существующую инфраструктуру сборки проекта.
Реализация также накладывает строгие ограничения на зависимости. Программы на Rust используют подход no_std, то есть не полагаются на стандартную библиотеку Rust или внешние сторонние модули. Вместо этого они взаимодействуют с существующими библиотеками C в systemd через сгенерированные привязки.
Для управления памятью systemd предоставляет собственные реализации распространенных типов контейнеров на языке Rust, при этом ошибки выделения памяти обрабатываются явно, а не приводят к аварийному завершению работы программы. Новая инфраструктура также включает в себя оболочки для ведения журналов, обработки аргументов командной строки, обработки событий и управления ошибками, что позволяет утилитам на языке Rust работать так же, как их аналоги на языке C.
Поддержка Rust не является обязательной и автоматически определяется при настройке. Разработчикам, желающим ее включить, потребуется Rust 1.85 или более поздней версии, bindgen 0.71.1 или более поздней версии и Meson 1.4 или более поздней версии. Системы, в которых нет необходимого набора инструментов, могут продолжать собирать systemd без поддержки Rust.
Интересно, что первоначальные тесты показали, что урезанная утилита командной строки на Rust занимает около 32 КБ по сравнению с 20 КБ у ее аналога на C, собранного с оптимизацией времени компоновки. Это позволяет заранее оценить дополнительные издержки, хотя сравнение проводилось только на небольшой тестовой программе.
Первым реальным применением этой инфраструктуры станет systemd-keyring-setup — новая утилита, призванная помочь в управлении сертификатами в связках ключей ядра Linux. Ее реализация разрабатывается отдельно, вместе с дополнительными обертками Rust для общих библиотек systemd.
Для дистрибутивов Linux это изменение влечет за собой необходимость учитывать особенности упаковки. Для сборок, в которых включены все доступные функции, потребуются соответствующие зависимости компилятора Rust и bindgen, либо необходимо отключить поддержку Rust, чтобы избежать сбоев при сборке.
Станет ли Rust широко использоваться в systemd, зависит от дальнейшего развития, но необходимая основа уже заложена.
