10.1. Вступление
Systemd – это системный и сервисный менеджер для операционных систем Linux. Он сохраняет обратную совместимость со сценариями инициализации SysV и предоставляет ряд функций, таких как параллельный запуск системных служб во время загрузки, активация демонов по требованию или логика управления сервисами на основе зависимостей. В Red Hat Enterprise Linux 7 systemd заменяет Upstart как систему инициализации по умолчанию.
Systemd вводит понятие юнитов. Юниты представлены файлами конфигурации, расположенными в одном из каталогов, перечисленных в таблице 10.2, «Расположение файлов юнитов Systemd» и содержат информацию о системных службах, прослушиваемых сокетах и других объектах, имеющих отношение к системе инициализации. Полный список доступных типов юнитов systemd см. В таблице 10.1 «Доступные типы юнитов systemd».
Таблица 10.1 Доступные типы юнитов systemd
Тип юнита
|
Расширение файла
|
Описание
|
Service unit
|
.service
|
Системные сервисы
|
Target unit (далее – таргет)
|
.target
|
Группа юнитов systemd
|
Automount unit
|
.automount
|
Точка автомонтирования файловой системы
|
Device unit
|
.device
|
Файл устройства, распознанного ядром
|
Mount unit
|
.mount
|
Точка монтирования файловой системы
|
Path unit
|
.path
|
Файл или директория в файловой системе
|
Scope unit
|
.scope
|
Процессы созданные извне
|
Slice unit
|
.slice
|
Группа иерархически организованных юнитов, которые управляют системными процессами.
|
Snapshot unit
|
.snapshot
|
Сохраненное состояние менеджера systemd
|
Socket unit
|
.socket
|
Сокет для межпроцессного взаимодействия
|
Swap unit
|
.swap
|
Swap-устройство или swap-файл
|
Timer unit |
.timer |
Таймер systemd |
Таблица 10.2. Расположение файлов юнитов systemd
Директория
|
Описание
|
/usr/lib/systemd/system/
|
Файлы юнитов systemd, помещенные сюда
при установке RPM-пакетов
|
/run/systemd/system/
|
Юниты systemd созданные в рантайме.
Эта директория имеет приоритет
над директорией /usr/lib/systemd/system/
|
/etc/systemd/system/
|
Файлы юнитов systemd, созданные с помощью systemctl,
а также файлы юнитов, добавленных for extending a service.
Эта директория имеет приоритет над директорией
/run/systemd/system/ |
Переопределение дефолтной конфигурации systemd с использованием system.conf
Дефолтная конфигурация systemd определяется во время компиляции и ее можно найти в файле конфигурации /etc/systemd/system.conf. Используйте этот файл, если вы хотите отклониться от дефолтных настроек и перезаписать глобальные значения по умолчанию для юнитов systemd.
Например, чтобы переопределить дефолтное значение таймаута, которое установлено в 90 секунд, используйте параметр DefaultTimeoutStartSec для ввода необходимого значения.
DefaultTimeoutStartSec=required value
Здесь required value – требуемое значение в секундах.
Смотрите также Example 10.21, “Changing the timeout limit”.
10.1.1. Основные функции
В Red Hat Enterprise Linux 7 система systemd и менеджер сервисов предоставляют следующие основные функции:
- Активация, основанная на сокетах – Во время загрузки systemd создает прослушиваемые сокеты для всех системных сервисов которые поддерживают этот тип активации, и передает сокеты этим сервисам сразу после их запуска. Это не только позволяет системе запускать службы параллельно, но также позволяет перезапустить службу, не теряя при этом сообщения, отправленные на него, пока оно недоступно: соответствующий сокет остается доступным и все сообщения помещаются в очередь.
Systemd использует .socket юниты для активации, основанной на сокетах.
- Активация, основанная основе шины (D-Bus)- Системные службы, использующие D-Bus для межпроцессного взаимодействия, могут запускаться по требованию при первой попытке клиентского приложения связаться с ними. Systemd использует служебные файлы D-Bus для активации на основе шины.
- Активация на основе устройств – Системные службы, поддерживающие активацию на основе устройств, могут запускаться по требованию, когда подключается или становится доступным определенный тип оборудования. Systemd использует .device юниты для активации на основе устройств.
- Активация на основе пути – Системные службы, поддерживающие активацию на основе пути, могут запускаться по требованию, когда определенный файл или каталог изменяет свое состояние. Systemd использует .path юниты для активации на основе пути.
Управление точками монтирования и автомонтирования – Systemd контролирует и управляет точками монтирования и автомонтирования. Для этого systemd использует юниты .mount или .automount соответственно.
- Агрессивная параллелизация – Из-за использования активации на основе сокетов systemd может запускать системные службы параллельно, как только все прослушивающие сокеты находятся на своем месте. В сочетании с системными службами, поддерживающими активацию по требованию, параллельная активация значительно сокращает время, необходимое для загрузки системы.
- Транзакционная логика активации юнитов – До активации или деактивации юнита systemd вычисляет зависимости, создает временную транзакцию и проверяет, что эта транзакция является последовательной. Если транзакция непоследовательна, systemd автоматически пытается ее исправить и удалить из нее ненужные задания перед сообщением об ошибке.
- Обратная совместимость с SysV init – Systemd поддерживает сценарии инициализации SysV, как описано в Базовой спецификации Linux Standard, что упрощает переход к systemd.
10.1.2. Изменения совместимости
Система systemd и диспетчер сервисов разработаны с учетом совместимости с системами инициализации SysV и Upstart. Ниже перечислены наиболее заметные изменения по сравнению с предыдущим мажорным релизом системы Red Hat Enterprise Linux:
- Systemd имеет ограниченную поддержку ранлевелов. Он предоставляет номера таргетов, которые могут быть сопоставлены с ранлевелами для совместимости, просмотреть какому ранлевелу соответствует текущий таргет можно командой runlevel. Не все таргеты systemd могут быть сопоставлены с ранлевелом. В случае, если ранлевел не может быть сопоставлен команда вернет значение N. Рекомендуется по возможности избегать применения команды runlevel.
- Для получения дополнительной информации о таргетах в systemd и их сравнении с уровнями выполнения, см. Раздел 10.3 “Работа с таргетами в systemd”.
- Утилита systemctl не поддерживает пользовательские команды. Помимо стандартных команд, таких как start, stop и status, авторы сценариев инициализации SysV предоставляют поддержку любого количества команд для обеспечения дополнительной функциональности. Например, init-скрипт для iptables в Red Hat Enterprise Linux 6 может быть выполнен с командой panic, которая сразу же активирует режим паники и перенастроит систему так, что начнется удаление всех входящих и исходящих пакетов. В systemd такое не поддерживается, утилита systemctl принимает только задокументированные команды.
- Для получения дополнительной информации об утилите systemctl и ее сравнении с предыдущей утилитой service см. Раздел 10.2 Управление системными сервисами.
- Утилита systemctl не взаимодействует со службами, которые не были запущены через systemd. Когда systemd запускает системный сервис, он сохраняет идентификатор основного процесса, чтобы отслеживать его. Утилита systemctl затем использует этот PID для запроса и управления сервисом. Т.е., если пользователь запускает конкретный демон непосредственно в командной строке, systemctl не может определить его текущий статус или остановить его.
- Systemd останавливает только запущенные сервисы. Ранее, когда инициализировался процесс выключения, RHEL 6 и предыдущие релизы символические ссылки, расположенные в директории /etc/rc0.d/ чтобы остановить все доступные сервисы независимо от их статуса. В systemd только запущенные сервисы завершаются при выключении.
- Системные сервисы недоступны для чтения из стандартного потока ввода. Когда systemd запускает сервис, он подключает его к стандартному вводу в /dev/null чтобы предотвратить какое-либо взаимодействие с пользователем.
- Системные сервисы не наследуют никакого контекста (таких, как переменные среды PATH и HOME) от вызывающего их пользователя или его сессии. Каждый сервис запускается в чистом контексте выполнения.
- При загрузке init-скрипта SysV, systemd считывает информацию о зависимостях из заголовка Linux Standard Base (LSB) и интерпретирует ее во время выполнения.
- Для всех операций с service-юнитами установлен тайм-аут по умолчанию 5 минут, чтобы предотвратить сбой сервиса из-за зависания системы. Это значение жестко запрограммировано для служб, которые генерируются из скриптов инициализации и не может быть изменено. Однако могут использоваться отдельные конфигурационные файлы для указания более длительного времени ожидания определенного сервиса, см Example 10.21, “Changing the timeout limit”
Подробный список изменений, введенных с systemd см. Migration Planning Guide for Red Hat Enterprise Linux 7.
|