Основы systemd: работа с сервисами, юнитами и журналом

Введение

В последние годы дистрибутивы Linux все чаще переходят с других систем инициализации на systemd. Набор инструментов systemd предоставляет быструю и гибкую модель инициализации для управления всей машиной с момента загрузки.

В этом руководстве мы дадим вам краткий обзор наиболее важных команд, которые вам нужно знать для управления включенным в systemd сервером. Эти команды должны работать на любом сервере, который использует systemd (любая версия ОС на уровне и выше Ubuntu 15.04, Debian 8, CentOS 7, Fedora 15). Давайте начнем.

Основное управление юнитами

Основной объект, который управляет и действует в systemd, – это “юнит”. Юниты могут быть разных типов, но наиболее распространенным типом является “сервис” (обозначается файлом юнита с расширением .service). Для управления сервисами на сервере с включенным systemd нашим основным инструментом является команда systemctl.

Все стандартные команды системы инициализации имеют эквивалентные действия с командой systemctl. Мы будем использовать юнит nginx.service для демонстрации (вам придется установить Nginx с помощью вашего менеджера пакетов, чтобы получить этот файл сервиса).

Например, мы можем запустить сервис, набрав:

  1. sudo systemctl start nginx.service

Мы можем остановить его снова, набрав:

  1. sudo systemctl stop nginx.service

Чтобы перезапустить службу, мы можем набрать:

  1. sudo systemctl restart nginx.service

Чтобы попытаться перезагрузить службу без прерывания нормальной функциональности, мы можем набрать:

  1. sudo systemctl reload nginx.service

Включение или отключение единиц

По умолчанию большинство файлов юнитов systemd не запускаются автоматически при загрузке. Для настройки этой функциональности вам нужно “включить” юнит. Это привязывает его к определенной загрузочной “цели”, вызывая его запуск при запуске этой цели.

Чтобы включить службу для автоматического запуска при загрузке, наберите:

  1. sudo systemctl enable nginx.service

Если вы хотите снова отключить службу, наберите:

  1. sudo systemctl disable nginx.service

Получение обзора состояния системы

Существует множество информации, которую мы можем получить с сервера systemd, чтобы получить обзор состояния системы.

Например, чтобы получить все файлы юнитов, которые systemd отметил как “активные”, наберите (на самом деле вы можете пропустить list-units, так как это поведение systemctl по умолчанию):

  1. systemctl list-units

Для отображения всех юнитов, которые systemd загрузил или пытался загрузить в память, включая те, которые в данный момент неактивны, добавьте ключ --all:

  1. systemctl list-units --all

Для отображения всех установленных на системе юнитов, включая те, которые systemd не пытался загрузить в память, введите:

  1. systemctl list-unit-files

Просмотр основной информации журнала

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.

Чтобы увидеть все записи журнала, начиная с самой старой, введите:

  1. journalctl

По умолчанию это покажет вам записи из текущей и предыдущих загрузок, если journald настроен на сохранение записей предыдущих загрузок. Некоторые дистрибутивы включают это по умолчанию, а другие — нет (чтобы включить это, либо отредактируйте файл /etc/systemd/journald.conf и установите опцию Storage= в “persistent”, либо создайте каталог для хранения предыдущих записей, набрав sudo mkdir -p /var/log/journal).

Если вы хотите увидеть только записи журнала из текущей загрузки, добавьте флаг -b:

  1. journalctl -b

Чтобы увидеть только сообщения ядра, такие как те, которые обычно представлены с помощью dmesg, вы можете использовать флаг -k:

  1. journalctl -k

Снова вы можете ограничить это только текущей загрузкой, добавив флаг -b:

  1. journalctl -k -b

Запрос состояния и журналов Unit

Хотя вышеуказанные команды предоставляют доступ к общему состоянию системы, вы также можете получить информацию о состоянии отдельных юнитов.

Чтобы увидеть обзор текущего состояния юнита, вы можете использовать опцию status с командой systemctl. Это покажет вам, активен ли юнит, информацию о процессе и последние записи в журнале:

  1. systemctl status nginx.service

Чтобы увидеть все записи журнала для интересующего вас юнита, укажите опцию -u с именем юнита для команды journalctl:

  1. journalctl -u nginx.service

Как всегда, вы можете ограничить записи текущей загрузкой, добавив флаг -b:

  1. journalctl -b -u nginx.service

