Библиотека сайта rus-linux.net
systemd: шаблоны в юнит-файлах
Оригинал: systemd: Template unit files
Автор: Chaoyi Zha
Дата публикации: 9 декабря 2015 г.
Перевод: А.Панин
Дата перевода: 24 января 2016 г.
И снова добро пожаловать в серию статей о возможностях менеджера инициализации systemd. Как вы наверняка узнали из предыдущих статей серии, в systemd реализован мощный и гибкий механизм запуска и управления состояниями системных служб. Некоторые из рассмотренных возможностей systemd были введены для достижения совместимости с устаревшей системой инициализации SysVinit. Однако, шаблоны в юнит-файлах systemd не имеют аналогов.
Что за шаблоны в юнит-файлах?
Шаблон в юнит-файле позволяет systemd работать с различными экземплярами юнитов при условии использования единственного юнит-файла. Для того, чтобы использоваться шаблоном из юнит-файла systemd, вы можете обратиться к этому юнит-файлу, используя специальный формат:
<имя_службы>@<аргумент>.service
Аргумент является фрагментом текста (строкой), который передается systemd для использования в рамках юнит-файла. Этот аргумент может использоваться для описания способа работы systemd с определенным экземпляром юнита. Множество экземпляров одного и того же юнита может существовать одновременно.
В юнит-файлах systemd могут использоваться два идентификатора, которые позволяют осуществлять передачу аргумента экземпляру юнита.
-
Идентификатор
%i
позволяет осуществлять передачу аргумента, который будет особым образом отформатирован (из него будут убраны все спецсимволы) -
Идентификатор
%I
позволяет осуществить передачу аргумента без какой-либо обработки.
Удаление спецсимволов из идентификатора перед его использованием осуществляется в соответствии со специальными правилами. При этом заменяются все символы, которые не могут использоваться в именах файлов.
Реальные примеры использования
Отличным примером может служить системная служба OpenVPN, в юнит-файле которой используется шаблон для того, чтобы имелась возможность запуска ее нескольких экземпляров с помощью единственного юнит-файла. Ниже приведено содержимое соответствующего юнит-файла:
[Unit] Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I After=network.target [Service] PrivateTmp=true Type=forking PIDFile=/var/run/openvpn/%i.pid ExecStart=/usr/sbin/openvpn --daemon --writepid /var/run/openvpn/%i.pid --cd /etc/openvpn/ --config %i.conf [Install] WantedBy=multi-user.target
Как видите, идентификатор для передачи аргументов без спецсимволов %i
используется везде, где осуществляется передача имен файлов. Идентификатор для передачи аргументов без предварительной обработки %I
используется лишь в описании, спецсимволы в составе которого могут повысить читаемость.
Данный юнит-файл позволяет использовать имя службы openvpn@myconfig.service
для запуска экземпляра юнита openvpn
, который будет использовать файл конфигурации с именем myconfig
. В этом случае демону OpenVPN будет передаваться путь к файлу конфигурации /etc/openvpn/myconfig.conf
. Кроме того, идентификатор процесса демона будет записываться в файл /var/run/openvpn/myconfig.pid
.
Другим примером является текстовый терминал в любой системе Fedora. Каждый раз при использовании сочетания клавиш C
trl+Alt+F2
, Ctrl+Alt+F3
и.т.д. для переключения консолей в ней открывается новый терминал. В этом случае systemd обращается к системной службе getty@.service
. При этом systemd осуществляет поиск юнит-файла getty.service
и передает ему соответствующий аргумент, такой, как tty2
, tty3
. Идентификатор %i
позволяет передавать аргумент, благодаря которому терминал открывается в новой консоли.
Пример шаблона
При желании вы можете создать свой собственный юнит-файл с шаблоном, к примеру, для запуска веб-сервера собственной разработки:
# fancy-web-server.service [Unit] Description=My HTTP server AssertPathExists=/srv/webserver [Service] Type=notify ExecStart=/usr/sbin/some-fancy-httpd-server %i.conf Nice=5 [Install] WantedBy=multi-user.target
При использовании описанной выше конфигурации мы можем запустить множество экземпляров юнита с помощью единственного юнит-файла с шаблоном. Например:
$ sudo systemctl start fancy-web-server@config1.service $ sudo systemctl start fancy-web-server@config2.service
В результате будут запущены два экземпляра веб-сервера fancy-http-server с использованием следующих команд:
/usr/sbin/some-fancy-httpd-server config1.conf /usr/sbin/some-fancy-httpd-server config2.conf
Строки config1
и config2
взяты из аргументов команд sytemd и подставлены вместо идентификаторов %i
в юнит-файле.
Данная возможность достаточно полезна так как ваша служба может работать с множеством различных конфигураций или файлов настроек без необходимости модификации каких-либо юнит-файлов.
Дополнительное чтение
На веб-сайте проекта Freedesktop размещена дополнительная информация, которая может оказаться полезной для вас в том случае, если вы желаете узнать больше о приемах работы с механизмом шаблонов в юнит-файлах. (Совет: для того, чтобы сразу же перейти к описанию рассматриваемого механизма, осуществите поиск термина template на странице.)