Управление сервисами

В этом разделе описано использование systemd для управления операционной системой и сервисами.

Введение в systemd

systemd — это менеджер системы и сервисов в операционных системах Linux. Он обеспечивает обратную совместимость со скриптами инициализации SysV и LSB и поддерживает такие функции, как активация сервисов на основе сокетов и D-Bus, активация демонов по запросу, моментальные снимки состояния системы и управление точками монтирования и автоматического монтирования. За счет systemd можно усовершенствовать логику управления и параллелизацию сервисов.

Компоненты systemd

В systemd назначением большинства действий являются компоненты, представляющие собой ресурсы, которыми systemd знает, как управлять. Компоненты классифицируются по представляемому ими типу ресурсов и определяются в файлах конфигурации компонентов. Например, компонент avahi.service представляет демон Avahi и определен в файле avahi.service.

Доступные типы компонентов systemd:

Тип Расширение файла Описание

Компонент сервиса

.service

Системный сервис

Целевой компонент

.target

Группа компонентов systemd

Компонент автоматического монтирования

.automount

Точка автоматического монтирования файловой системы

Компонент устройства

.device

Файл устройства, распознаваемого ядром

Компонент монтирования

.mount

Точка монтирования файловой системы

Компонент пути

.path

Файл или каталог в файловой системе

Компонент области

.scope

Внешне создаваемый процесс

Компонент среза

.slice

Группа иерархически упорядоченных компонентов, управляющих системными процессами

Компонент сокета

.socket

Сокет межпроцессного взаимодействия

Компонент подкачки

.swap

Устройство или файл подкачки

Компонент таймера

.timer

Таймер systemd

Все доступные типы компонентов systemd располагаются в одном из каталогов:

  • /usr/lib/systemd/system/ — компоненты, распространяемые с установленными пакетами RPM;

  • /run/systemd/system/ — компоненты, создаваемые во время выполнения;

  • /etc/systemd/system/ — компоненты, создаваемые и контролируемые системным администратором.

Возможности

Быстрая активация

Параллелизация в systemd более агрессивная, чем в UpStart. Активация на основе сокетов и D-Bus уменьшает время загрузки операционной системы.

Чтобы ускорить загрузку системы, systemd пытается сделать следующее:

  • активировать только необходимые процессы;

  • активировать как можно больше процессов параллельно.

Активация по требованию

При инициализации SysVinit активируются все возможные процессы фоновых сервисов, которые в принципе могут использоваться. Пользователи могут войти в систему только после активации всех этих сервисных процессов. Недостатки SysVinit очевидны: медленная загрузка системы и пустая трата системных ресурсов.

Некоторые сервисы могут практически никогда не использоваться во время работы системы. Например, сервисы печати CUPS на большинстве серверов используются редко. На многих серверах редко используется SSHD. Тратить время на запуск этих сервисов и системных ресурсов бессмысленно.

Активация systemd возможна только при запросе сервиса. Если запрос завершен, systemd останавливает работу.

Управление жизненным циклом сервисов с помощью Cgroups

Важной ролью системы инициализации является отслеживание и управление жизненным циклом сервисов. Она может запускать и останавливать сервис. Однако закодировать систему инициализации для остановки сервисов гораздо сложнее, чем можно подумать.

Сервисные процессы часто работают в фоновом режиме как демоны и иногда дважды разветвляются. Для UpStart необходима корректная настройка строфы expect в файле конфигурации. В противном случае UpStart не сможет узнать идентификатор процесса (PID) демона, подсчитав количество ответвлений.

Контрольные группы (Cgroups), давно используемые для управления квотами системных ресурсов, упрощают эти задачи. Их простота во многом обусловлена пользовательским интерфейсом, аналогичным файловой системе. Когда родительский сервис создает дочерний, последний наследует все атрибуты группы Cgroup, в которую входит первый. Это означает, что все необходимые сервисы помещаются в одну и ту же Cgroup. Для systemd достаточно просто пройтись по контрольной группе, чтобы найти PID всех нужных сервисов, а затем остановить их один за другим.

Управление точками монтирования и автоматического монтирования

