Введение в Systemd. Часть 2






Ключевой особенностью Systemd является то, что он самостоятельно создаёт сокеты, что позволяет запускать сервисы параллельно, как только минимально-необходимая  часть системы и локальная ФС готовы к работе. Суть подхода заключается в том, что Systemd самостоятельно создаёт необходимые сокеты, используемые для взаимодействия между сервисами в процессе их запуска и работы.

Systemd


Хорошим примером, иллюстрирующим описываемую концепцию, является взаимодействие D-Bus и Syslog. Когда запускается D-Bus, он подключается к сокету /dev/log и использует его для обмена данными с Syslog, получая таким образом возможность отправлять сообщения в системный лог. То есть получается, что при традиционном SysV-init подходе нельзя запустить D-Bus до тех пор, пока не будет запущен Syslog, создающий сокет /dev/log.

Systemd поступает следующим образом: он сам создаёт сокет /dev/log и после этого одновременно запускает оба сервиса. Все данные, полученные от D-Bus, будут храниться в буфере до тех пор, пока принимающая сторона не будет готова их забрать. Изначально Systemd возлагал функции буферизации на ядро, но современные версии Systemd предлагают функцию «journal», позволяющую отказаться от Syslog вообще.

Такой подход позволяет запускать одновременно Bluetooth, Avahi и другие сервисы, взаимодействующие с D-Bus или Syslog. Пока Avahi ожидает ответа от D-Bus, процесс её запуска приостанавливается до тех пор, пока не будет получен ответ от D-Bus. Если по каким-то причинам запуск D-Bus будет невозможен, Systemd прекратит процесс запуска Avahi и Bluetooth.

Похожий принцип Apple использует в своём launchd, появившийся в Mac OS X 10.4 и являющийся частью iOS. Именно переработанная подсистема инициализации ОС стала причиной более быстрого старта последних версий Mac OS, поскольку параллельный запуск сервисов позволяет более эффективно использовать ресурсы CPU и подсистемы ввода-вывода.

В традиционных же SysV-init системах службы запускаются в строго определённом порядке: Bluetooth и Avahi начнут запускать только тогда, когда будет запущен D-Bus, а тот в свою очередь будет запущен лишь тогда, когда будет готов к работе Syslog. Даже Bluetooth и Avahi, которые могли бы запускаться одновременно, в большинстве систем с традиционным SysV-init запускаются по очереди, определённой в init-сценариях.

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

Поскольку Systemd создаёт и управляет сокетом, он получает возможность перезапускать падающие службы, не прерывая работу зависимых сервисов. Это даёт возможность упростить обновление частей системы, поскольку перезапуск той или иной службы не повлечёт за собой перезапуск зависимых компонент.

Сокетами могут пользоваться различные приложения. Systemd использует эту возможность для того, чтобы фиксировать лог-сообщения ещё до того, как корневая ФС будет смонтирована в режиме чтения/записи. Для этого Systemd запускает небольшой лог-сервер на раннем этапе загрузочного процесса и принимает сообщения от приложений через сокет /dev/log до тех пор, пока Syslog не будет запущен. Как только Syslog запустится, мини-логгер Systemd передаст ему сообщения, полученные ранее, и завершит свою работу. Вся эта конструкция позволяет службам вообще не зависеть от состояния Syslog-демона.

Источник




Введение в Systemd. Часть 2: 2 комментария

  1. не помешало бы вычитать статью перед публикацией

    «Такой подход позволяет Bluetooth, Avahi и другие сервисы, взаимодействующие с D-Bus»

    «получая таким образом отправлять сообщения в системный лог»

    очень уж режет глаз такая «красота»

Комментарии запрещены.