Системы инициализации

 

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

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

За время развития операционных систем были созданы различные системы инициализации Linux. В разных дистрибутивах использовались разные системы.

 

  1. System V init (SysV/ init)

старая система.. Её возможности:

  • Написание файлов запуска служб на bash;
  • Последовательный запуск служб;
  • Сортировка порядка запуска с помощью номеров в именах файлов;
  • Команды для запуска, остановки и проверки состояния служб.

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

 

Программа init читает конфигурационный файл /etc/inittab и запускает другие процессы, согласно инструкциям этого файла. "Вычислив" уровень запуска, init поочередно запускает сценарии из каталога

/etc/rc.d/rcX.d, где X — это номер уровня запуска.

 

id:5:initdefault:

# Инициализация системы

si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0

l1:1:wait:/etc/rc.d/rc 1

l2:2:wait:/etc/rc.d/rc 2

l3:3:wait:/etc/rc.d/rc 3

l4:4:wait:/etc/rc.d/rc 4

l5:5:wait:/etc/rc.d/rc 5

l6:6:wait:/etc/rc.d/rc 6

Команды:

# /etc/init.d/service start/stop

# service s start/stop

 

  1. OpenRC

OpenRC — это система инициализации Linux и Unix подобных операционных систем совместимая с Sys V Init и поддерживающая систему зависимостей во время запуска. Она приносит некоторые улучшения в SysV, и как и другие системы инициализации Linux, совместима с ней, но вы должны иметь в виду, что OpenRC не заменяет полностью файл /sbin/init. Эта система инициализации используется в Gentoo и дистрибутивах BSD.

Кроме стандартных возможностей SysV, здесь поддерживается также:

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

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



  1. Upstart

Upstart — это система инициализации на основе событий, разработанная в Canonical и призванная заменять SysV. Она может запускать системные службы, выполнять над ними различные задачи, инспектировать их во время выполнения, а также выполнять нужные действия в ответ на события в системе. Поддержка скриптов Sysvinit.

Это гибридная система инициализации, она использует как SysV скрипты запуска, так и файлы служб Systemd. Вот ее самые заметные особенности:

  • Изначально разработанная для Ubuntu, но может использоваться и в других дистрибутивах;
  • Запуск и остановка служб на основе событий;
  • Генерация событий во время запуска и остановки служб;
  • События могут быть отправлены обычными процессами;
  • Связь с процессом инициализации через DBus;
  • Пользователи могут запускать и останавливать свои процессы;
  • Перезапуск служб, которые неожиданно завершились;
  • Параллельная загрузка сервисов;
  • Автоматический перезапуск служб;

Большинство ее возможностей работают благодаря интеграции с системой инициализации Systemd.

 

Используют:

- Ubuntu 6.10 - 15.10

- Fedora 9 - 15

- Centos 6

 

Команды:

# service s start/stop/restart

# chkconfig s on/off

# chkconfig s --list

Статус сервисов:

# service --status-all

Добавить в автозагрузку:

# sudo update-rc.d имя_сервиса defaults

Удалить из автозагрузки:

# sudo update-rc.d -f имя_сервиса remove

 

  1. Systemd

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

 

Система systemd построена на концепции модулей (units). У каждого модуля есть свое имя и тип. Например, модуль типа nscd.service управляет сервисом (демоном) nscd.

 

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

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

  • Понятный, простой и эффективный дизайн;
  • Параллельная загрузка служб на основе зависимостей;
  • Лучший APIv;
  • Поддерживается завершение дополнительных процессов;
  • Поддерживается собственный журнал с помощью journald;
  • Поддерживается планирование заданий с помощью таймеров Systemd;
  • Хранение журналов в бинарных файлах;
  • Сохранение состояния сервисов linux systemd для возможного восстановления;
  • Улучшенная интеграция с Gnome;
  • Запуск сервисов по требованию;

 

Виды units:

  • service — запускает, останавливает или перезагружает демоны, также можно запускать SysV-сценарии.
  • socket — конфигурационный файл сокета, который связанный с определенным сервисом (service)
  • device — конфигурационный файл содержащий правило udev для обработки дерева устройств.
  • mount — монтирования файловой системы. Также можно получить информацию о файловой системы из файла /etc/fstab.
  • automount — автоматическое монтирование файловой системы.
  • target — логическая группировка единиц, ссылается на другие единицы. Например, bluetooth.target — запускает службы, при активации Bluetooth-устройства.
  • snapshot — создание ссылок на другие единицы, восстанавливает список ранее запущенных служб.
  • timer — подобие сron, активация единиц по таймеру.
  • swap — управление файлами подкачки.
  • path — активация других служб на основе inotify

 

Используют:

- Debian 8=>

- Centos 7=>

- Ubuntu 15.10=>

- Fedora 15=>

 

Systemd берет существующий /etc/init.d/service и на основе него генерирует скрипт для systemd. Его потом и запускает.

ExecStart=/etc/init.d/service start
ExecStop=/etc/init.d/service stop

 

Команды:

# systemctl

# systemctl -t service -a

# systemctl start/stop/restart s.service

# systemctl enable/disable s.service

# systemctl list-unit-files

sudo systemctl poweroff/reboot/rescue

 

Узнать список активных юнитов:

# systemctl list-units

Список загруженных, но неактивных юнитов:

# systemctl list-units --all

Скисок всех юнитов:

# systemctl list-unit-files

 

Узнать активен ли юнит:

# systemctl is-active nginx.service

Включен ли юнит:

# systemctl is-enabled nginx.service

Вывод всех логов юнита(-b - с последней загрузки):

# journalctl -b -u nginx.service

 

Узнать содержимое юнита:

# systemctl cat nginx.service

Зависимости юнита:

# systemctl list-dependencies nginx.service

Зависимости юнита рекурсивно:

# systemctl list-dependencies --all nginx.service

Низкоуровневые параметры юнита:

# systemctl show nginx.service

 

Создать юнит:

# sudo systemctl edit nginx.service

Модифицировать существующий:

# sudo systemctl edit --full nginx.service

Перезагрузка systemd:

# sudo systemctl daemon-reload

 

Все доступные цели в текущей ОС:

# systemctl list-unit-files --type=target

Цель по умолчанию:

# systemctl get-default

Чтобы задать цель по умолчанию:

# sudo systemctl set-default multi-user.target

Вывод юнитов, привязанных к цели multi-user.target:

# systemctl list-dependencies multi-user.target

 

Создание юнитов описано в статье: http://8.tw1.ru/index.php/po/27-systemd-unit

 

Материалы:

https://community.vscale.io/hc/ru/community/posts/211805669-%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2-systemd-%D0%A1%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D1%8B-%D1%8E%D0%BD%D0%B8%D1%82%D1%8B