Version v8.2 (2011-12-15 02:11) [AUTO]
This commit is contained in:
101
s4a.tex
101
s4a.tex
@@ -16,7 +16,11 @@ pdfauthor={Lennart Poettering, Sergey Ptashnick}}
|
|||||||
% Несколько сокращений
|
% Несколько сокращений
|
||||||
\newcommand{\sectiona}[1]{\section*{#1}\addcontentsline{toc}{section}{#1}}
|
\newcommand{\sectiona}[1]{\section*{#1}\addcontentsline{toc}{section}{#1}}
|
||||||
\newcommand{\hreftt}[2]{\href{#1}{\texttt{#2}}}
|
\newcommand{\hreftt}[2]{\href{#1}{\texttt{#2}}}
|
||||||
\newcommand{\llangl}{\reflectbox{\rotatebox[origin=c]{270}{$\neg$}}}
|
\newcommand{\tbs}{\textbackslash}
|
||||||
|
% Примерный аналог символа \testSFii (присутствует в листингах),
|
||||||
|
% но без использования пакета pmboxdraw, средствами graphicx
|
||||||
|
\newcommand{\mytextSFii}{\raisebox{0pt}[0pt][\depth]{%
|
||||||
|
\reflectbox{\rotatebox[origin=t]{270}{$\neg$}}}}
|
||||||
% Настройка макета страницы
|
% Настройка макета страницы
|
||||||
\setlength{\hoffset}{-1.5cm}
|
\setlength{\hoffset}{-1.5cm}
|
||||||
\addtolength{\textwidth}{2cm}
|
\addtolength{\textwidth}{2cm}
|
||||||
@@ -581,6 +585,7 @@ systemd именует группы в соответствии с назван
|
|||||||
последующих статьях мы обсудим этот вопрос более подробно.
|
последующих статьях мы обсудим этот вопрос более подробно.
|
||||||
|
|
||||||
\section{HOW-TO: преобразование SysV init-скрипта в systemd service-файл}
|
\section{HOW-TO: преобразование SysV init-скрипта в systemd service-файл}
|
||||||
|
\label{sec:convert}
|
||||||
|
|
||||||
Традиционно, службы Unix и Linux (демоны) запускаются через SysV init-скрипты.
|
Традиционно, службы Unix и Linux (демоны) запускаются через SysV init-скрипты.
|
||||||
Эти скрипты пишутся на языке Bourne Shell (+/bin/sh+), располагаются в
|
Эти скрипты пишутся на языке Bourne Shell (+/bin/sh+), располагаются в
|
||||||
@@ -2193,7 +2198,7 @@ serial-getty@ttyUSB0.service - Getty on ttyUSB0
|
|||||||
Active: active (running) since Mon, 26 Sep 2011 04:20:44 +0200; 2s ago
|
Active: active (running) since Mon, 26 Sep 2011 04:20:44 +0200; 2s ago
|
||||||
Main PID: 5443 (agetty)
|
Main PID: 5443 (agetty)
|
||||||
CGroup: name=systemd:/system/getty@.service/ttyUSB0
|
CGroup: name=systemd:/system/getty@.service/ttyUSB0
|
||||||
\llangl{} 5443 /sbin/agetty -s ttyUSB0 115200,38400,9600
|
\mytextSFii{} 5443 /sbin/agetty -s ttyUSB0 115200,38400,9600
|
||||||
\end{Verbatim}
|
\end{Verbatim}
|
||||||
Собственно, это и есть ключевая идея организации экземпляров служб. Как видите,
|
Собственно, это и есть ключевая идея организации экземпляров служб. Как видите,
|
||||||
systemd предоставляет простой в использовании механизм шаблонов, позволяющих
|
systemd предоставляет простой в использовании механизм шаблонов, позволяющих
|
||||||
@@ -2203,8 +2208,8 @@ systemd предоставляет простой в использовании
|
|||||||
Вы можете создавать дополнительные экземпляры таких служб, просто добавляя
|
Вы можете создавать дополнительные экземпляры таких служб, просто добавляя
|
||||||
символьные ссылки в каталоги +*.wants/+. Например, чтобы обеспечить запуск getty
|
символьные ссылки в каталоги +*.wants/+. Например, чтобы обеспечить запуск getty
|
||||||
на ttyUSB0 при каждой загрузке, достаточно создать такую ссылку:
|
на ttyUSB0 при каждой загрузке, достаточно создать такую ссылку:
|
||||||
\begin{Verbatim}
|
\begin{Verbatim}[commandchars=\\\{\}]
|
||||||
# ln -s /lib/systemd/system/serial-getty@.service \
|
# ln -s /lib/systemd/system/serial-getty@.service \tbs{}
|
||||||
/etc/systemd/system/getty.target.wants/serial-getty@ttyUSB0.service
|
/etc/systemd/system/getty.target.wants/serial-getty@ttyUSB0.service
|
||||||
\end{Verbatim}
|
\end{Verbatim}
|
||||||
При этом файл конфигурации, на который указывает ссылка (в нашем случае
|
При этом файл конфигурации, на который указывает ссылка (в нашем случае
|
||||||
@@ -2242,13 +2247,7 @@ systemd и заложен предварительный поиск файла
|
|||||||
конце концов, нам нужно было выбрать что-то. Если вы собираетесь комментировать
|
конце концов, нам нужно было выбрать что-то. Если вы собираетесь комментировать
|
||||||
наш алгоритм экранирования~--- пожалуйста, также укажите, где вы живете, чтобы я
|
наш алгоритм экранирования~--- пожалуйста, также укажите, где вы живете, чтобы я
|
||||||
мог приехать к вам и раскрасить ваш велосипедный гараж в синий с желтыми
|
мог приехать к вам и раскрасить ваш велосипедный гараж в синий с желтыми
|
||||||
полосами. Спасибо!}\,\footnote{Прим. перев.: В предыдущем примечании автор снова
|
полосами. Спасибо!}. Например, чтобы обратиться
|
||||||
намекает на Паркинсовский Закон Тривиальности. Действительно, выбор алгоритма
|
|
||||||
экранирования практически не~влияет ни на работу systemd, ни на управлением им
|
|
||||||
(файлы/юниты с экранированными именами, как правило либо создаются специальными
|
|
||||||
программами-генераторами, либо формируются systemd на лету; при выводе состояния
|
|
||||||
показываются и неэкранированные имена; при вводе команд, как обычно, на
|
|
||||||
помощь приходит автодополнение оболочки).}. Например, чтобы обратиться
|
|
||||||
последовательному USB-порту по его адресу на шине, нам нужно использовать имя
|
последовательному USB-порту по его адресу на шине, нам нужно использовать имя
|
||||||
наподобие +serial/by-path/pci-0000:00:1d.0-usb-0:1.4:1.1-port0+. Экранированная
|
наподобие +serial/by-path/pci-0000:00:1d.0-usb-0:1.4:1.1-port0+. Экранированная
|
||||||
версия этого имени~---
|
версия этого имени~---
|
||||||
@@ -2262,7 +2261,7 @@ systemd и заложен предварительный поиск файла
|
|||||||
строке (+ExecStart+) и для формирования читабельных строк описания. Рассмотрим
|
строке (+ExecStart+) и для формирования читабельных строк описания. Рассмотрим
|
||||||
работу этих принципов на примере нашего юнит-файла:
|
работу этих принципов на примере нашего юнит-файла:
|
||||||
\begin{landscape}
|
\begin{landscape}
|
||||||
\begin{Verbatim}[fontsize=\small]
|
\begin{Verbatim}[fontsize=\small,commandchars=|\{\}]
|
||||||
# systemctl start 'serial-getty@serial-by\x2dpath-pci\x2d0000:00:1d.0\x2dusb\x2d0:1.4:1.1\x2dport0.service'
|
# systemctl start 'serial-getty@serial-by\x2dpath-pci\x2d0000:00:1d.0\x2dusb\x2d0:1.4:1.1\x2dport0.service'
|
||||||
# systemctl status 'serial-getty@serial-by\x2dpath-pci\x2d0000:00:1d.0\x2dusb\x2d0:1.4:1.1\x2dport0.service'
|
# systemctl status 'serial-getty@serial-by\x2dpath-pci\x2d0000:00:1d.0\x2dusb\x2d0:1.4:1.1\x2dport0.service'
|
||||||
serial-getty@serial-by\x2dpath-pci\x2d0000:00:1d.0\x2dusb\x2d0:1.4:1.1\x2dport0.service - Serial Getty on serial/by-path/pci-0000:00:1d.0-usb-0:1.4:1.1-port0
|
serial-getty@serial-by\x2dpath-pci\x2d0000:00:1d.0\x2dusb\x2d0:1.4:1.1\x2dport0.service - Serial Getty on serial/by-path/pci-0000:00:1d.0-usb-0:1.4:1.1-port0
|
||||||
@@ -2270,7 +2269,7 @@ serial-getty@serial-by\x2dpath-pci\x2d0000:00:1d.0\x2dusb\x2d0:1.4:1.1\x2dport0.
|
|||||||
Active: active (running) since Mon, 26 Sep 2011 05:08:52 +0200; 1s ago
|
Active: active (running) since Mon, 26 Sep 2011 05:08:52 +0200; 1s ago
|
||||||
Main PID: 5788 (agetty)
|
Main PID: 5788 (agetty)
|
||||||
CGroup: name=systemd:/system/serial-getty@.service/serial-by\x2dpath-pci\x2d0000:00:1d.0\x2dusb\x2d0:1.4:1.1\x2dport0
|
CGroup: name=systemd:/system/serial-getty@.service/serial-by\x2dpath-pci\x2d0000:00:1d.0\x2dusb\x2d0:1.4:1.1\x2dport0
|
||||||
5788 /sbin/agetty -s serial/by-path/pci-0000:00:1d.0-usb-0:1.4:1.1-port0 115200 38400 9600
|
|mytextSFii{} 5788 /sbin/agetty -s serial/by-path/pci-0000:00:1d.0-usb-0:1.4:1.1-port0 115200 38400 9600
|
||||||
\end{Verbatim}
|
\end{Verbatim}
|
||||||
\end{landscape}
|
\end{landscape}
|
||||||
Как видите, в качестве идентификатора экземпляра используется экранированная
|
Как видите, в качестве идентификатора экземпляра используется экранированная
|
||||||
@@ -2284,6 +2283,82 @@ serial-getty@serial-by\x2dpath-pci\x2d0000:00:1d.0\x2dusb\x2d0:1.4:1.1\x2dport0.
|
|||||||
руководства}, содержащей полный перечень этих спецификаторов с краткими
|
руководства}, содержащей полный перечень этих спецификаторов с краткими
|
||||||
пояснениями.)
|
пояснениями.)
|
||||||
|
|
||||||
|
\section{Службы с активацией в стиле inetd}
|
||||||
|
|
||||||
|
В одной из предыдущих глав (гл.~\ref{sec:convert}) я рассказывал, как можно
|
||||||
|
преобразовать SysV init-скрипт в юнит-файл systemd. В этой главе мы рассмотрим
|
||||||
|
как провести аналогичное преобразование для служб inetd.
|
||||||
|
|
||||||
|
Начнем с небольшого экскурса в историю вопроса. По давно устоявшейся традиции,
|
||||||
|
inetd считается одной из базовых служб Unix-систем. Работая как суперсервер, он
|
||||||
|
слушает сетевые сокеты от имени различных служб, и активирует соответствующие
|
||||||
|
службы при поступлении на эти сокеты входящих соединений. Таким образом, он
|
||||||
|
обеспечивает механизм активации по запросу (on-demand activation). Подобный
|
||||||
|
подход избавляет от необходимости держать постоянно работающими все серверные
|
||||||
|
процессы, что позволяет поддерживать множество служб даже на системах с очень
|
||||||
|
ограниченными ресурсами. На протяжении многих лет, дистрибутивы Linux
|
||||||
|
поставляются с различными реализациями inetd. Наиболее популярные из них~--- BSD
|
||||||
|
inetd и xinetd. Хотя inetd во многих дистрибутивах до сих пор устанавливается по
|
||||||
|
умолчанию, сейчас уже он редко используется для запуска сетевых служб~--- теперь
|
||||||
|
большинство из них запускаются автономно при загрузке системы (основной
|
||||||
|
аргумент в пользу такой схемы~--- она позволяет обеспечить более высокую
|
||||||
|
производительность служб).
|
||||||
|
|
||||||
|
Одной из ключевых возможностей systemd (а также launchd от Apple) является
|
||||||
|
сокет-активация~--- тот самый механизм, давным-давно реализованный inetd,
|
||||||
|
однако в данном случае ключевые цели немного другие. Сокет-активация в стиле
|
||||||
|
systemd прежде всего ориентирована на локальные сокеты (+AF_UNIX+), хотя
|
||||||
|
поддерживаются также и сетевые сокеты (+AF_INET+). И более важное отличие~---
|
||||||
|
сокет-активация в systemd обеспечивает не~только экономию системных ресурсов,
|
||||||
|
но также и эффективную параллелизацию работы (так как она
|
||||||
|
позволяет запускать клиентов и серверы одновременно, непосредственно после
|
||||||
|
создания сокета), упрощение процесса конфигурации (отпадает необходимость явно
|
||||||
|
указывать зависимости между службами) и увеличение надежности (служебный или
|
||||||
|
экстренный, в случае падения, перезапуск службы не~приводит к недоступности
|
||||||
|
сокета). Тем не~менее, systemd ничуть не~хуже inetd может запускать службы в
|
||||||
|
ответ на входящие сетевые соединения.
|
||||||
|
|
||||||
|
Любая сокет-активация требует соответствующей поддержки со стороны самой
|
||||||
|
запускаемой службы. systemd предоставляет очень простой интерфейс, который может
|
||||||
|
быть использован службами для обеспечения сокет-активации. В основе этого
|
||||||
|
\href{http://0pointer.de/blog/projects/socket-activation.html}{простого и
|
||||||
|
минималистичного} механизма лежит функция
|
||||||
|
\hreftt{http://0pointer.de/public/systemd-man/sd_listen_fds.html}{sd\_listen\_fds()}.
|
||||||
|
Однако, интерфейс, традиционно используемый в inetd, еще проще. Он позволяет
|
||||||
|
передавать запускаемой службе только один сокет, который формируется из потоков
|
||||||
|
STDIN и STDOUT запущенного процесса. Поддержка этого механизма также
|
||||||
|
присутствует в systemd~--- для обеспечения совместимости с множеством служб
|
||||||
|
поддерживающих сокет-активацию только в стиле inetd.
|
||||||
|
|
||||||
|
Прежде, чем мы перейдем к примерам, рассмотрим три различных схемы, использующих
|
||||||
|
сокет-активацию:
|
||||||
|
\begin{enumerate}
|
||||||
|
\item \textbf{Сокет-активация, ориентированная на параллелизацию,
|
||||||
|
упрощение и надежность:} сокеты создаются на ранних стадиях
|
||||||
|
загрузки, и единственный экземпляр службы тут же начинает
|
||||||
|
обслуживать все поступающие запросы. Такая схема подходит для
|
||||||
|
часто используемых системных служб~--- очевидно, что такие
|
||||||
|
службы лучше запускать как можно раньше, и по вомзожности
|
||||||
|
параллельно. В качестве примера можно привести D-Bus и Syslog.
|
||||||
|
\item \textbf{Сокет-активация для одиночных служб:} сокеты создаются на
|
||||||
|
ранних стадиях загрузки, и единственный экземпляр службы
|
||||||
|
запускается при получении входящих запросов. Такая схема больше
|
||||||
|
подходит для редко используемых служб, позволяя обеспечить
|
||||||
|
экономию системных ресурсов и уменьшить время загрузки, просто
|
||||||
|
отложив активацию службы до того момента, когда она
|
||||||
|
действительно понадобится. Пример~--- CUPS.
|
||||||
|
\item \textbf{Сокет-активация для служб, запускающих по экземпляру на
|
||||||
|
каждое соединение:} сокеты создаются на ранней стадии загрузки,
|
||||||
|
и при каждом входящем соединении создается экземпляр службы,
|
||||||
|
которому передается сокет соединения (слушающий сокет при этом
|
||||||
|
остается у суперсервера, inetd или systemd). Эта схема подходит
|
||||||
|
для редко используемых служб, не~критичных по производительности
|
||||||
|
(каждый новый процесс занимает сравнительно немного ресурсов).
|
||||||
|
Пример:SSH.
|
||||||
|
\end{enumerate}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\end{document}
|
\end{document}
|
||||||
|
|
||||||
vim:ft=tex:tw=80:spell:spelllang=ru
|
vim:ft=tex:tw=80:spell:spelllang=ru
|
||||||
|
|||||||
Reference in New Issue
Block a user