Введение в systemd. Сервисы, юниты
Содержимое
Введение
В последнее время многие дистрибутивы Linux перешли на systemd с других демонов инициализации (например, upstart). Systemd является гибким и быстрым инструментом для управления сервером с момента загрузки.
В данном руководстве мы рассмотрим наиболее важные команды для управления сервером с systemd.
Требования
Скалет с ОС версии не ниже, чем следующие:
- Ubuntu 15.04
- Debian 8
- CentOS 7
- Fedora 15
Управление юнитами
Базовый объект, которым управляет systemd — это юнит (unit). Юниты могут быть многих типов, но самый часто используемый тип юнита — это сервис (название оканчивается на «.service»). Для управления сервисами используется команда systemctl.
Все команды обычного демона инициализации имеют аналог в systemctl. Продемонстрируем работу с данной командой на примере сервиса nginx.service.
Для начала, мы можем запустить сервис:
1
|
$ sudo systemctl start nginx.service
|
Также, мы можем остановить его:
1
|
$ sudo systemctl stop nginx.service
|
Или перезапустить:
1
|
$ sudo systemctl restart nginx.service
|
Мы можем перечитать конфигурационные файлы без перезапуска сервиса с помощью команды:
1
|
$ sudo systemctl reload nginx.service
|
Включение/отключение юнитов
По умолчанию, большинство юнитов не стартует автоматически при загрузке системы. Для конфигурирования этого поведения, необходимо включить юнит.
Для того, чтобы сервис запускался автоматически при загрузке выполните команду:
1
|
$ sudo systemctl enable nginx.service
|
Для отключения сервиса:
1
|
$ sudo systemctl disable nginx.service
|
Получение состояния системы
Это очень значимая возможность systemd.
Для примера, выведем список всех юнитов, числящихся активными в systemd:
1
|
$ systemctl list-units
|
Пример вывода:
1
|
<pre class="inline:true decode:1 " >UNIT LOAD ACTIVE SUB DESCRIPTION<br>atd.service loaded active running ATD daemon<br>avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack<br>dbus.service loaded active running D-Bus System Message Bus<br>dcron.service loaded active running Periodic Command Scheduler<br>dkms.service loaded active exited Dynamic Kernel Modules System<br>getty@tty1.service loaded active running Getty on tty1
|
UNIT: имя юнита
LOAD: прочитан ли юнит systemd — загружен ли в память
ACTIVE: состояние юнита — был ли успешно запущен
SUB: более низкоуровневое и точное описание состояния юнита
DESCRIPTION: текстовое описание предназначения юнита
Для вывода юнитов, которые загружены, или для которых была произведена попытка загрузки в память, но которые неактивны в данный момент, добавим параметр —all:
1
|
$ systemctl list-units --all
|
Для вывода всех юнитов в системе, выполните:
1
|
$ systemctl list-unit-files
|
Запрос состояния юнитов
Имеется также возможность получить информацию о состоянии отдельных юнитов.
Для показа состояния юнита, информации о процессе и последних записей лога — выполните (nginx.service — пример юнита):
1
|
$ systemctl status nginx.service
|
Чтобы проверить, активен ли юнит в данный момент:
1
|
$ systemctl is-active nginx.service
|
Для проверки, включен ли юнит, выполните команду:
1
|
$ systemctl is-enabled nginx.service
|
Для вывода всех записей лога:
1
|
$ journalctl -u nginx.service
|
Чтобы ограничить вывод последней загрузкой запустите, как обычно, с параметром -b:
1
|
$ journalctl -b -u nginx.service
|
Инспектирование юнитов и юнит-файлов
У юнит-файлов есть и другие параметры, используемые systemd для управления ими.
Для вывода полного содержимого юнит-файла выполните:
1
|
$ systemctl cat nginx.service
|
Вывод дерева зависимостей юнита (то есть то, какие юниты будут запущены при старте указанного [юнита]):
1
|
$ systemctl list-dependencies nginx.service
|
Для того, чтобы рекурсивно раскрыть зависимости второго и более уровней — добавьте параметр —all:
1
|
$ systemctl list-dependencies --all nginx.service
|
Вывод низкоуровневой информации о юните (со значениями каждого параметра, используемого systemd):
1
|
$ systemctl show nginx.service
|
Модификация юнит-файлов
При возникновении необходимости модификации юнит-файла, systemd предоставляет возможность сделать это напрямую — с помощью systemctl, без необходимости искать файл юнита на диске.
Для создания сниппета юнит-файла (сниппет может дополнять или перекрывать содержимое юнит-файла по умолчанию), выполните команду:
1
|
$ sudo systemctl edit nginx.service
|
В случае необходимости модификации существующего содержимого юнит-файла, вместо создания сниппета, нужен параметр —full:
1
|
$ sudo systemctl edit --full nginx.service
|
После модификации юнит-файла, необходимо перезагрузить процесс самого systemd, для подхвата изменений:
1
|
$ sudo systemctl daemon-reload
|
Цели (уровни выполнения)
Одной из традиционных функций систем инициализации в Linux является помещение системы в то или иное состояние. В классических системах инициализации, эти состояния называются уровнями выполнения (в отдельный момент выполнения система может быть только на одном уровне выполнения).
В systemd существует понятие целей. Цели, это точки синхронизации, используемые сервером, чтобы переместиться в нужное состояние. Сервисы и другие юнит-файлы могут быть привязаны к цели. Возможна одновременная активация нескольких целей.
Вывод всех целей, доступных в системе:
1
|
$ systemctl list-unit-files --type=target
|
Для просмотра цели по умолчанию, которую система пытается достичь при загрузке, выполните:
1
|
$ systemctl get-default
|
Для изменения цели, привязанной к этапу загрузки, выполните:
1
|
$ sudo systemctl set-default multi-user.target
|
Вывод юнитов, привязанных к указанной цели:
1
|
$ systemctl list-dependencies multi-user.target
|
Отключение и перезагрузка сервера
Отключение:
1
|
$ sudo systemctl poweroff
|
Перезагрузка:
1
|
$ sudo systemctl reboot
|
Загрузка в режим восстановления:
1
|
$ sudo systemctl rescue
|
Заключение
Итак, мы рассмотрели базовую функциональность утилиты systemctl. В следующих руководствах будут рассмотрены работа с journalctl и некоторые другие аспекты systemd.