понедельник, 25 апреля 2016 г.

Юниты в Systemd

Юниты (UNITS) - это такое понятие (скорее, наверное, логическое), которое разделяет все те вещи которыми может управлять systemd на функциональные блоки. Например юниты служб, сокетов, файловых систем, устройств и т.д. Для работы с юнитами systemd использует особые конфигурационные файлы (unit files). Systemd использует эти файлы для конфигурации и управления системными ресурсами, такими как процессы или ваши файловые системы. Используя эти файлы вы заставляете systemd управлять вашей системой так как вам это нужно.

Для каждого юнита есть свой конфигурационный unit file.Эти файлы могут располагаться в нескольких разных местах в системе. Systemd ищет unit files в следующих каталогах:

/etc/systemd/system
/run/systemd/system
/usr/lib/systemd/system

Файлы в более высоком в иерархии каталоге имеют приоритет над низшими. Предпочтительно создавать и редактировать файлы в /etc так как там в основном сосредоточены все настройки в системе. Опасайтесь помещать и редактировать юнит-файлы в /usr поскольку в этот каталог система инсталлирует данные пакетов которые не желательно менять.

Systemd может быть запущен и в контексте конкретного пользователя и управлять его ресурсами. Unit-files для пользователя находятся в каталогах

/etc/systemd/user
/run/systemd/user
/usr/lib/systemd/user.

Приоритет каталогов такой-же как описано выше.

Для просмотра всех юнит-файлов установленных в системе, иначе говоря для того чтобы вывести список всех юнитов имеющихся в системе, используем команду

systemctl list-unit-files

Каждый юнит-файл содержит опции вида OptionName=value. Все опции разбиты по секциям. Синтаксис секций следующий [SectionName]

Два основных и наиболее общих для всех пользователей юнита - это service и target.

Чтобы посмотреть юнит-файлы относящиеся к определенному юниту, надо дать команду

systemctl list-unit-files --type service
systemctl list-unit-files --type target

Общий синтаксис команд таков:

sudo systemctl [command] NAME.OF.UNIT

Наиболее распространенными [command] являются start, stop, status,restart,enable,disable
Например, чтобы посмотреть статус юнита rsyslog.service даем команду systemctl status rsyslog.service
Для юнита nfs-client.target команда systemctl status nfs-client.target
Для более глубокого понимания как устроены юнит-файлы и как их писать смотри man systemd.unit
Существует также детальная информация для типов юнитов service и target

man systemd.service
man systemd.target

В конфигурационных файлах systemd можно найти строки содержащие  описание зависимостей, то есть, например, один юнит может потребовать для своей работы чтобы работал какой-либо другой юнит. Между юнитами существуют зависимости двух видов. Один юнит может "хотеть" (want) или "требовать" (require) другой юнит.
  • U1 Wants=U2
 Когда U1 запущен, U2 тоже успешно запустится. Если U2 сбойнет, то это не влияет на работу U1

  • U1 Require=U2 
Когда U1 запущен, U2 тоже успешно запустится. Но если U2 сбойнет, то U1 прекратит работу, даже если группа процессов U1 и работала нормально.
В этих примерах U1 и U2 стартуют в одно и то же время. Важно понимать что в systemd "зависимости" и "последовательность запуска" - это разные вещи. За последовательность запуска отвечают опции Before и After.
  • U1 Before=U2
U1 будет выполняться до старта U2
  • U1 After=U2
U2 будет выполняться до старта U1

Если нужна информация о том как systemd контролирует и управляет процессами, контрольными группами (cgroups) смотри этот полезный блог

среда, 20 апреля 2016 г.

Из чего состоит Systemd

Однажды на просторах интернета нашел картинку на которой изображено устройство systemd. Мне она показалась интересной и я попробовал в ней разобраться. Вот эта картинка:

Как видим systemd состоит из нескольких уровней. На уровне ядра systemd работает с контрольными группами (cgroups). А также с autofs и kdbus.
Если подниматься по рисунку снизу вверх, то выше мы увидим библиотеки используемые systemd.
Еще выше - systemd Core (ядро systemd). На этом уровне systemd состоит из менеджера и собственно systemd. Также на этом уровне используются так называемые юниты.
Юниты (UNITS) - это такое понятие (скорее, наверное, логическое), которое разделяет все те вещи которыми может управлять systemd на функциональные блоки. Например юниты служб, сокетов, файловых систем, устройств и т.д.
В systemd используется такое понятие как Цели (targets). Все они представлены на рисунке в разделе systemd Targets
В разделе systemd Daemons мы видим из каких демонов состоит systemd, а в самом верху рисунка перечислены утилиты по использованию, управлению и настройке systemd.
Некоторые из этих утилит доступны из командной строки непосредственно по названию (systemctl, journalctl, loginctl), а некоторые - с использованием суффикса systemd (systemd-analyze, systemd-notify).
Кроме того есть еще ряд утилит, которые не представлены на рисунке, но существуют, например systemd-cat, systemd-path, systemd-run и др. Если в консоли linux ввести команду sys и два раза нажать клавишу Tab, то можно увидеть список всех утилит, в том числе тех, которых нет на рисунке.
Отсутствие многих утилит на рисунке видимо связано с тем что все они не поместились, либо, вероятно эти новые утилиты были добавлены впоследствии, после того как был создан systemd и нарисован данный рисунок.