GNU Shepherd — что это за альтернатива systemD?

3bd21638873b207592e4e61532fc0612.png

SysVinit

SysVinit — это система инициализации, которая используется в большинстве дистрибутивов Linux. Она запускает все процессы и службы при запуске системы и управляет ими, основываясь на скриптах, расположенных в каталоге /etc/init.d.

Система System V Init (сокращённо Sysvinit) унаследована от UNIX пятой (V) версии. Система Upstart создана для Ubuntu Linux и была ненадолго принята также в Red Hat Enterprise Linux. Система systemd — наиболее новая, набирающая популярность, на основе идей программы launchd из операционной системы Mac OS.

Для операционной системы достаточно одной системы инициализации, но для совместимости (поддержания работоспособности старых программ) в инсталляции может быть одна основная система с элементами другой.

Рабочая среда может состоять из большого числа процессов. Систему инициализации настраивают так, чтобы запустить все необходимые процессы в нужном порядке. Предполагаемый результат называют «уровнем запуска» (runlevel) в Sysvinit и Upstart или «целью» (target) в systemd. Выключение компьютера и перезапуск операционной системы тоже считаются результатами — здесь тоже нужно соблюсти правильную последовательность действий и дать завершаемым процессам возможность сохранить свои данные.

Многие программы, формирующие рабочую среду, специально разработаны или настроены для работы в фоне, например: диспетчер электропитания acpid, диспетчер сети NetworkManager, служба точного времени ntpd, служба наблюдения за исправностью дисков smartd. В сочетании с файлами инициализации эти фоновые программы называют демонами службами или сервисами. Часто имя заканчивается на d (от daemon)/

Система Sysvinit запускает и останавливает демонов в заданном пользователем/администратором порядке; Upstart — формирует «дерево» откликов на «события» (обнаружение устройства, монтирование, запуск демона — могут быть событиями, требующими реакции в виде запуска другого демона); systemd — при запуске рассчитывает «дерево» зависимостей демонов друг от друга и запускает демонов по возможности параллельно.

Кроме init в системе инициализации есть файлы настройки демонов (файлы инициализации) и управляющие программы самой системы.

Файлы инициализации — текстовые, со специальным синтаксисом (своим для каждой системы). Для Sysvinit они располагаются в каталогах /etc/rc*.d/ (вместо звёздочки — число или ничего), /etc/conf.d/ и ещё есть файл /etc/inittab; для Upstart — /etc/init/ и /etc/init.d/ и файл inittab; для systemd — /lib/systemd/, /run/systemd/ и /etc/systemd/. Какая-то часть файлов является сценариями командной оболочки. Уровень запуска или цель systemd можно воспринимать как набор файлов инициализации, и система должна их выполнить (запустив соответствующие программы). Особенно много файлов — у systemd, отчасти она сама их создаёт.

Традиционный список уровней запуска:

0 — остановка системы (завершение процессов из user space, остановка работы ядра, и, если возможно, отключение электропитания);

1 — однопользовательский режим (доступна командная строка, нет сети, обычно используется как аварийный);

2 — многопользовательский режим (доступна командная строка, нет сети);

3 — многопользовательский режим (доступна командная строка, возможна сеть);

4 — не используется;

5 — многопользовательский режим (доступны и командная строка, и GUI, возможна сеть);

6 — перезагрузка.

В разных инсталляциях уровни запуска могут быть настроены иначе. В домашней системе обычно автоматически установлен уровень или цель, соответствующий традиционному 5. В Upstart уровень 2 соответствует традиционному 5; дополнительно есть обозначения N — «предыдущий неизвестен» и S — 1 (от single user). В systemd есть цели shutdown (примерно соответствует уровню 0); basic (1); multi-user (3); graphical (5).

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

Программы для GUI: Services Configuration Tool (system-config-services) для Sysvinit, Boot-Up manager (bum) для Sysvinit и Upstart, systemadm для systemd. Псевдографическая ntsysv для Sysvinit.

Процесс init является корневым предком всех процессов, кроме ядерных потоков. Поэтому в задачи init дополнительно входит «усыновление» процессов-сирот (orphan process) и их завершение.

Почти все дистрибутивы Linux изначально использовали SysV. Исключением была только Gentoo, в которой использовалась собственная система инициализации и Slackware, с инициализацией в стиле BSD.

Основные возможности SysV:

  • Написание файлов запуска служб на bash;

  • Последовательный запуск служб;

  • Сортировка порядка запуска с помощью номеров в именах файлов;

  • Команды для запуска, остановки и проверки состояния служб.

Никакой параллельной загрузки, системы зависимостей, запуска по требованию и автоматического запуска здесь не было и в помине.

С момента ее разработки прошло много лет и из-за некоторых недостатков были разработаны другие системы для ее замены, они хоть и имели новые функции и были более эффективны, но они были по-прежнему совместимы с SysV.

SystemD

Для кого-то эта система инициализации — злой дьявол, который вышел прямиком из секретных лабораторий Microsoft, дабы захватить человечество. Для других — это гениальное изобретение, которое помогает системным администраторам и пользователям. И те, и другие, отчасти правы, и отчасти не правы. Не мне решать, статья не об проблемах и плюсах systemD. Но вы можете порассуждать на эту злосчастную тему в комментариях.

