Введение
В последнее время все больше дистрибутивов Linux переходит с других систем инициализации на systemd. Этот набор инструментов представляет быструю и гибкую модель инициализации для управления сервером с момента загрузки.
В данном руководстве мы рассмотрим наиболее важные команды, необходимые для управления сервером с поддержкой systemd. Они должны работать на версиях систем Ubuntu 15.04, Debian 8, CentOS 7, Fedora 15 и выше.
Основы управления сервисами (юнитами)
Базовый объект, с которым работает systemd, называется “юнитом” (unit). Есть много видов юнитов, но самым распространенным является служба (service, файл юнита заканчивается на .service). Основным инструментом для управления службами на сервере является команда systemctl.
У всех команд обычной системы инициализации есть эквиваленты в systemctl. В примерах мы будем использовать службу nginx.service. Если у вас её нет, установите ее при помощи менеджера пакетов.
Для запуска службы нужно ввести:
systemctl start nginx.service
Остановка осуществляется следующей командой:
systemctl stop nginx.service
Перезапуск службы:
systemctl restart nginx.service
Чтобы повторно загрузить файлы конфигурации службы, не прерывая ее работы, нужно выполнить команду:
systemctl reload nginx.service
Включение и отключение сервисов
По умолчанию большинство файлов юнитов systemd не запускаются при загрузке автоматически. Для настройки этой функции требуется “включить” юнит. Он привязывается к “цели” загрузки и запускается, когда выполняется это целевое действие.
Для включения автоматическооо запуска при загрузке введите:
systemctl enable nginx.service
Если нужно снова отключить службу:
systemctl disable nginx.service
Получение данных о состоянии системы
Мы можем получить от сервера с systemd огромное количество информации, чтобы узнать о состоянии системы.
Например, чтобы получить список юнитов, которые systemd считает активными, нужно выполнить следующую команду (можно даже не использовать опцию list-units, потому что она подразумевается по умолчанию):
sudo systemctl list-units
Для вывода списка юнитов, которые systemd загружал или пытался загрузить в память, в том числе не активные в данный момент, нужно указать опцию —all:
sudo systemctl list-units —all
Чтобы вывести все установленные в системе юниты, в том числе те, которые systemd не пытался загрузить в память, выполните команду:
sudo systemctl list-unit-files
Представленные выше команды показывали общее состояние системы, но можно также получить информацию о состоянии отдельных юнитов.
Для просмотра обзора текущего состояния самого юнита можно воспользоваться опцией status команды systemctl. Вы увидите, активен ли юнит, получите информацию о процессе и последние записи журнала:
systemctl status nginx.service
Файлы юнитов и зависимости
Файл юнита содержит параметры, используемые systemd для запуска и управления. Для просмотра полного содержимого файла юнита нужно выполнить команду:
systemctl cat nginx.service
Для просмотра дерева зависимостей юнита (другие юниты, активируемые systemd при запуске юнита), выполните команду:
systemctl list-dependencies nginx.service
Вывод списка зависимых юнитов, которые будут рекурсивно раскрыты. Для полного рекурсивного раскрытия всех зависимых юнитов (второй и большие уровни зависимости), воспользуйтесь опцией —all:
systemctl list-dependencies --all nginx.service
Для просмотра низкоуровневых данных о настройках юнита в системе используется опция show. В этом случае выводится значение каждого параметра, управляемого systemd:
systemctl show nginx.service
Изменение файлов юнитов
Если требуется изменить файл юнита, это можно сделать непосредственно командой systemctl, чтобы не искать его на диске.
Для создания сниппета файла юнита (блок, который может использоваться для дополнения или замены параметров файла юнита по умолчанию) нужно воспользоваться опцией edit:
sudo systemctl edit nginx.service
Если нужно изменить все содержимое файла, а не создавать сниппет, воспользуйтесь флагом —full:
sudo systemctl edit --full nginx.service
После изменения файла юнита нужно перезагрузить сам процесс systemd для принятия изменений:
sudo systemctl daemon-reload
Использование целей
Одна из функций системы инициализации — перевод сервера в различные состояния. Обычно они называются уровнями запуска или уровнями выполнения. В заданный момент времени система может находиться только на одном уровне выполнения. В таблице предоставлены доступные уровни запуска
Цель | Уровень |
poweroff.target | 0 |
rescue.target | 1 |
multi-user.target | 2 |
multi-user.target | 3 |
multi-user.target | 4 |
graphical.target | 5 |
reboot.target | 6 |
В systemd вместо этого применяются цели. Цель — это точка синхронизации, которой сервер может воспользоваться для перехода в определенное состояние. К цели можно привязать службы и другие юниты, одновременно может быть активно несколько целей. Для просмотра полного списка целей в системе нужно выполнить команду:
systemctl list-units --type=target
Для просмотра цели по умолчанию, которой systemd стремится достичь при загрузке (которая, в свою очередь, запускает все файлы юнитов, составляющие дерево зависимости этой цели), выполните команду:
systemctl get-default
multi-user.target соответствует третьему уровню запуска, проверить это можно командой
runlevel
При помощи опции set-default изменить цель по умолчанию, которая будет использоваться при загрузке:
systemctl set-default graphical.target
Для просмотра привязанных к цели юнитов можно выполнить следующую команду:
systemctl list-dependencies multi-user.target
Изменять состояние системы для перехода между можно при помощи isolate (изолировать). Она останавливает все юниты, не привязанные к указанной цели. Убедитесь что изолируемая вами цель не останавливает важные службы. Например команда
systemctl isolate reboot.target
Перезагрузит вашу систему.
Выключение и перезагрузка сервера
Для некоторых важных состояний системы есть ярлыки. Например, такой командой можно выключить сервер:
sudo systemctl poweroff
Перезагрузка системы:
sudo systemctl reboot
Загрузка в режиме восстановления:
sudo systemctl rescue
В большинстве операционных систем для этих операций есть стандартные алиасы, так что можно просто ввести
sudo poweroff
или
sudo reboot
без systemctl, но их может и не быть.
Заключение
Мы рассмотрели основы управления юнитами и службами при помощи команды systemctl, а также познакомились с концепцией целей. Для более подробной информации можно обратиться к соответствующим man-страницам