Управление сервисами
В этом разделе описано использование systemd для управления операционной системой и сервисами.
Введение в systemd
systemd — это менеджер системы и сервисов в операционных системах Linux. Он обеспечивает обратную совместимость со скриптами инициализации SysV и LSB и поддерживает такие функции, как активация сервисов на основе сокетов и D-Bus, активация демонов по запросу, моментальные снимки состояния системы и управление точками монтирования и автоматического монтирования. За счет systemd можно усовершенствовать логику управления и параллелизацию сервисов.
Компоненты systemd
В systemd назначением большинства действий являются компоненты, представляющие собой ресурсы, которыми systemd знает, как управлять.
Компоненты классифицируются по представляемому ими типу ресурсов и определяются в файлах конфигурации компонентов.
Например, компонент avahi.service представляет демон Avahi и определен в файле avahi.service.
Доступные типы компонентов systemd:
| Тип | Расширение файла | Описание |
|---|---|---|
Компонент сервиса |
|
Системный сервис |
Целевой компонент |
|
Группа компонентов systemd |
Компонент автоматического монтирования |
|
Точка автоматического монтирования файловой системы |
Компонент устройства |
|
Файл устройства, распознаваемого ядром |
Компонент монтирования |
|
Точка монтирования файловой системы |
Компонент пути |
|
Файл или каталог в файловой системе |
Компонент области |
|
Внешне создаваемый процесс |
Компонент среза |
|
Группа иерархически упорядоченных компонентов, управляющих системными процессами |
Компонент сокета |
|
Сокет межпроцессного взаимодействия |
Компонент подкачки |
|
Устройство или файл подкачки |
Компонент таймера |
|
Таймер 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 startsystemctl start network.service -
Остановка сервисов:
SysVinit systemd service network stopsystemctl stop network.service -
Перезапуск сервисов:
SysVinit systemd service network restartsystemctl restart network.service -
Перезагрузка файла конфигурации без прерывания операции:
SysVinit systemd service network reloadsystemctl reload network.service -
Перезапуск сервиса, только если он работает:
SysVinit systemd service network condrestartsystemctl condrestart network.service -
Проверка состояния сервиса:
SysVinit systemd service network statussystemctl status network.service -
Включение сервиса, когда наступает время его активации или выполняется условие триггера для его включения:
SysVinit systemd chkconfig network onsystemctl enable network.service -
Отключение сервиса, когда наступает время его активации или выполняется условие триггера для его отключения:
SysVinit systemd chkconfig network offsystemctl disable network.service -
Проверка, включен ли сервис:
SysVinit systemd chkconfig networksystemctl is-enabled network.service -
Вывод списка всех сервисов на каждом уровне выполнения и проверка, включены ли они:
SysVinit systemd chkconfig --listsystemctl list-unit-files --type=service -
Перечисление уровней выполнения, на которых включен сервис, и тех, на которых он отключен:
SysVinit systemd chkconfig network --listls /etc/systemd/system/*.wants/network.service -
Команда создания сервисного файла или изменения настроек:
SysVinit systemd chkconfig network --addsystemctl 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 | Описание |
|---|---|---|
|
|
Операционная система выключена |
|
|
Операционная система работает в однопользовательском режиме |
|
|
Операционная система находится на уровне выполнения, который задан пользователем или относится к конкретному домену (по умолчанию эквивалентно уровню выполнения 3) |
|
|
Операционная система находится в неграфическом многопользовательском режиме и доступна из нескольких консолей или сетей |
|
|
Операционная система находится в графическом многопользовательском режиме. Все сервисы, работающие на уровне 3, доступны для входа через графический интерфейс |
|
|
Операционная система перезагружается |
|
|
Аварийная оболочка |
Просмотр цели запуска по умолчанию
Выполните следующую команду, чтобы просмотреть цель запуска системы по умолчанию:
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 haltsystemctl halt -
Выключение компьютера:
Команда Linux Команда systemctl poweroffsystemctl poweroff -
Перезагрузка:
Команда Linux Команда systemctl rebootsystemctl 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