В этом разделе описано использование systemd для управления операционной системой и сервисами.
- Управление сервисами
Введение в systemd#
systemd — это менеджер системы и сервисов в операционных системах Linux. Он обеспечивает обратную совместимость со скриптами инициализации SysV и LSB и поддерживает такие функции, как активация сервисов на основе сокетов и D-Bus, активация демонов по запросу, моментальные снимки состояния системы и управление точками монтирования и автоматического монтирования. За счет systemd можно усовершенствовать логику управления и параллелизацию сервисов.
Компоненты systemd#
В systemd назначением большинства действий являются компоненты, представляющие собой ресурсы, которыми systemd знает, как управлять. Компоненты классифицируются по представляемому ими типу ресурсов и определяются в файлах конфигурации компонентов. Например, компонент avahi.service представляет демон Avahi и определен в файле avahi.service. В таблице 1 перечислены доступные типы компонентов systemd.
Таблица 1. Доступные типы компонентов systemd
Все доступные типы компонентов systemd располагаются в одном из каталогов, приведенных в таблице 2 .
Таблица 2. Расположение доступных компонентов systemd
Возможности#
Быстрая активация#
Параллелизация в 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. Подробнее см. таблицу 3 . Рекомендуется использовать команду systemctl для управления системными сервисами.
Таблица 3. Сравнение команд SysVinit и systemd
Перечисление сервисов#
Чтобы вывести список всех загруженных в данный момент сервисов, выполните следующую команду:
systemctl list-units --type service
Чтобы вывести список всех сервисов вне зависимости от того, загружены они или нет, выполните следующую команду (с параметром all):
systemctl list-units --type service --all
Пример списка всех загруженных на данный момент сервисов:
$ systemctl list-units --type service
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
В таблице 4 описаны параметры в выходных данных команды.
Таблица 4. Выходные параметры
Чтобы проверить, запущен ли конкретный сервис, выполните следующую команду:
systemctl is-active name.service
Вывод команды is-active выглядит следующим образом:
Таблица 5. Вывод команды is-active
Точно так же, чтобы определить, включен ли конкретный сервис, выполните следующую команду:
systemctl is-enabled name.service
Вывод команды is-enabled выглядит следующим образом:
Таблица 6. Вывод команды is-enabled
Например, чтобы отобразить состояние gdm.service, выполните команду systemctl status 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 понятие уровней выполнения заменено на “цели” для большей гибкости. Например, вы можете наследовать существующую цель и преобразовать ее в цель для своих нужд, добавив другие сервисы. В таблице 7 представлен полный список уровней выполнения и соответствующих им целей systemd.
Таблица 7. Соответствие целей и уровней выполнения
Просмотр цели запуска по умолчанию#
Выполните следующую команду, чтобы просмотреть цель запуска системы по умолчанию:
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, когда это возможно. Соответствие между ними показано в таблице 8 .
Таблица 8. Соответствие systemctl старым командам управления системой Linux
Завершение работы операционной системы#
Чтобы завершить работу операционной системы и выключить систему, выполните от имени пользователя 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