Введение
В последние годы дистрибутивы Linux все чаще переходят с других систем инициализации на systemd
. Набор инструментов systemd
предоставляет быструю и гибкую модель инициализации для управления всей машиной с момента загрузки.
В этом руководстве мы дадим вам краткий обзор наиболее важных команд, которые вам нужно знать для управления включенным в systemd
сервером. Эти команды должны работать на любом сервере, который использует systemd
(любая версия ОС на уровне и выше Ubuntu 15.04, Debian 8, CentOS 7, Fedora 15). Давайте начнем.
Основное управление юнитами
Основной объект, который управляет и действует в systemd
, – это “юнит”. Юниты могут быть разных типов, но наиболее распространенным типом является “сервис” (обозначается файлом юнита с расширением .service
). Для управления сервисами на сервере с включенным systemd
нашим основным инструментом является команда systemctl
.
Все стандартные команды системы инициализации имеют эквивалентные действия с командой systemctl
. Мы будем использовать юнит nginx.service
для демонстрации (вам придется установить Nginx с помощью вашего менеджера пакетов, чтобы получить этот файл сервиса).
Например, мы можем запустить сервис, набрав:
Мы можем остановить его снова, набрав:
Чтобы перезапустить службу, мы можем набрать:
Чтобы попытаться перезагрузить службу без прерывания нормальной функциональности, мы можем набрать:
Включение или отключение единиц
По умолчанию большинство файлов юнитов systemd
не запускаются автоматически при загрузке. Для настройки этой функциональности вам нужно “включить” юнит. Это привязывает его к определенной загрузочной “цели”, вызывая его запуск при запуске этой цели.
Чтобы включить службу для автоматического запуска при загрузке, наберите:
Если вы хотите снова отключить службу, наберите:
Получение обзора состояния системы
Существует множество информации, которую мы можем получить с сервера systemd
, чтобы получить обзор состояния системы.
Например, чтобы получить все файлы юнитов, которые systemd
отметил как “активные”, наберите (на самом деле вы можете пропустить list-units
, так как это поведение systemctl
по умолчанию):
Для отображения всех юнитов, которые systemd
загрузил или пытался загрузить в память, включая те, которые в данный момент неактивны, добавьте ключ --all
:
Для отображения всех установленных на системе юнитов, включая те, которые systemd
не пытался загрузить в память, введите:
Просмотр основной информации журнала
A systemd
component called journald
collects and manages journal entries from all parts of the system. This is basically log information from applications and the kernel.
Чтобы увидеть все записи журнала, начиная с самой старой, введите:
По умолчанию это покажет вам записи из текущей и предыдущих загрузок, если journald
настроен на сохранение записей предыдущих загрузок. Некоторые дистрибутивы включают это по умолчанию, а другие — нет (чтобы включить это, либо отредактируйте файл /etc/systemd/journald.conf
и установите опцию Storage=
в “persistent”, либо создайте каталог для хранения предыдущих записей, набрав sudo mkdir -p /var/log/journal
).
Если вы хотите увидеть только записи журнала из текущей загрузки, добавьте флаг -b
:
Чтобы увидеть только сообщения ядра, такие как те, которые обычно представлены с помощью dmesg
, вы можете использовать флаг -k
:
Снова вы можете ограничить это только текущей загрузкой, добавив флаг -b
:
Запрос состояния и журналов Unit
Хотя вышеуказанные команды предоставляют доступ к общему состоянию системы, вы также можете получить информацию о состоянии отдельных юнитов.
Чтобы увидеть обзор текущего состояния юнита, вы можете использовать опцию status
с командой systemctl
. Это покажет вам, активен ли юнит, информацию о процессе и последние записи в журнале:
Чтобы увидеть все записи журнала для интересующего вас юнита, укажите опцию -u
с именем юнита для команды journalctl
:
Как всегда, вы можете ограничить записи текущей загрузкой, добавив флаг -b
:
Инспекция Юнитов и Файлов Юнитов
К настоящему моменту вы уже знаете, как изменить состояние юнита, запустив или остановив его, и знаете, как просматривать состояние и информацию из журнала, чтобы понять, что происходит с процессом. Однако мы еще не видели, как проверить другие аспекты юнитов и файлов юнитов.
A unit file contains the parameters that systemd
uses to manage and run a unit. To see the full contents of a unit file, type:
Чтобы увидеть дерево зависимостей юнита (какие юниты systemd
попытается активировать при запуске юнита), введите:
Это покажет зависимые единицы, с единицами target
, рекурсивно расширенными. Чтобы раскрыть все зависимые единицы рекурсивно, передайте флаг --all
:
Наконец, чтобы увидеть низкоуровневые детали настроек юнита в системе, вы можете использовать опцию show
:
Это позволит вам получить значение каждого параметра, управляемого systemd
.
Изменение файлов юнитов
Если вам нужно внести изменение в файл юнита, systemd
позволяет вам вносить изменения прямо из команды systemctl
, чтобы вам не приходилось переходить к фактическому местоположению на диске.
Чтобы добавить фрагмент файла юнита, который можно использовать для добавления или переопределения параметров в файле юнита по умолчанию, просто вызовите опцию edit
для юнита:
Если вы предпочитаете изменить весь контент файла юнита вместо создания фрагмента, передайте флаг --full
:
После изменения файла юнита вы должны перезагрузить сам процесс systemd
, чтобы применить ваши изменения:
Использование целей (уровней запуска)
Еще одной функцией системы инициализации является переход сервера между различными состояниями. Традиционные системы инициализации обычно называют их «уровнями запуска», позволяя системе находиться только в одном уровне запуска в любое время.
В systemd
вместо этого используются “цели”. Цели в основном являются точками синхронизации, которые сервер может использовать для перевода сервера в определенное состояние. Сервисы и другие файлы юнитов могут быть привязаны к цели, и несколько целей могут быть активны одновременно.
Чтобы увидеть все цели, доступные на вашей системе, введите:
Чтобы просмотреть целевую цель, которую systemd
пытается достичь при загрузке (что, в свою очередь, запускает все файлы юнитов, составляющие дерево зависимостей этой цели), введите:
Вы можете изменить целевую цель, которая будет использоваться при загрузке, используя опцию set-default
:
Чтобы узнать, какие юниты привязаны к цели, вы можете ввести:
Вы можете изменить состояние системы для перехода между целями с помощью опции isolate
. Это остановит любые юниты, не привязанные к указанной цели. Убедитесь, что цель, которую вы изолируете, не останавливает какие-либо важные сервисы:
Остановка или перезагрузка сервера
Для некоторых основных состояний, в которые система может перейти, доступны быстрые команды. Например, чтобы выключить сервер, вы можете ввести:
Если вы хотите перезагрузить систему, это можно сделать, набрав:
Вы можете загрузиться в режим спасения, набрав:
Обратите внимание, что в большинстве операционных систем для этих операций доступны традиционные псевдонимы, такие как sudo poweroff
или sudo reboot
без использования systemctl
. Однако это не гарантировано на всех системах.
Следующие шаги
К настоящему моменту вы должны знать основы управления сервером, использующим systemd
. Однако есть еще многое, что можно изучить по мере расширения ваших потребностей. Ниже приведены ссылки на руководства с более подробной информацией о некоторых компонентах, о которых мы говорили в этом руководстве:
- Как использовать systemctl для управления службами и модулями systemd
- Как использовать journalctl для просмотра и управления журналами systemd
- Понимание модулей и файлов модулей systemd
Изучив, как использовать сильные стороны вашей системы инициализации, вы сможете контролировать состояние ваших машин и более удобно управлять своими службами и процессами.