Более десяти лет назад был анонсирован systemd, который устроил революцию в управлении системой дистрибутивов Linux, тем самым разделив пользователей Linux на несколько лагерей. Качество и природа дебатов не сильно улучшилась со времён пламенных войн 2012–2014 годов, и systemd всё ещё остаётся не до конца понятым и изученным инструментом и с технической, и с общественной стороны, несмотря на пристальное внимание к нему сообщества.

Подсистема инициализации и управления службами в Linux, фактически вытеснившая в 2010-е годы традиционную подсистему init. Основная особенность — интенсивное распараллеливание запуска служб в процессе загрузки системы, что позволяет существенно ускорить запуск операционной системы. Основная единица управления — модуль, одним из типов модулей являются «службы» — аналог демонов — наборы процессов, запускаемые и управляемые средствами подсистемы и изолируемые контрольными группами.

Основная цель systemd это ускорение загрузки операционной системы за счет распараллеливания запуска процессов и отложенного запуска.

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

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

Systemd — это новая система инициализации Linux. Она была введена по умолчанию в Fedora 15, а сейчас используется почти во всех популярных Linux дистрибутивах. Это не только инициализирующий процесс, поддерживающий огромное количество возможностей, но и набор инструментов для управления службами и этими возможностями из системы. Основная цель — иметь полный контроль над всеми процессами во время их запуска и на протяжении всего выполнения.

Systemd очень сильно отличается от всех существующих систем инициализации, тем как она работает с сервисами, и даже конфигурационными файлами сервисов. Совместимости со скриптами SysV нет, их нужно преобразовать в linux systemd unit файлы.

Вот ее основные особенности:

  • Понятный, простой и эффективный дизайн;

  • Параллельная загрузка служб на основе зависимостей;

  • Поддерживается завершение дополнительных процессов;

  • Поддерживается собственный журнал с помощью journald;

  • Поддерживается планирование заданий с помощью таймеров Systemd;

  • Поддерживается управление сетью с помощью networkd;

  • Для управления DNS используется systemd-resolved;

  • Хранение журналов в бинарных файлах;

  • Сохранение состояния сервисов linux systemd для возможного восстановления;

  • Улучшенная интеграция с Gnome DE;

  • Запуск сервисов по требованию;

OpenRC

Пожалуй, по известности я ее поставил бы на 2-е место.

Система инициализации на основе зависимостей, которая работает вместе с программой инициализации init. Она полностью совместима со сценариями Gentoo, но, тем не менее, может использоваться и в других дистрибутивах Linux и BSD.

Система OpenRC запускает необходимые системные сервисы в определённом порядке при загрузке, управляет ими во время работы системы и останавливает их при завершении работы. Она может управлять демонами, установленными из Gentoo репозитория, опционально контролируя процессы, которые он запускает, и имеет возможность запускать процессы параллельно (когда это возможно) для сокращения времени загрузки.

OpenRC является эволюцией SysVInit, разработанной специально для использования в ряде дистрибутивов Linux, включая Devuan. Она сохраняет простоту использования SysVInit, но добавляет несколько новых функций:

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

  • Использование сокетов и шаблонов: OpenRC позволяет определять службы, использующие сокеты и шаблоны, что делает его еще более гибким и масштабируемым.

  • Совместимость с SysVInit: OpenRC совместим с существующими SysVInit-скриптами, что упрощает переход с одной системы инициализации на другую.

Он предлагает некоторые выдающиеся функции, в том числе:

  1. Он может работать во многих других дистрибутивах Linux, включая Gentoo, а также в BSD.

  2. Поддерживает аппаратные сценарии инициализации.

  3. Поддерживает один файл конфигурации

  4. Конфигурации для каждой службы не поддерживаются

  5. Работает как демон

  6. Запуск параллельных сервисов и многое другое

Runit

Довольно неплохая система инициализации, как по мне. В целом он очень похож на init. Каталоги с уровнями инициализации хранятся в /etc/runit/номер_уровня.

Runit — это более простая подсистема инициализации, которая спроектирована как легкая и простая в использовании. Она использует простой, основанный на сценариях подход к запуску и остановке служб, подобно SysV init. Однако runit более эффективен, чем SysV init, с более быстрым временем загрузки и меньшим использованием ресурсов.

Runit — это кроссплатформенная система инициализации, которая может работать в GNU Linux, Solaris, BSD и MacOS. Это отличная альтернатива для SysV с поддержкой мониторинга состояния служб.

Здесь есть некоторые интересные особенности, которых нет в других системах инициализации:

  • Полный контроль сервисов, каждый сервис привязывается к своему каталогу;

  • Надежное средство журналирования и ротации логов;

  • Быстрая система загрузки и выключения;

  • Портативность;

  • Легкое создание файлов конфигурации служб;

  • Небольшое количество кода системы инициализации.

Runit является легковесной и быстрой системой инициализации, разработанной для оптимизации загрузки и управления процессами. Он отличается от SysVInit и OpenRC следующими особенностями:

  • Основан на концепции «supervise»:  Runit использует концепцию «supervise», которая позволяет легко запускать и управлять службами и процессами.

  • Простота и надежность:  Runit быстро загружается и обладает небольшим размером, что делает его идеальным для систем с ограниченными ресурсами.

  • Отсутствие поддержки приостановки и возобновления процессов:  Как и SysVInit, Runit не поддерживает приостановку и возобновление процессов.

© Habrahabr.ru