GNU Shepherd — что это за альтернатива systemD?
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-скриптами, что упрощает переход с одной системы инициализации на другую.
Он предлагает некоторые выдающиеся функции, в том числе:
Он может работать во многих других дистрибутивах Linux, включая Gentoo, а также в BSD.
Поддерживает аппаратные сценарии инициализации.
Поддерживает один файл конфигурации
Конфигурации для каждой службы не поддерживаются
Работает как демон
Запуск параллельных сервисов и многое другое
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 не поддерживает приостановку и возобновление процессов.