Инспекция Юнитов и Файлов Юнитов

К настоящему моменту вы уже знаете, как изменить состояние юнита, запустив или остановив его, и знаете, как просматривать состояние и информацию из журнала, чтобы понять, что происходит с процессом. Однако мы еще не видели, как проверить другие аспекты юнитов и файлов юнитов.

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:

  1. systemctl cat nginx.service

Чтобы увидеть дерево зависимостей юнита (какие юниты systemd попытается активировать при запуске юнита), введите:

  1. systemctl list-dependencies nginx.service

Это покажет зависимые единицы, с единицами target, рекурсивно расширенными. Чтобы раскрыть все зависимые единицы рекурсивно, передайте флаг --all:

  1. systemctl list-dependencies --all nginx.service

Наконец, чтобы увидеть низкоуровневые детали настроек юнита в системе, вы можете использовать опцию show:

  1. systemctl show nginx.service

Это позволит вам получить значение каждого параметра, управляемого systemd.

Изменение файлов юнитов

Если вам нужно внести изменение в файл юнита, systemd позволяет вам вносить изменения прямо из команды systemctl, чтобы вам не приходилось переходить к фактическому местоположению на диске.

Чтобы добавить фрагмент файла юнита, который можно использовать для добавления или переопределения параметров в файле юнита по умолчанию, просто вызовите опцию edit для юнита:

  1. sudo systemctl edit nginx.service

Если вы предпочитаете изменить весь контент файла юнита вместо создания фрагмента, передайте флаг --full:

  1. sudo systemctl edit --full nginx.service

После изменения файла юнита вы должны перезагрузить сам процесс systemd, чтобы применить ваши изменения:

  1. sudo systemctl daemon-reload

Использование целей (уровней запуска)

Еще одной функцией системы инициализации является переход сервера между различными состояниями. Традиционные системы инициализации обычно называют их «уровнями запуска», позволяя системе находиться только в одном уровне запуска в любое время.

В systemd вместо этого используются “цели”. Цели в основном являются точками синхронизации, которые сервер может использовать для перевода сервера в определенное состояние. Сервисы и другие файлы юнитов могут быть привязаны к цели, и несколько целей могут быть активны одновременно.

Чтобы увидеть все цели, доступные на вашей системе, введите:

  1. systemctl list-unit-files --type=target

Чтобы просмотреть целевую цель, которую systemd пытается достичь при загрузке (что, в свою очередь, запускает все файлы юнитов, составляющие дерево зависимостей этой цели), введите:

  1. systemctl get-default

Вы можете изменить целевую цель, которая будет использоваться при загрузке, используя опцию set-default:

  1. sudo systemctl set-default multi-user.target

Чтобы узнать, какие юниты привязаны к цели, вы можете ввести:

  1. systemctl list-dependencies multi-user.target

Вы можете изменить состояние системы для перехода между целями с помощью опции isolate. Это остановит любые юниты, не привязанные к указанной цели. Убедитесь, что цель, которую вы изолируете, не останавливает какие-либо важные сервисы:

  1. sudo systemctl isolate multi-user.target

Остановка или перезагрузка сервера

Для некоторых основных состояний, в которые система может перейти, доступны быстрые команды. Например, чтобы выключить сервер, вы можете ввести:

  1. sudo systemctl poweroff

Если вы хотите перезагрузить систему, это можно сделать, набрав:

  1. sudo systemctl reboot

Вы можете загрузиться в режим спасения, набрав:

  1. sudo systemctl rescue

Обратите внимание, что в большинстве операционных систем для этих операций доступны традиционные псевдонимы, такие как sudo poweroff или sudo reboot без использования systemctl. Однако это не гарантировано на всех системах.

Следующие шаги

К настоящему моменту вы должны знать основы управления сервером, использующим systemd. Однако есть еще многое, что можно изучить по мере расширения ваших потребностей. Ниже приведены ссылки на руководства с более подробной информацией о некоторых компонентах, о которых мы говорили в этом руководстве:

Изучив, как использовать сильные стороны вашей системы инициализации, вы сможете контролировать состояние ваших машин и более удобно управлять своими службами и процессами.

Source:
https://www.digitalocean.com/community/tutorials/systemd-essentials-working-with-services-units-and-the-journal