systemd - новая система инициализации от разработчиков Red Hat и Novell

Леннарт Поттеринг (Lennart Poettering), создатель звукового сервера PulseAudio, работающий в компании Red Hat, при участии разработчиков из компаний Novell, IBM, Intel и Nokia, подготовил прототип принципиальной новой системы инициализации для Linux - systemd, нацеленной на более интенсивную параллелизацию выполнения сервисов на этапе загрузки.

Работа systemd разделена на два основных этапа. На первом этапе осуществляется анализ конфигурации и построение плана выполнения инициализации, в котором учитываются не только вызываемые из скриптов программы, но и открываемые файлы, создаваемые сетевые сокеты и обращения к устройствам. Иными словами, если системы инициализации подобные Upstart как правило оперируют зависимостью между сервисами (события вида запустить B, после выполнения A), то systemd в качестве параметров взаимодействия учитывает такие дополнительные сущности, как сокеты и готовность устройств.

После построения плана выбирается наиболее оптимальный вариант параллельного запуска сервисов и сокращается повторный вызов программ (например, awk в процессе инициализации запускается около 92 раза, grep - 77 раз) и повторное обращения к типовым ресурсам (например, чтение значения таймера или получение параметров сетевого интерфейса). Процессы вызываются только при необходимости, т.е. например, CUPS не будет запущен до того, как локально или удаленно не будет обращения к сервису печати. Кроме обслуживания процесса загрузки, systemd выполняет также такие функции как управление процессами в системе и обеспечение корректной работы системы с новым динамически подключаемыми устройствами.

Базовым элементом systemd являются "юниты", которые связаны между собой и имеют определенный тип. Каждый юнит может требовать для своей работы другие юниты, конфликтовать с юнитами, определять возможность запуска только после или до определенного юнита (директивы конфигурации Requires, Conflicts, Before, After, Wants). Например, устройство может зависеть от сервиса, который должен быть запущен сразу после доступности устройства. Из типов юнитов определены:

  • Сервисы: стандартные демоны, которые могут быть запущены и остановлены. В роли сервисов также могут выступать классические SysV-скрипты инициализации.
  • Сокеты: точки привязки к сетевым или файловым сокетам, позволяющие построить ассоциацию с определенным сервисом. Например, в через сокет-юнит может быть задан сетевой порт, при обращении к которому автоматически должен быть вызвать определенный сервис (аналог inetd).
  • Устройства: элементы дерева устройств, которые могут обрабатываться с помощью udev.
  • Точки монтирования: задают используемые файловые системы, которые встречаются в /etc/fstab;
  • Точки автоматического монтирования (automount): определяет какую ФС смонтировать при обращении к заданной директории.
  • Цели: логические юниты для логической группировки юнитов. Например, multi-user.target идентичен run-level 5, bluetooth.target приводит к инициализации подсистемы bluetooth.
  • Снапшоты: логические юниты для запоминания и восстановления определенного состояния системы.

©  OpenNet