В традиционных системах Linux пользователи могут поддерживать фиксированные точки монтирования файловой системы с помощью файла /etc/fstab. Эти точки автоматически монтируются при запуске системы. После запуска они становятся доступными. Эти точки монтирования являются файловыми системами, которые критически важны для работы всей системы, например каталогом HOME.

Как и SysVinit, systemd контролирует эти точки, чтобы они автоматически монтировались при запуске системы. И systemd также обеспечивает совместимость с файлом /etc/fstab. Вы по-прежнему можете использовать его для управления точками монтирования.

Бывают случаи, когда необходимы монтирование или размонтирование по требованию. Например, временная точка монтирования необходима для доступа к содержимому на DVD-диске. А когда оно больше не нужно, точка монтирования удаляется (с помощью команды umount) для экономии ресурсов. Традиционно это делается с помощью сервиса autofs.

При использовании systemd возможно автоматическое монтирование без необходимости установки autofs.

Управление транзакционными зависимостями

Загрузка системы включает множество отдельных заданий, некоторые из которых могут быть зависимыми друг от друга. Например, сетевая файловая система (NFS) может монтироваться только после активации сетевого подключения. В systemd возможен параллельный запуск многих зависимых заданий, но не всех из них.

Возвращаясь к примеру с NFS, невозможно смонтировать NFS и активировать сеть одновременно. Прежде чем запускать задание, systemd вычисляет его зависимости, создает временную транзакцию и проверяет, что эта транзакция непротиворечива (все необходимые сервисы могут быть активированы независимо друг от друга).

Совместимость со скриптами SysVinit

Как и в UpStart, в systemd вводятся новые методы настройки и предъявляются новые требования к разработке приложений. Если вы хотите заменить текущую систему инициализации на systemd, то нужно обеспечить совместимость systemd с существующей программой. В любом дистрибутиве Linux изменить весь код сервисов за короткое время для использования systemd будет непросто.

В systemd доступны функции, совместимые со скриптами инициализации SysVinit и LSB. Изменять имеющиеся в системе сервисы и процессы не требуется. Это уменьшает цену переноса системы на systemd, позволяя пользователям заменить на systemd имеющуюся систему инициализации.

Моментальные снимки и восстановление состояния системы

Запускать systemd можно по запросу. Из-за этого рабочее состояние системы изменяется динамически и вы не можете знать, какие конкретно сервисы в системе сейчас выполняются. Моментальные снимки systemd позволяют сохранять и восстанавливать текущее состояние работы системы.

Например, если в системе запущены сервисы A и B, вы можете выполнить команду systemd, чтобы создать моментальный снимок ее текущего состояния. Затем остановите процесс A или внесите в систему любое другое изменение, например запустите процесс C. После этого выполните команду systemd для восстановления из снимка, чтобы восстановить систему до точки, в которой был сделан снимок, то есть когда работали только сервисы A и B. Возможный сценарий применения — отладка. Например, если на сервере возникает исключение, пользователь может сохранить текущее состояние в виде моментального снимка для целей отладки и выполнить любую операцию, например остановить сервис. После завершения отладки происходит восстановление из снимка.

Управление системными сервисами

В systemd доступна команда systemctl для запуска, остановки, перезапуска, просмотра, включения и отключения системных сервисов.

Сравнение команд SysVinit и systemd

Функции команды systemctl из systemd подобны функциям команды SysVinit. Обратите внимание, что в этой версии поддерживаются команды service и chkconfig. Рекомендуется использовать команду systemctl для управления системными сервисами.

