diff --git a/s4a.tex b/s4a.tex index 7331975..2a44ae9 100644 --- a/s4a.tex +++ b/s4a.tex @@ -2110,6 +2110,75 @@ systemd? +exec+. После чего достаточно просто указать этот скрипт в опции +ExecStart=+ вместо бинарника демона. +\section{Экземпляры служб} + +Большинство служб в Linux/Unix являются одиночными (singleton): в каждый момент +времени на данном хосте работает только один экземпляр службы. В качестве +примера таких одиночных служб можно привести Syslogd, Postfix, Apache. Однако, +существуют службы, запускающие по несколько экземпляров себя на одном хосте. +Например, службы наподобие Dovecot IMAP запускают по одному экземпляру на каждый +локальный порт и/или IP-адрес. Другой пример, который можно встретить +практически во всех системах~--- \emph{getty}, небольшая служба, запускающаяся на +каждом TTY (от +tty1+ до +tty6+). На некоторых серверах, в зависимости от +сделанных администратором настроек или параметров загрузки, могут запускаться +дополнительные экземпляры getty, для подключаемых к COM-портам терминалов или +для консоли системы виртуализации. Еще один пример службы, работающей в +нескольких экземплярах (по крайней мере, в мире systemd)~--- \emph{fsck}, +программа проверки файловой системы, которая запускается по одному экземпляру +на каждое блочное устройство, требующее такой проверки. И наконец, стоит +упомянуть службы с активацией в стиле inetd~--- через сокет, по одному +экземпляру на каждое соединение. В этой статье я попытаюсь рассказать, как в +systemd реализовано управление <<многоэкземплярными>> службами, и какие выгоды +системный администратор может извлечь из этой возможности. + +Если вы читали предыдущие статьи из этого цикла, вы, скорее всего, уже знаете, +что службы systemd именуются по схеме \emph{foobar}+.service+, где +\emph{foobar}~--- строка, идентифицирующая службу (проще говоря, ее имя), а ++.service+~--- суффикс, присутствующий в именах всех файлов конфигурации служб. +Сами эти файлы могут находиться в каталогах +/etc/systemd/systemd+ и ++/lib/systemd/system+ (а также, возможно, и в других). Для служб, работающих в +нескольких экземплярах, эта схема становится немного сложнее: +\emph{foobar}+@+\emph{quux}+.service+, где \emph{foobar}~--- имя службы, +общее для всех экземпляров, а \emph{quux}~--- идентификатор конкретного +экземпляра. Например, +serial-gett@ttyS2.service+~--- это служба getty для +COM-порта, запущенная на +ttyS2+. + +При необходимости, экземпляры служб можно легко создать динамически. Скажем, вы +можете, безо всяких дополнительных настроек, запустить новый экземпляр getty на +последовательном порту, просто выполнив +systemctl start+ для нового экземпляра: +\begin{Verbatim} +# systemctl start serial-getty@ttyUSB0.service +\end{Verbatim} + +Получив такую команду, systemd сначала пытается найти файл конфигурации юнита с +именем, точно соответствующим запрошенному. Если такой файл найти не~удается +(при работе с экземплярами сервисов обычно так и происходит), из имени файла +удаляется идентификатор экземпляра, и полученное имя используется при поиске +\emph{шаблона} конфигурации. В нашем случае, если отсутствует файл с именем ++serial-getty@ttyUSB0.service+, используется файл-шаблон под названием ++serial-getty@.service+. Таким образом, для всех экземпляров данной службы, +используется один и тот же шаблон конфигурации. В случае с getty для COM-портов, +этот шаблон, поставляемый в комплекте с systemd +(файл +/lib/systemd/system/serial-getty@.service+) выглядит примерно так: +\begin{Verbatim} +[Unit] +Description=Serial Getty on %I +BindTo=dev-%i.device +After=dev-%i.device systemd-user-sessions.service + +[Service] +ExecStart=-/sbin/agetty -s %I 115200,38400,9600 +Restart=always +RestartSec=0 +\end{Verbatim} +(Заметим, что приведенная здесь версия немного сокращена, по сравнению с реально +используемой в systemd. Удалены не~относящиеся к теме нашего обсуждения +параметры конфигурации, обеспечивающие совместимость с SysV, очистку экрана и +удаление предыдущих пользователей с текущего TTY. Если вам интересно, можете +посмотреть +\href{http://cgit.freedesktop.org/systemd/plain/units/serial-getty@.service.m4}{полную +версию}.) + \end{document} vim:ft=tex:tw=80:spell:spelllang=ru