- systemd: основные приемы работы с юнит-файлами
- Юнит-файлы: что это такое?
- Юниты служб
- Процессы системных служб
- Юниты целей
- Полезные информационные ресурсы
- Инструкции
- Командная строка Linux: краткий курс для начинающих
- Перенаправление ввода/вывода в Linux
- Работа с файлами и каталогами в Linux
- Как сгенерировать SSH-ключ для доступа на сервер
- Как установить и настроить веб-сервер Apache
- Руководство по написанию скриптов в Linux Bash
- Введение в Git: настройка и основные команды
- Как установить MySQL на Windows
- Как установить и использовать MySQL Workbench
- Создание нового пользователя и настройка прав в MySQL
- systemd Часть 1: Понимание systemd, типы юнитов и целевые юниты
- Понимание systemd
- Юнит socket
- Понимание целевых юнитов
- Понимание Wants
systemd: основные приемы работы с юнит-файлами
Оригинал: systemd unit file basics
Автор: Bryan Sutherland
Дата публикации: 28 октября 2015 г.
Перевод: А.Панин
Дата перевода: 12 ноября 2015 г.
Добро пожаловать в серию статей о системе инициализации systemd, в которой мы разбираемся с тем, как работает эта центральная часть вашей системы Fedora. В данной статье речь пойдет о юнит-файлах ( unit files ).
Являясь пользователем дистрибутива Fedora с большим опытом, я до недавнего времени особо не задумывался о том, как на самом деле работает система инициализации systemd. Система инициализации systemd разделена на множество программных компонентов, что значительно упрощает процедуру управления компонентами вашей системы. systemd использует юнит-файлы для конфигурации и управления системными ресурсами, такими, как процессы и ваша файловая система. Благодаря этим файлам вы можете использовать systemd для конфигурации вашей системы Fedora в соответствии с вашими пожеланиями.
Юнит-файлы: что это такое?
Юнит-файлы в вашей системе описывают параметры системы инициализации systemd, которая используется в процессе ее загрузки и работы. Каждый из файлов соответствует отдельному действию или компоненту — или юниту ( unit ) в терминологии systemd. Каждый из юнит-файлов является простым текстовым файлом с описанием юнита, его назначения, операций, которые должны быть выполнены до и после его запуска, а также других деталей.
Юнит-файлы могут храниться в нескольких различных директориях вашей файловой системы. systemd осуществляет поиск системных юнит-файлов в директориях в следующей последовательности:
Юнит-файлы из директорий, расположенных выше в списке, имеют приоритет перед юнит-файлами с аналогичными именами из директорий, расположенных ниже в списке. Эта схема является довольно удобной, так как она позволяет вам вносить изменения в файлы из директории /etc, которая как раз предназначена для хранения файлов конфигурации системы. Вы должны по возможности избегать внесения изменений в файлы из директории /usr. Данная директория предназначена для хранения неизменных файлов, поставляющихся в комплекте с приложениями.
Также systemd может работать в контексте пользователей и управлять ресурсами отдельных пользователей, в дополнение управлению ресурсами системы. Юнит-файлы пользовательских юнитов по аналогии хранятся в директориях /etc/systemd/ , /run/sustemd/ и /usr/lib/systemd/ . Упомянутые директории имеют аналогичный приоритет.
Вы можете получить информацию об этих юнит-файлах с помощью команды systemctl . Если вы хотите увидеть список всех юнит-файлов, установленных в вашей системе, выполните следующую команду:
Каждый юнит-файл содержит пары параметр-значение в формате ИмяПараметра=значение , разделенные на секции, выделенные с помощью заголовков в формате [ИмяСекции] . Эти пары параметр-значение описывают принцип работы юнита, а также способ взаимодействия systemd с ним.
Существует множество типов юнитов, которые известны systemd. Двумя наиболее часто используемыми типами юнитов, с которыми приходится работать пользователям систем, являются юниты служб ( service units ) и юниты целей ( target units ). Для вывода списка юнит-файлов вашей системы каждого из типов следует использовать команду systemctl :
Юниты служб
Данные юниты описывают процесс, который может быть запущен и отслеживаться с помощью systemd. Юниты служб являются наиболее часто используемыми юнитами при повседневной работе с системой. Управление данными юнитами может осуществляться с помощью команды systemctl от лица пользователя root:
- start : запускает службу, представленную в виде юнита systemd
- stop : пытается «корректно» завершить работу службы
- status : выводит подробную информацию о состоянии службы
- restart : перезапускает (завершает работу и впоследствии запускает) указанную службу
- enable : активирует юнит-файл (создает символьные ссылки) в различных директориях для запуска службы в процессе загрузки системы
- disable : деактивирует юнит-файл (удаляет символьные ссылки) для того, чтобы соответствующая служба не запускалась автоматически
В следующем примере приведено содержимое юнит-файла sshd.service . Он позволяет systemd управлять демоном sshd, который предназначен для обеспечения удаленного доступа к вашей системе по протоколу SSH (Secure Shell).
Этот юнит-файл содержит как часто используемые, так и специфичные для юнита данной службы параметры. Часто используемыми параметрами, использованными в данном файле, являются описание службы и информация о расположении документации. Разумеется, в данном файле используются и такие параметры, которые не будут описаны в данной статье. Но вы наверняка догадаетесь, что параметр ExecStart , к примеру, предназначен для запуска демона sshd при активации юнита.
Процессы системных служб
Одной интересной возможностью systemd является механизм мониторинга состояния процессов, которые запускаются после активации юнитов служб. Для того, чтобы узнать, мониторинг каких процессов осуществляется, следует использовать команду systemctl status . Например, ниже приведен вывод этой команды при проверке состояния юнита sshd.service :
Очевидно, что процесс, запущенный при активации данного юнита, имеет идентификатор (PID) 1090. Мониторинг состояния процесса силами systemd будет продолжаться и после использования данной команды.
Обратите внимание на то, что при запуске службы данный процесс был помещен в группу управления с соответствующим именем. Группа управления (control group или «cgroup») позволяет systemd осуществлять управление группами ассоциированных процессов. В следующих статьях серии мы поговорим о том, как данная возможность может использоваться для регулирования производительности и установки ограничений ресурсов для процессов служб.
Благодаря наличию информации о процессах каждой из служб, systemd может помочь вам при работе с некорректно работающими службами. Обычно при остановке службы используется команда systemctl , как упоминалось ранее. Например, для остановки службы веб-сервера может использоваться следующая команда:
Но что случится в том случае, если служба не ответит на запрос завершения работы и не будет каким-либо образом взаимодействовать с systemd? Для таких случаев утилита systemctl предоставляет встроенную реализацию команды kill :
Юниты целей
Юниты целей используются для связывания и группировки других юнитов с целью описания соответствующего состояния системы. Некоторые из этих юнитов могут быть юнитами служб. Другие юниты могут быть дополнительными юнитами целей со своими собственными группами юнитов.
Ниже приведен пример содержимого файла юнита цели multi-user.target .
Обратите внимание на то, что этот файл юнита цели не содержит команды для исполнения. Вместо нее он содержит списки юнитов (в данном случае в основном юнитов целей) и используется для объединения этих юнитов. Данный файл описывает следующее правила:
- Цель multi-user.target требует, чтобы была успешно достигнута цель basic.target .
- В том случае, если исполняется служба, соответствующая юниту rescue.service , или достигнута цель, соответствующая юниту rescue.target , данный юнит будет остановлен и наоборот.
- Достижение цели multi-user.target начинается сразу после начала инициирования достижения цели basic.target и после запуска службы rescue.target и достижения цели rescue.target в случае активации последних.
Кроме того, данный юнит цели содержит параметр AllowIsolate . Этот параметр позволяет вашей системе рассматривать юнит цели multi-user.target в качестве цели процесса загрузки системы благодаря выполнению команды systemctl isolate .
Юниты целей позволяют группировать другие юниты не только на основе содержимого соответствующих файлов юнитов. Файл юнита цели может использовать директорию .wants для размещения ссылок на юниты, которые должны запускаться вместе с юнитом цели. Например, файл /usr/lib/systemd/system/multi-user.target имеет ассоциированную директорию /usr/lib/systemd/system/multi-user.target.wants . Эта директория содержит ссылки на юниты (не только юниты служб, но и юниты других целей), которые будут исполняться при инициировании достижения соответствующей цели. Каждый из этих юнитов может иметь свои зависимости, а также такие параметры, как приведенный выше параметр Requires, позволяющий указать юниты, которые должны быть запущенны для запуска рассматриваемого юнита.
Полезные информационные ресурсы
Вы можете воспользоваться страницей руководства для ознакомления с подробным описанием стандартных параметров секции Unit файлов юнитов:
Также существует документация, относящаяся к файлам юнитов служб и целей. Вы можете ознакомится с ней, выполнив следующие команды:
Если вы ищете дополнительную информацию о приемах работы с процессами и группами управления с использованием инструментов systemd, ознакомьтесь с данной полезной записью из блога автора systemd .
Источник
Инструкции
27 сентября 2021
Командная строка Linux: краткий курс для начинающих
27 сентября 2021
Перенаправление ввода/вывода в Linux
27 сентября 2021
Работа с файлами и каталогами в Linux
26 сентября 2021
Как сгенерировать SSH-ключ для доступа на сервер
23 сентября 2021
Как установить и настроить веб-сервер Apache
23 сентября 2021
Руководство по написанию скриптов в Linux Bash
21 сентября 2021
Введение в Git: настройка и основные команды
21 сентября 2021
Как установить MySQL на Windows
21 сентября 2021
Как установить и использовать MySQL Workbench
20 сентября 2021
Создание нового пользователя и настройка прав в MySQL
© ООО «Селектел», 2008—2021
Полностью изолированные физические серверы любой конфигурации с облачной готовностью
Виртуальные машины с моментальным масштабированием и поддержкой Infrastructure-as-code
В дата-центрах TIER III Москвы, Санкт‑Петербурга и ЛО
Инфраструктура на базе VMware для бизнес-критичных задач любой сложности
Готовые к работе управляемые базы данных PostgreSQL и MySQL™
Полностью готовый к работе кластер Kubernetes для управления контейнерами
Масштабируемое хранилище данных с гибким ценообразованием, поддержкой FTP и S3 API
Запуск кода по запросу или событию без создания и обслуживания сервера
Источник
systemd Часть 1: Понимание systemd, типы юнитов и целевые юниты
Systemd — это новый сервис в Red Hat Enterprise Linux 7, который отвечает за запуск всех видов вещей. Systemd выходит далеко за рамки запуска сервисов; другие элементы также запускаются из systemd.
В этой статье раскроем сам systemd и юнит-файлы.
Понимание systemd
Чтобы описать systemd в общих чертах, то это система управления юнитами. Юнитами могут быть много вещей. Одним из наиболее важных типов юнитов является сервис. Как правило, сервисы — это процессы, которые предоставляют определенные функциональные возможности и позволяют подключаться внешним клиентам.
Помимо сервисов, существуют другие типы юнитов, такие как сокеты, монтирование и другие.
Чтобы отобразить список всех доступных юнитов, введите systemctl -t help
Основное преимущество работы с systemd по сравнению с предыдущими методами, используемыми для управления сервисами, заключается в том, что он обеспечивает единый интерфейс для запуска юнитов. Этот интерфейс определен в файле юнита.
Системные юнит-файлы. Это юниты из установленных пакетов RPM — всякие nginx, apache, mysql и прочее.
Юниты, созданные нами, то есть админами. Переопределяют значения юнит-файлов по умолчанию. Юнит-файлы по умолчанию описаны выше.
runtime-юниты, которые генерируются автоматически.
Юнит-файлы пользовательских юнитов по аналогии хранятся в директориях /etc/systemd/ , /run/sustemd/ и /usr/lib/systemd/ .
Юнит-файл на примере vsftpd:
Из этого примера юнит-файла видно, что его относительно легко понять. Любой файл сервисного юнита systemd состоит из трех секций. (В других файл-юнитах могут быть другие секции, но эти три присутствуют во всех юнит-файлах.)
[Unit] Описывает юнит и определяет зависимости. Эта секция также содержит важный оператор After и, опционально, оператор Before . Эти операторы определяют зависимости между различными юнитами. В данном случае After=network.target говорит о том, что этот файл-юнит надо запустить только после того, как запустится файл-юнит network.target . [Service]
[Install] |
Посмотрим теперь другой файл-юнит типа mount :
Файл tmp.unit показывает некоторую интересную дополнительную информацию. В секции [Unit] мы видим оператор Conflicts . Этот оператор говорит о том, что что этот юнит не может использоваться совместно с юнитом umount.target .
Далее идёт секция [Mount] , которая определяет, что и где надо монтировать. В этой секции четко видно, что будет выполнена команда mount , которую вы обычно вводите в терминале.
Наконец, есть оператор WantedBy, который определяет, где должен быть запущен юнит.
Юнит socket
Сокет создает метод для приложений, чтобы общаться друг с другом. Некоторые сервисы создают свои собственные сокеты при запуске, в то время как другим сервисам нужен файл-юнит сокетов для создания сокетов для них. И наоборот: каждому сокету нужен соответствующий служебный файл.
Пример файла сокета показывает, как это происходит для virtlockd, системного сокета, который отслеживает активность для виртуальных машин.
При работе с файл-юнитами systemd вы рискуете оказаться перегруженными опциями.
Каждый файл-юнит может быть настроен с различными параметрами. Чтобы выяснить, какие параметры доступны для конкретного юнита, используйте команду systemctl show . Например, команда systemctl show sshd показывает все параметры systemd , которые можно настроить в юните sshd.service , включая их текущие значения по умолчанию.
Понимание целевых юнитов
Юнит-файлы используются для создания функциональности, необходимой на вашем сервере. Чтобы можно было загружать их в правильном порядке и в нужный момент, используется определенный тип юнитов: целевой юнит. Простое определение целевого юнита- это «группа юнитов». Некоторые цели используются как эквиваленты старых уровней выполнения, которые в более ранних версиях RHEL использовались для определения состояния, в котором должен запускаться сервер.
Уровень запуска — это набор сервисов, необходимых для запуска сервера в многопользовательском или графическом режиме. Хорошей отправной точкой для понимания юнитов целей является их видение как группы юнитов.
Вы можете видеть, что сам по себе целевой юнит не содержит много определений. Он просто определяет, что ему требуется, и с какими сервисами целями он не может сосуществовать. Он также определяет порядок загрузки с помощью оператора After в разделе Unit . И вы можете видеть, что в разделе «Install» он определен как default.target , поэтому ваш сервер запускается по умолчанию. Целевой файл-юнит не содержит никакой информации о юнитах, которые должны быть включены; это находится в отдельных файлах юнита и секции Wants .
Даже если цель systemd немного похожа на старые уровни запуска, это нечто большее. Цель — это группа юнитов, и существует несколько различных целей. Некоторые цели, такие как multi-user.target и graphical.target , определяют конкретное состояние, в которое должна войти система. Другие цели просто объединяют группу юнитов, например, nfs.target и printer.target . Эти цели включены из других целей, таких как многопользовательские или графические цели.
Понимание Wants
Чтобы понять концепцию желания (Want), давайте начнем смотреть на глагол потребности, как в «Я хочу печенье». Want в systemd определяет, какие единицы systemd он хочет при запуске определенной цели. Want создаются, когда юниты включены в systemd , и это происходит путем создания символической ссылки в каталоге /etc/systemd/system . В этом каталоге вы найдете подкаталог для каждой цели, содержащий в качестве символических ссылок ссылки на конкретные сервисы, которые должны быть запущены.
Во второй части статьи о systemd разберемся, как управлять юнитами, зависимостями и целями.
Источник