Сравнение команд SysVinit и systemd:

  • Запуск сервисов:

    SysVinit systemd
    service network start
    systemctl start network.service
  • Остановка сервисов:

    SysVinit systemd
    service network stop
    systemctl stop network.service
  • Перезапуск сервисов:

    SysVinit systemd
    service network restart
    systemctl restart network.service
  • Перезагрузка файла конфигурации без прерывания операции:

    SysVinit systemd
    service network reload
    systemctl reload network.service
  • Перезапуск сервиса, только если он работает:

    SysVinit systemd
    service network condrestart
    systemctl condrestart network.service
  • Проверка состояния сервиса:

    SysVinit systemd
    service network status
    systemctl status network.service
  • Включение сервиса, когда наступает время его активации или выполняется условие триггера для его включения:

    SysVinit systemd
    chkconfig network on
    systemctl enable network.service
  • Отключение сервиса, когда наступает время его активации или выполняется условие триггера для его отключения:

    SysVinit systemd
    chkconfig network off
    systemctl disable network.service
  • Проверка, включен ли сервис:

    SysVinit systemd
    chkconfig network
    systemctl is-enabled network.service
  • Вывод списка всех сервисов на каждом уровне выполнения и проверка, включены ли они:

    SysVinit systemd
    chkconfig --list
    systemctl list-unit-files --type=service
  • Перечисление уровней выполнения, на которых включен сервис, и тех, на которых он отключен:

    SysVinit systemd
    chkconfig network --list
    ls /etc/systemd/system/*.wants/network.service
  • Команда создания сервисного файла или изменения настроек:

    SysVinit systemd
    chkconfig network --add
    systemctl daemon-reload

Перечисление сервисов

Чтобы вывести список всех загруженных в данный момент сервисов, выполните команду:

systemctl list-units --type service

Чтобы вывести список всех сервисов вне зависимости от того, загружены они или нет, выполните команду с параметром --all:

systemctl list-units --type service --all

Пример списка всех загруженных на данный момент сервисов:

UNIT                        LOAD   ACTIVE     SUB     JOB   DESCRIPTION
atd.service                 loaded active     running       Deferred execution scheduler
auditd.service              loaded active     running       Security Auditing Service
avahi-daemon.service        loaded active     running       Avahi mDNS/DNS-SD Stack
chronyd.service             loaded active     running       NTP client/server
crond.service               loaded active     running       Command Scheduler
dbus.service                loaded active     running       D-Bus System Message Bus
dracut-shutdown.service     loaded active     exited        Restore /run/initramfs on shutdown
firewalld.service           loaded active     running       firewalld - dynamic firewall daemon
getty@tty1.service          loaded active     running       Getty on tty1
gssproxy.service            loaded active     running       GSSAPI Proxy Daemon
irqbalance.service          loaded active     running       irqbalance daemon
iscsid.service              loaded activating start   start Open-iSCSI

Отображение состояния сервисов

Чтобы отобразить состояние сервиса, выполните команду:

systemctl status name.service

Выходные параметры:

  • Loaded — информация о том, загружен ли сервис, абсолютный путь к файлу сервиса и запись о том, включен ли он.

  • Active — информация о том, запущен ли сервис, и метка времени.

  • Main PID — PID сервиса.

  • CGroup — дополнительная информация о связанных контрольных группах.

Чтобы проверить, запущен ли конкретный сервис, выполните команду:

systemctl is-active name.service

Вывод команды is-active выглядит следующим образом:

  • active(running) — какие-то сервисы в системе работают.

  • active(exited) — сервис, штатно завершающий работу после срабатывания только один раз. В настоящее время никакая программа в системе не запущена. Например, функция quotaon выполняется только при запуске или монтировании программы.

  • active(waiting) — программа ожидает других событий, чтобы продолжить работу. Например, сервис очереди печати запускается, но ему необходимо получить что-то в очередь (задания на печать), чтобы затем пробудить сервис принтера, который выполнит следующую функцию печати.

  • inactive — сервис не запущен.

Точно так же, чтобы определить, включен ли конкретный сервис, выполните команду:

systemctl is-enabled name.service

Вывод команды is-enabled выглядит следующим образом:

  • enabled — сервис постоянно включен через псевдоним Alias=, .wants/ или символьную ссылку .requires/ в каталоге /etc/systemd/system/.

  • enabled-runtime — сервис временно включен через псевдоним Alias=, .wants/ или символьную ссылку .requires/ в каталоге /run/systemd/system/.

  • linked — хотя файл компонента не находится в стандартном каталоге компонентов, на него имеются символьные ссылки в постоянном каталоге /etc/systemd/system/.

  • linked-runtime — хотя файл компонента не находится в стандартном каталоге компонентов, на него имеются символьные ссылки во временном каталоге /run/systemd/system/.

  • masked — сервис постоянно замаскирован в каталоге /etc/systemd/system/ (символьная ссылка на /dev/null). Из-за этого операция start не срабатывает.

  • masked-runtime — сервис временно замаскирован в каталоге /run/systemd/system/ (символьная ссылка на /dev/null). Из-за этого операция start не срабатывает.

  • static — сервис не включен. В разделе [Install] файла компонента нет доступного параметра для команды enable.

  • indirect — сервис не включен. Однако список значений для параметра Also= в разделе [Install] файла компонента не пустой (то есть некоторые компоненты в списке могли быть включены) либо файл компонента имеет символьную ссылку-псевдоним, которая не входит в список Also=. Для компонента шаблона это означает, что включен экземпляр, отличный от DefaultInstance=.

  • disabled — сервис не включен. Однако раздел [Install] файла компонента содержит параметры, доступные для команды enable.

  • generated — файл компонента создается генератором автоматически. Сгенерированный файл не может быть включен напрямую, но неявно включается генератором.

  • transient — файл компонента создается динамически и на время API-интерфейсом runtime (среды выполнения). Включение временного компонента невозможно.

  • bad — файл компонента неверный, или возникают другие ошибки. Команда is-enabled не возвращает это состояние, а выдает сообщение об ошибке. Этот компонент может быть отображен командой list-unit-files.

Например, чтобы отобразить состояние gdm.service, выполните команду:

systemctl status gdm.service

Пример вывода:

gdm.service - GNOME Display Manager   Loaded: loaded (/usr/lib/systemd/system/gdm.service; enabled)   Active: active (running) since Thu 2013-10-17 17:31:23 CEST; 5min ago
 Main PID: 1029 (gdm)
   CGroup: /system.slice/gdm.service
           ├─1029 /usr/sbin/gdm
           ├─1037 /usr/libexec/gdm-simple-slave --display-id /org/gno...
           └─1047 /usr/bin/Xorg :0 -background none -verbose -auth /r...Oct 17 17:31:23 localhost systemd[1]: Started GNOME Display Manager.

Запуск сервиса

Чтобы запустить сервис, выполните от имени пользователя root команду:

systemctl start name.service

Например, чтобы запустить сервис httpd, выполните команду:

systemctl start httpd.service

Остановка сервиса

Чтобы остановить сервис, выполните от имени пользователя root команду:

systemctl stop name.service

Например, чтобы остановить сервис bluetooth, выполните команду:

systemctl stop bluetooth.service

Перезапуск сервиса

Чтобы перезапустить сервис, выполните от имени пользователя root команду:

systemctl restart name.service

Эта команда останавливает выбранный сервис в текущем сеансе и сразу же запускает его снова. Если выбранный сервис не выполняется, эта команда также запускает его.

Например, чтобы перезапустить сервис bluetooth, выполните команду:

systemctl restart bluetooth.service

Включение сервиса

Чтобы настроить автоматический запуск сервиса во время загрузки системы, выполните команду от имени пользователя root:

systemctl enable name.service

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

systemctl enable httpd.service

Пример вывода:

ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service'

Отключение сервиса

Чтобы сервис не запускался во время загрузки системы автоматически, от имени пользователя root выполните команду:

systemctl disable name.service

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

systemctl disable bluetooth.service

Пример вывода:

Removed /etc/systemd/system/bluetooth.target.wants/bluetooth.service.
Removed /etc/systemd/system/dbus-org.bluez.service.

Изменение уровня выполнения

Уровни выполнения и цели

В systemd понятие уровней выполнения заменено на "цели" для большей гибкости. Например, вы можете наследовать существующую цель и преобразовать ее в цель для своих нужд, добавив другие сервисы. Ниже представлен полный список уровней выполнения и соответствующих им целей systemd.

Соответствие целей и уровней выполнения:

Уровень выполнения Цель systemd Описание

0

runlevel0.target, poweroff.target

Операционная система выключена

1, s, single

runlevel1.target, rescue.target

Операционная система работает в однопользовательском режиме

2, 4

runlevel2.target, runlevel4.target, multi-user.target

Операционная система находится на уровне выполнения, который задан пользователем или относится к конкретному домену (по умолчанию эквивалентно уровню выполнения 3)

3

runlevel3.target, multi-user.target

Операционная система находится в неграфическом многопользовательском режиме и доступна из нескольких консолей или сетей

5

runlevel5.target, graphical.target

Операционная система находится в графическом многопользовательском режиме. Все сервисы, работающие на уровне 3, доступны для входа через графический интерфейс

6

runlevel6.target, reboot.target

Операционная система перезагружается

emergency

emergency.target

Аварийная оболочка

Просмотр цели запуска по умолчанию

Выполните следующую команду, чтобы просмотреть цель запуска системы по умолчанию:

systemctl get-default

Просмотр всех целей запуска

Выполните следующую команду, чтобы просмотреть все цели запуска системы:

systemctl list-units --type=target

Изменение цели по умолчанию

Чтобы изменить цель по умолчанию, выполните от имени пользователя root следующую команду:

systemctl set-default name.target

Изменение текущей цели

Чтобы изменить текущую цель, выполните от имени пользователя root следующую команду:

systemctl isolate name.target

Переход в режим восстановления

Чтобы перевести операционную систему в режим восстановления, выполните команду от имени пользователя root:

systemctl rescue

Эта команда подобна команде systemctl isolate rescue.target. После выполнения команды на последовательный порт выводится следующая информация.

You are in rescue mode. After logging in, type "journalctl -xb" to viewsystem logs, "systemctl reboot" to reboot, "systemctl default" or "exit"to boot into default mode.
Give root password for maintenance
(or press Control-D to continue):
Чтобы перейти из режима восстановления в нормальный режим работы, необходимо перезагрузить систему.

Переход в аварийный режим

Чтобы перевести операционную систему в аварийный режим, выполните команду от имени пользователя root:

systemctl emergency

Эта команда подобна команде systemctl isolate emergency.target. После выполнения команды на последовательный порт выводится следующая информация.

You are in emergency mode. After logging in, type "journalctl -xb" to viewsystem logs, "systemctl reboot" to reboot, "systemctl default" or "exit"to boot into default mode.
Give root password for maintenance
(or press Control-D to continue):
Чтобы перейти из аварийного режима в нормальный режим работы, необходимо перезагрузить систему.

Завершение работы, приостановка и гибернация операционной системы

Команда systemctl

Вместо старых команд управления системой Linux в systemd используется команда systemctl для завершения работы, перезапуска, приостановки и гибернации операционной системы. Хотя предыдущие команды управления системой Linux по-прежнему доступны в systemd из соображений совместимости, рекомендуется использовать systemctl, когда это возможно.

Соответствие systemctl старым командам управления системой Linux:

  • Завершение работы системы:

    Команда Linux Команда systemctl
    halt
    systemctl halt
  • Выключение компьютера:

    Команда Linux Команда systemctl
    poweroff
    systemctl poweroff
  • Перезагрузка:

    Команда Linux Команда systemctl
    reboot
    systemctl reboot

Завершение работы операционной системы

Чтобы завершить работу операционной системы и выключить систему, выполните от имени пользователя root следующую команду:

systemctl poweroff

Чтобы завершить работу операционной системы, не выключая ее, от имени пользователя root выполните команду:

systemctl halt

По умолчанию при выполнении любой из этих команд systemd отправляет информационное сообщение всем пользователям, вошедшим в систему. Чтобы это сообщение systemd не отправлялось, выполните команду с параметром --no-wall:

systemctl --no-wall poweroff

Перезагрузка операционной системы

Чтобы перезагрузить операционную систему, от имени пользователя root выполните команду:

systemctl reboot

По умолчанию при выполнении любой из этих команд systemd отправляет информационное сообщение всем пользователям, вошедшим в систему. Чтобы это сообщение systemd не отправлялось, выполните команду с параметром --no-wall:

systemctl --no-wall reboot

Приостановка операционной системы

Чтобы приостановить работу операционной системы, выполните от имени пользователя root следующую команду:

systemctl suspend

Гибернация операционной системы

Чтобы перевести операционную систему в режим гибернации, от имени пользователя root выполните команду:

systemctl hibernate

Чтобы приостановить работу операционной системы и перевести ее в режим гибернации, выполните от имени пользователя root следующую команду:

systemctl hybrid-sleep