Systemd Essentials: работа с сервисами, модулями и журналом
Введение
В последние годы дистрибутивы Linux все чаще переходят с других систем инициализации на systemd
. Набор инструментов systemd
обеспечивает быструю и гибкую модель инициализации для управления всей машиной с момента загрузки.
В этом руководстве мы кратко рассмотрим наиболее важные команды, которые вам понадобятся для управления сервером с поддержкой systemd
. Они должны работать на любом сервере, на котором реализован systemd
(любая версия ОС не ниже Ubuntu 15.04, Debian 8, CentOS 7, Fedora 15). Давайте начнем.
Базовое управление юнитами
Базовый объект, которым systemd
управляет и на который воздействует, — это «юнит». Юниты могут быть разных типов, но наиболее распространенным типом является «сервис» (обозначается файлом юнитов, оканчивающимся на <.сервис). Для управления службами на сервере с поддержкой systemd
нашим основным инструментом является команда systemctl
.
Все обычные системные команды инициализации имеют эквивалентные действия с командой systemctl
. Для демонстрации мы будем использовать модуль nginx.service
(вам нужно будет установить Nginx с помощью менеджера пакетов, чтобы получить этот служебный файл).
Например, мы можем запустить службу, набрав:
- sudo systemctl start nginx.service
Мы можем остановить его снова, набрав:
- sudo systemctl stop nginx.service
Чтобы перезапустить службу, мы можем ввести:
- sudo systemctl restart nginx.service
Чтобы попытаться перезагрузить службу, не прерывая нормальную работу, мы можем ввести:
- sudo systemctl reload nginx.service
Включение или отключение юнитов
По умолчанию большинство юнит-файлов systemd
не запускаются автоматически при загрузке. Чтобы настроить эту функциональность, вам нужно «включить» устройство. Это привязывает его к определенной загрузочной «цели», заставляя ее запускаться при запуске этой цели.
Чтобы служба запускалась автоматически при загрузке, введите:
- sudo systemctl enable nginx.service
Если вы хотите снова отключить службу, введите:
- sudo systemctl disable nginx.service
Получение обзора состояния системы
Существует много информации, которую мы можем получить с сервера systemd
, чтобы получить общее представление о состоянии системы.
Например, чтобы получить все файлы юнитов, которые systemd
указали как «активные», введите (на самом деле вы можете не указывать list-units
, так как это значение по умолчанию поведение systemctl
):
- systemctl list-units
Чтобы вывести список всех юнитов, которые systemd
загрузил или пытался загрузить в память, включая те, которые в данный момент не активны, добавьте переключатель --all
:
- systemctl list-units --all
Чтобы вывести список всех модулей, установленных в системе, включая те, которые systemd
не пытался загрузить в память, введите:
- systemctl list-unit-files
Просмотр основной информации журнала
Компонент systemd
под названием journald
собирает и управляет записями журнала из всех частей системы. Это в основном информация журнала из приложений и ядра.
Чтобы просмотреть все записи журнала, начиная с самой старой записи, введите:
- journalctl
По умолчанию это покажет вам записи из текущей и предыдущей загрузки, если journald
настроен на сохранение предыдущих загрузочных записей. Некоторые дистрибутивы включают это по умолчанию, а другие нет (чтобы включить это, либо отредактируйте файл /etc/systemd/journald.conf
и установите для параметра Storage=
значение\persistent или создайте постоянный каталог, введя sudo mkdir -p /var/log/journal
).
Если вы хотите видеть только записи журнала текущей загрузки, добавьте флаг -b
:
- journalctl -b
Чтобы видеть только сообщения ядра, такие как те, которые обычно представлены dmesg
, вы можете использовать флаг -k
:
- journalctl -k
Опять же, вы можете ограничить это только текущей загрузкой, добавив флаг -b
:
- journalctl -k -b
Запрос состояний единиц и журналов
Хотя приведенные выше команды предоставили вам доступ к общему состоянию системы, вы также можете получить информацию о состоянии отдельных устройств.
Чтобы увидеть обзор текущего состояния объекта, вы можете использовать параметр status
с командой systemctl
. Это покажет вам, активно ли устройство, информацию о процессе и последние записи журнала:
- systemctl status nginx.service
Чтобы увидеть все записи журнала для рассматриваемого модуля, укажите параметр -u
с именем модуля для команды journalctl
:
- journalctl -u nginx.service
Как всегда, вы можете ограничить записи текущей загрузкой, добавив флаг -b
:
- journalctl -b -u nginx.service
Проверка модулей и файлов модулей
К настоящему моменту вы знаете, как изменить состояние устройства, запустив или остановив его, и вы знаете, как просмотреть информацию о состоянии и журнале, чтобы получить представление о том, что происходит с процессом. Однако мы еще не видели, как проверять другие аспекты юнитов и юнит-файлов.
Файл модуля содержит параметры, которые systemd
использует для управления модулем и его запуска. Чтобы просмотреть полное содержимое юнит-файла, введите:
- systemctl cat nginx.service
Чтобы увидеть дерево зависимостей юнита (какие юниты systemd
попытается активировать при запуске юнита), введите:
- systemctl list-dependencies nginx.service
Это покажет зависимые единицы с рекурсивно расширенными единицами target
. Чтобы рекурсивно расширить все зависимые единицы, передайте флаг --all
:
- systemctl list-dependencies --all nginx.service
Наконец, чтобы просмотреть низкоуровневые сведения о настройках устройства в системе, вы можете использовать параметр show
:
- systemctl show nginx.service
Это даст вам значение каждого параметра, которым управляет systemd
.
Изменение файлов модулей
Если вам нужно внести изменения в юнит-файл, systemd
позволяет вам вносить изменения из самой команды systemctl
, чтобы вам не нужно было переходить к реальному диску. расположение.
Чтобы добавить фрагмент файла модуля, который можно использовать для добавления или переопределения настроек в файле модуля по умолчанию, просто вызовите параметр edit
для модуля:
- sudo systemctl edit nginx.service
Если вы предпочитаете изменять все содержимое файла модуля вместо создания фрагмента, передайте флаг --full
:
- sudo systemctl edit --full nginx.service
После изменения юнит-файла вам следует перезагрузить сам процесс systemd
, чтобы изменения вступили в силу:
- sudo systemctl daemon-reload
Использование целей (уровней выполнения)
Другая функция системы инициализации заключается в переводе самого сервера между различными состояниями. Традиционные системы инициализации обычно называют их «уровнями выполнения», что позволяет системе находиться только на одном уровне выполнения в любой момент времени.
В systemd
вместо этого используются «цели». Цели — это в основном точки синхронизации, которые сервер может использовать для приведения сервера в определенное состояние. Служебные и другие файлы модулей могут быть привязаны к цели и нескольким цели могут быть активны одновременно.
Чтобы увидеть все цели, доступные в вашей системе, введите:
- systemctl list-unit-files --type=target
Чтобы просмотреть цель по умолчанию, которую systemd
пытается достичь при загрузке (что, в свою очередь, запускает все юнит-файлы, составляющие дерево зависимостей этой цели), введите:
- systemctl get-default
Вы можете изменить цель по умолчанию, которая будет использоваться при загрузке, с помощью параметра set-default
:
- sudo systemctl set-default multi-user.target
Чтобы увидеть, какие юниты привязаны к цели, вы можете ввести:
- systemctl list-dependencies multi-user.target
Вы можете изменить состояние системы для перехода между целями с помощью параметра изолировать
. Это остановит любые юниты, которые не привязаны к указанной цели. Убедитесь, что цель, которую вы изолируете, не останавливает важные службы:
- sudo systemctl isolate multi-user.target
Остановка или перезагрузка сервера
Для некоторых основных состояний, в которые может перейти система, доступны ярлыки. Например, чтобы выключить сервер, вы можете ввести:
- sudo systemctl poweroff
Если вы хотите вместо этого перезагрузить систему, это можно сделать, набрав:
- sudo systemctl reboot
Вы можете загрузиться в режиме восстановления, набрав:
- sudo systemctl rescue
Обратите внимание, что большинство операционных систем включают традиционные псевдонимы для этих операций, так что вы можете просто ввести sudo poweroff
или sudo reboot
без systemctl
. Однако не гарантируется, что это будет установлено во всех системах.
Следующие шаги
К настоящему времени вы должны знать основы управления сервером, использующим systemd
. Тем не менее, по мере расширения ваших потребностей вам предстоит еще многому научиться. Ниже приведены ссылки на руководства с более подробной информацией о некоторых компонентах, которые мы обсуждали в этом руководстве:
- Как использовать Systemctl для управления службами и модулями Systemd
- Как использовать Journalctl для просмотра журналов Systemd и управления ими
- Общие сведения о модулях Systemd и файлах модулей
Узнав, как использовать сильные стороны вашей системы инициализации, вы сможете контролировать состояние своих машин и более легко управлять своими службами и процессами.