Привет, Хабр! На связи Аргентум. Сегодня мы поговорим о системах инициализации в Linux, а точнее - об малоизвестной GNU Shepherd.

При запуске компьютера ядро проверяет процессор и память, обнаруживает и отчасти настраивает прочие устройства, монтирует корневую файловую систему, запускает систему инициализации.

В операционной системе Linux и других системах семейства Unix после завершения загрузки ядра начинается инициализация Linux системы, сервисов и других компонентов. За это отвечает процесс инициализации, он запускается ядром сразу после завершения загрузки, имеет PID 1, и будет выполняться пока будет работать система.

Давайте сначала узнаем какие есть системы инициализации.

  1. 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.

  2. 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;

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

  3. 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. Запуск параллельных сервисов и многое другое

  4. 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 не поддерживает приостановку и возобновление процессов.

GNU Shepherd

GNU Shepherd - это сервисный менеджер, который развивается разработчиками дистрибутива GNU Guix System в качестве альтернативы системе инициализации SysV-init, поддерживающей зависимости. Управляющий демон и утилиты Shepherd написаны на языке Guile (одна из реализаций языка Scheme), который также используется для определения настроек и параметров запуска сервисов. Shepherd уже применяется в дистрибутиве GNU Guix System и нацелен также на использование в GNU/Hurd, но может работать в любой POSIX-совместимой ОС, для которой доступен язык Guile.

Shepherd выполняет работу по запуску и остановке сервисов, учитывая взаимосвязь между сервисами, динамически определяя и запуская сервисы, от которых зависит выбранный сервис. Shepherd также поддерживает определение конфликтов между сервисами и предотвращает их одновременное выполнение. Проект может использоваться как в роли основной системы инициализации (init c PID 1), так и в обособленном виде для управления фоновыми процессами отдельных пользователей (например, для запуска tor, privoxy, mcron и т.п.) с выполнением с правами данных пользователей.

GNU Shepherd ранее был известен как GNU dmd. dmd изначально был разработан Вольфгангом Ярлингом при участии других разработчиков GNU. Впервые она была выпущена в 2003 году , что сделало ее одной из первых систем инициализации, отошедших от почтенного подхода System V. Его разработка тогда была тесно связана с GNU Hurd, хотя он всегда поддерживал и GNU/Linux.

После длительного периода заморозки он был возрожден в 2013 году. Первый выпуск с положительным номером состоялся в декабре 2013 года . С тех пор он использовался в качестве системы инициализации (PID 1) дистрибутива системы Guix.

В январе 2016 года GNU dmd был переименован в GNU Shepherd , чтобы избежать путаницы с одноименным проектом.

Текущая версия Shepherd на время написания статьи - 0.10.2

Вот так страшно и ужасно выглядит написание сервисов для GNU Shepherd. Это Scheme.
Вот так страшно и ужасно выглядит написание сервисов для GNU Shepherd. Это Scheme.

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

Установка Shepherd

В этой части статьи мы будем компилировать Shepherd из исходного кода. Я надеюсь, что у вас уже установлен линукс.

Но также вы можете установить shepherd из AUR, Alt Linux sisyphus

Если вы компилируете из исходного кода, у вас должен быть установлена система сборки пакетов make. Для Shepherd также требуется Guile (универсальный интеллектуальный язык GNU). для расширения), версия 2.x. Он использует GOOPS, но поскольку GOOPS является частью Guile, достаточно обычной установки Guile. Он также использует readline, хотя на самом деле это от него не зависит.

# получаем тар архив shepherd 0.10.2 через wget
wget https://ftp.gnu.org/gnu/shepherd/shepherd-0.10.2.tar.gz

# распаковываем
tar -xvf shepherd-0.10.2.tar.xz

./configure --prefix=/какой-то/путь
make
make check
make install

На самом деле настройка Shepherd в настоящее время требует некоторой работы. Для получения подробной информации вам следует прочитать руководство Texinfo: info -f shepherd.info

Заключение и полезные ссылки

Как мой вывод - gnu shepherd явно недоделанный Init, который можно использовать только для тестирования. Как пользователю на десктоп, gnu shepherd не пойдет. Может для всяких разработчиков или на старую машину, но для полноценного и каждодневного пользования - мое субъективное мнение - нет.

А вообще, выглядит как богом забытое творение. Я поспрашивал в разных чатах, мало кто знает об Shepherd - и еще меньше кто хоть как то работал с ним.

С вами был Аргентум, надеюсь вам понравилась статья! Учел ошибки из предыдущих, надеюсь ваше время не было потрачено зря!

Внимание! Ссылки ниже - не реклама, просто реально хорошие и интересные, как по мне, материалы.

Комментарии (14)


  1. NutsUnderline
    04.12.2023 17:48
    +2

    а на openwrt что используется?


    1. EvilMan
      04.12.2023 17:48
      +3

      В openwrt используется своя система инициализации и управления сервисами - procd


    1. Johan_Palych
      04.12.2023 17:48
      +1

      А доки почитать?
      "This mostly applies to traditional SysV-style initscripts, See procd-init-scripts as well for procd-style initscripts"
      https://openwrt.org/docs/techref/initscripts


      1. NutsUnderline
        04.12.2023 17:48

        с доками можно и статью не читать эту. Но тут как бы.. обзор


  1. kolobok38
    04.12.2023 17:48
    +2

    Guix - единственная рассововерная сборка GNU на линухе, которая ставит во главу угла reproducibility без которой ни о какой надёжности системы не стоит даже мечтать..


    1. fshp
      04.12.2023 17:48
      +1

      А как же nixos?


      1. kolobok38
        04.12.2023 17:48
        +2

        NixOS - унылая поделка на коленке от студентов по типу javascript предназначена чтобы нубы успешно прострелили себе обе ноги и не только.. , в то время как guix с shepherd на базе scheme (диалект lisp) с крайне строгой типизацией, очень продуманной архитектурой и защитой от дурака на этапе компиляции. Луркай reproducibility


        1. fshp
          04.12.2023 17:48
          +2

          А чем nix не reproducibility? Там тоже все декларативно описано вплоть до загрузчика.

          Любимый дистрибутив хаскелистов.


          1. kolobok38
            04.12.2023 17:48

            1. fshp
              04.12.2023 17:48
              +2

              Это мало о чем говорит без статистики количества активных пользователей. guix может 2 человека используют. Вы и разработчик.


              1. kolobok38
                04.12.2023 17:48

                )) ну можно с форточками сравнить кол-во юзверей, только вот они от этого лучше не станут.. криво статистику приплетаете, она таким образом на вопрос надежности не ответит.


                1. fshp
                  04.12.2023 17:48
                  +4

                  У меня есть репозиторий на гитхабе с 0 багрепортов. Получается я бог программирования?


                1. NutsUnderline
                  04.12.2023 17:48

                  открываем distowatch а там в топе MX Linux которая без systemd. nixOS - на 19ом местею но по цифрам - очень заметное отставание


                  1. Johan_Palych
                    04.12.2023 17:48

                    Просто для информации:
                    https://distrowatch.com/dwres.php?resource=popularity

                    The DistroWatch Page Hit Ranking statistics are a light-hearted way of measuring interest in Linux distributions and other free operating systems among the visitors of this website. They correlate neither to usage nor to quality and should not be used to measure the market share of distributions. They simply show the number of times a distribution page on DistroWatch was accessed each day, nothing more.