itmo_conspects

Extra 1. Современные системы инициализации

Данный конспект был основан на записи лекции №9 (*тык*) с канала А. В. Маятина

Система инициализации init из UNIX System V в своей архитектуре имела недостаток: скрипты установленного уровня выполнения исполнялись последовательно единожды непосредственно после загрузки ОС. Из-за этого:

Upstart

В 2006 году компания Canonical, которая поддерживает дистрибутив Ubuntu, разработала замену - систему Upstart

Upstart был основан на событиях, которые заменили уровни исполнения. Такими событиями были:

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

Upstart стал системой инициализации в Ubuntu в 2006, в Fedora и Red Hat Enterprise Linux в 2010


Сама же система Upstart работает так: есть список заданий (job), которые как правило либо сервисы, либо краткосрочные задачи. Само описание заданий хранится в конфигурационных файлах /etc/init/<задание>.conf. Upstart постоянно отслеживает изменения в этих файлах

  1. При старте демон init (из /sbin/init) читает все описания заданий из /etc/init/
  2. Загруженное задание находится в цели stop и состоянии waiting и ждет наступления указанного в нем события
  3. Как только событие происходит, цель задания меняется на start, и оно последовательно проходит стадии: starting -> pre-start -> spawned -> post-start -> running
  4. Когда наступает событие для остановки, цель меняется на stop, и задание переходит в цепочку состояний: pre-stop -> stopping -> killed -> post-stop -> waiting

Само описание может выглядеть так:

# Описание сервиса
description "Мой сервис"

# Условия запуска: когда система переходит на "обычный" уровень
# и когда сетевые интерфейсы подняты
start on (runlevel [23] and net-device-up IFACE=eth0)

# Условия остановки: когда система выключается или перезагружается
stop on runlevel [!23]

# Команда, выполняемая при запуске сервиса
exec /usr/bin/my-server

# Перезапуск при падении
respawn

Несмотря на это, Upstart имел много недостатков:

В 2010 появилась система инициализации systemd. Далее с 2015 года systemd поставлялась во всех дистрибутивах, заменив Upstart и SysV init. Это привело к прекращению разработки Upstart в сентябре 2014 года

systemd

В конце 2009 года инженеры Леннарт Пёттеринг и Кей Зиверс из компании Red Hat сформулировали основные принципы будущей системы, которая бы заменила SysV init и Upstart. Тогда архитектор Леннарт Пёттеринг заметил, что:

Все эти недочеты были учтены в новой системе - systemd


Также systemd заменила уровни выполнения на цели. Цели представляли целевые состояния ОС, такие как многопользовательский режим или режим с графической подсистемой

Вместо заданий в systemd появились юниты. Юниты описывались текстовыми файлами в каталоге /usr/lib/systemd/system/, а расширение указывало на тип юнита:

Внутри текстовый файл содержит ее описание. Например, простой сервис может выглядеть так:

[Unit]
Description=My Application
After=network.target        # нужна цель `network`

[Service]
User=myappuser              # запустить от имени myappuser
ExecStart=/usr/bin/myapp    # исполняемый файл
Restart=on-failure          # перезапустить при падении
StandardOutput=journal      # записывать логи в журнал systemd

В секции [Unit] указывались зависимости сервиса:

В секции [Install] можно указать обратные зависимости:


При загрузке systemd читает конфигурацию, монтирует файловые системы, поднимает сеть, запускает системные службы и доводит систему до нужного целевого состояния, например до multi-user.target (многопользовательский режим) или graphical.target (режим с графической оболочкой)

Также systemd предоставляет инструменты для управления юнитами

Кроме этого вместо привычного названия процесса init появилось /usr/lib/systemd/systemd, что критиковалось многими консерваторами


Но у systemd есть недостатки:

Тем не менее сейчас почти все популярные дистрибутивы используют systemd

Другие системы инициализации

Помимо популярного systemd немногие дистрибутивы используют менее громоздкие решения