Compare commits

..

3 Commits
v15.6 ... v15.9

Author SHA1 Message Date
nnz1024
3046243a83 Version v15.9 (2014-03-03 22:23) [AUTO] 2017-08-17 23:05:41 +03:00
nnz1024
7de2397a9b Version v15.8 (2014-03-03 17:31) [AUTO] 2017-08-17 23:05:41 +03:00
nnz1024
84177721df Version v15.7 (2013-08-27 19:08) [AUTO] 2017-08-17 23:05:41 +03:00

411
s4a.tex
View File

@@ -641,8 +641,8 @@ service-файл будет работать в любом дистрибути
вам отправить этот файл разработчикам. Вопросы по полноценной интеграции вам отправить этот файл разработчикам. Вопросы по полноценной интеграции
демонов с systemd, с максимальным использованием всех его возможностей, будут демонов с systemd, с максимальным использованием всех его возможностей, будут
рассмотрены в последующих статьях этого цикла, пока же ограничимся ссылкой на рассмотрены в последующих статьях этого цикла, пока же ограничимся ссылкой на
\href{http://0pointer.de/public/systemd-man/daemon.html}{страницу} официальной \href{http://www.freedesktop.org/software/systemd/man/daemon.html}{страницу}
документации. официальной документации.
Итак, приступим. В качестве примера возьмем init-скрипт демона ABRT (Automatic Итак, приступим. В качестве примера возьмем init-скрипт демона ABRT (Automatic
Bug Reporting Tool, службы, занимающейся сбором crash dump'ов). Исходный Bug Reporting Tool, службы, занимающейся сбором crash dump'ов). Исходный
@@ -751,9 +751,9 @@ WantedBy=multi-user.target
лога, независимо от используемой программы (например, rsyslog или syslog-ng) лога, независимо от используемой программы (например, rsyslog или syslog-ng)
и типа активации (как обычной службы или через log-сокет). Подробнее о таких и типа активации (как обычной службы или через log-сокет). Подробнее о таких
специальных юнитах можно почитать специальных юнитах можно почитать
\href{http://0pointer.de/public/systemd-man/systemd.special.html}{страницу} \href{http://www.freedesktop.org/software/systemd/man/systemd.special.html}%
официальной документации. Обратите внимание, что директива +After+, в {страницу} официальной документации. Обратите внимание, что директива +After+,
отсутствие директивы +Requires+, задает лишь порядок загрузки, но в отсутствие директивы +Requires+, задает лишь порядок загрузки, но
не~задает жесткой зависимости. То есть, если при загрузке конфигурация не~задает жесткой зависимости. То есть, если при загрузке конфигурация
systemd будет предписывать запуск как демона системного лога, так и abrtd, то systemd будет предписывать запуск как демона системного лога, так и abrtd, то
сначала будет запущен демон системного лога, и только потом abrtd. Если же сначала будет запущен демон системного лога, и только потом abrtd. Если же
@@ -874,11 +874,11 @@ systemd располагает удобным методом для опреде
За более подробным описанием всех опций настройки, вы можете обратиться к За более подробным описанием всех опций настройки, вы можете обратиться к
страницам руководства страницам руководства
\href{http://0pointer.de/public/systemd-man/systemd.unit.html}{systemd.unit}, \href{http://www.freedesktop.org/software/systemd/man/systemd.unit.html}{systemd.unit},
\href{http://0pointer.de/public/systemd-man/systemd.service.html}{systemd.service}, \href{http://www.freedesktop.org/software/systemd/man/systemd.service.html}{systemd.service},
\href{http://0pointer.de/public/systemd-man/systemd.exec.html}{systemd.exec}. Полный \href{http://www.freedesktop.org/software/systemd/man/systemd.exec.html}{systemd.exec}.
список доступных страниц можно просмотреть Полный список доступных страниц можно просмотреть
\href{http://0pointer.de/public/systemd-man/}{здесь}. \href{http://www.freedesktop.org/software/systemd/man/}{здесь}.
Конечно, отнюдь не~все init-скрипты так же легко преобразовать в Конечно, отнюдь не~все init-скрипты так же легко преобразовать в
service-файлы. Но, к счастью, <<проблемных>> скриптов не~так уж и много. service-файлы. Но, к счастью, <<проблемных>> скриптов не~так уж и много.
@@ -940,7 +940,10 @@ Apache, crond, atd, которые по роду служебной деятел
лишь возможности исчерпания памяти и идентификаторов процессов (PID). Впрочем, и лишь возможности исчерпания памяти и идентификаторов процессов (PID). Впрочем, и
их тоже можно легко устранить: достаточно задать соответствующие лимиты в их тоже можно легко устранить: достаточно задать соответствующие лимиты в
конфигурационном файле службы (см. конфигурационном файле службы (см.
\href{http://www.0pointer.de/public/systemd-man/systemd.exec.html}{systemd.exec(5)}).}. \href{http://www.freedesktop.org/software/systemd/man/systemd.exec.html}%
{systemd.exec(5)} и
\href{http://www.freedesktop.org/software/systemd/man/systemd.resource-control.html}%
{systemd.resource-control(5)}).}.
В некоторых случаях возникает необходимость отправить сигнал именно основному В некоторых случаях возникает необходимость отправить сигнал именно основному
процессу службы. Например, используя +SIGHUP+, мы можем заставить демона процессу службы. Например, используя +SIGHUP+, мы можем заставить демона
@@ -1241,8 +1244,8 @@ RootDirectoryStartOnly=yes
доступ к иерархии файловых систем ОС (иначе наш скрипт просто не~сможет доступ к иерархии файловых систем ОС (иначе наш скрипт просто не~сможет
выполнить bind-монтирование нужных каталогов). Более подробную информацию по выполнить bind-монтирование нужных каталогов). Более подробную информацию по
опциям конфигурации вы можете получить на опциям конфигурации вы можете получить на
\href{http://0pointer.de/public/systemd-man/systemd.service.html}{страницах} \href{http://www.freedesktop.org/software/systemd/man/systemd.service.html}{страницах}
\href{http://0pointer.de/public/systemd-man/systemd.exec.html}{руководства}. \href{http://www.freedesktop.org/software/systemd/man/systemd.exec.html}{руководства}.
Поместив приведенный выше текст примера в файл Поместив приведенный выше текст примера в файл
+/etc/systemd/system/foobar.service+, вы сможете запустить chroot'нутого демона +/etc/systemd/system/foobar.service+, вы сможете запустить chroot'нутого демона
@@ -1276,8 +1279,8 @@ InaccessibleDirectories=/home
единственным исключением~--- она не~будет видеть каталог +/home+, что позволит единственным исключением~--- она не~будет видеть каталог +/home+, что позволит
защитить данные пользователей от потенциальных хакеров. (Подробнее об этих защитить данные пользователей от потенциальных хакеров. (Подробнее об этих
опциях можно почитать на опциях можно почитать на
\href{http://0pointer.de/public/systemd-man/systemd.exec.html}{странице \href{http://www.freedesktop.org/software/systemd/man/systemd.exec.html}%
руководства}.) {странице руководства}.)
Фактически, FSNS по множеству параметров превосходят +chroot()+. Скорее всего, Фактически, FSNS по множеству параметров превосходят +chroot()+. Скорее всего,
Avahi и RealtimeKit в ближайшем будущем перейдут от +chroot()+ к использованию Avahi и RealtimeKit в ближайшем будущем перейдут от +chroot()+ к использованию
@@ -1327,7 +1330,7 @@ debootstrap/febootstrap. В этом случае возможности +system
взаимодействия с процессом init.}. взаимодействия с процессом init.}.
Однако, куда более интересные возможности предоставляет программа Однако, куда более интересные возможности предоставляет программа
\href{http://0pointer.de/public/systemd-man/systemd-nspawn.html}{systemd-nspawn}, \href{http://www.freedesktop.org/software/systemd/man/systemd-nspawn.html}{systemd-nspawn},
входящая в стандартный комплект поставки systemd. По сути, это улучшенный аналог входящая в стандартный комплект поставки systemd. По сути, это улучшенный аналог
+chroot(1)+~--- она не~только подменяет корневой каталог, но и создает отдельные +chroot(1)+~--- она не~только подменяет корневой каталог, но и создает отдельные
пространства имен для дерева файловых систем (FSNS) и для идентификаторов пространства имен для дерева файловых систем (FSNS) и для идентификаторов
@@ -1635,7 +1638,12 @@ $ eog plot.svg
Она создает наглядные диаграммы, показывающие моменты запуска служб и время, Она создает наглядные диаграммы, показывающие моменты запуска служб и время,
затраченное на их запуск, по отношению к другим службам. На текущий момент, она затраченное на их запуск, по отношению к другим службам. На текущий момент, она
не~показывает явно, кто кого ожидает, но догадаться обычно несложно. не~показывает явно, кто кого ожидает, но догадаться обычно
несложно\footnote{Прим. перев.: Начиная с systemd 203, добавлена поддержка
специальной команды +systemd-analyze critical-chain+, которая выводит самую
медленную цепочку юнитов (цепь в графе зависимостей, формируемом при
загрузке). Время запуска всех юнитов в этой цепочке определяет итоговое время
загрузки системы.}.
Чтобы продемонстрировать эффект, порожденный двумя нашими оптимизациями, Чтобы продемонстрировать эффект, порожденный двумя нашими оптимизациями,
приведем ссылки на соответствующие графики: приведем ссылки на соответствующие графики:
@@ -1755,20 +1763,24 @@ LVM, RAID и multipath). Если они вам не~нужны, вы легко
всех дистрибутивах: всех дистрибутивах:
\begin{itemize} \begin{itemize}
\item \item
\hreftt{http://0pointer.de/public/systemd-man/hostname.html}{/etc/hostname}: \hreftt{http://www.freedesktop.org/software/systemd/man/hostname.html}%
{/etc/hostname}:
имя хоста для данной системы. Одна из наиболее простых и важных имя хоста для данной системы. Одна из наиболее простых и важных
системных настроек. В разных дистрибутивах оно настраивалось системных настроек. В разных дистрибутивах оно настраивалось
по-разному: Fedora использовала +/etc/sysconfig/network+, по-разному: Fedora использовала +/etc/sysconfig/network+,
OpenSUSE~--- +/etc/HOSTNAME+, Debian~--- +/etc/hostname+. Мы OpenSUSE~--- +/etc/HOSTNAME+, Debian~--- +/etc/hostname+. Мы
остановились на варианте, предложенном Debian. остановились на варианте, предложенном Debian.
\item \item
\hreftt{http://0pointer.de/public/systemd-man/vconsole.conf.html}{/etc/vconsole.conf}: \hreftt{http://www.freedesktop.org/software/systemd/man/vconsole.conf.html}%
{/etc/vconsole.conf}:
конфигурация раскладки клавиатуры и шрифта для консоли. конфигурация раскладки клавиатуры и шрифта для консоли.
\item \item
\hreftt{http://0pointer.de/public/systemd-man/locale.conf.html}{/etc/locale.conf}: \hreftt{http://www.freedesktop.org/software/systemd/man/locale.conf.html}%
{/etc/locale.conf}:
конфигурация общесистемной локали. конфигурация общесистемной локали.
\item \item
\hreftt{http://0pointer.de/public/systemd-man/modules-load.d.html}{/etc/modules-load.d/*.conf}: \hreftt{http://www.freedesktop.org/software/systemd/man/modules-load.d.html}%
{/etc/modules-load.d/*.conf}:
каталог\footnote{Прим. перев.: Для описания этого и трех каталог\footnote{Прим. перев.: Для описания этого и трех
последующих каталогов автор пользуется термином <<drop-in последующих каталогов автор пользуется термином <<drop-in
directory>>. Данный термин означает каталог, в который можно directory>>. Данный термин означает каталог, в который можно
@@ -1785,21 +1797,25 @@ LVM, RAID и multipath). Если они вам не~нужны, вы легко
ядра, которые нужно принудительно подгрузить при загрузке ядра, которые нужно принудительно подгрузить при загрузке
(впрочем, необходимость в этом возникает достаточно редко). (впрочем, необходимость в этом возникает достаточно редко).
\item \item
\hreftt{http://0pointer.de/public/systemd-man/sysctl.d.html}{/etc/sysctl.d/*.conf}: \hreftt{http://www.freedesktop.org/software/systemd/man/sysctl.d.html}%
{/etc/sysctl.d/*.conf}:
каталог для задания параметров ядра (+sysctl+). Дополняет каталог для задания параметров ядра (+sysctl+). Дополняет
классический конфигурационный файл +/etc/sysctl.conf+. классический конфигурационный файл +/etc/sysctl.conf+.
\item \item
\hreftt{http://0pointer.de/public/systemd-man/tmpfiles.d.html}{/etc/tmpfiles.d/*.conf}: \hreftt{http://www.freedesktop.org/software/systemd/man/tmpfiles.d.html}%
{/etc/tmpfiles.d/*.conf}:
каталог для управления настройками временных файлов (systemd каталог для управления настройками временных файлов (systemd
обеспечивает создание, очистку и удаление временных файлов и обеспечивает создание, очистку и удаление временных файлов и
каталогов, как во время загрузки, так и во время работы каталогов, как во время загрузки, так и во время работы
системы). системы).
\item \item
\hreftt{http://0pointer.de/public/systemd-man/binfmt.d.html}{/etc/binfmt.d/*.conf}: \hreftt{http://www.freedesktop.org/software/systemd/man/binfmt.d.html}%
{/etc/binfmt.d/*.conf}:
каталог для регистрации дополнительных бинарных форматов каталог для регистрации дополнительных бинарных форматов
(например, форматов Java, Mono, WINE). (например, форматов Java, Mono, WINE).
\item \item
\hreftt{http://0pointer.de/public/systemd-man/os-release.html}{/etc/os-release}: \hreftt{http://www.freedesktop.org/software/systemd/man/os-release.html}%
{/etc/os-release}:
стандарт для файла, обеспечивающего идентификацию дистрибутива и стандарт для файла, обеспечивающего идентификацию дистрибутива и
его версии. Сейчас различные дистрибутивы используют для этого его версии. Сейчас различные дистрибутивы используют для этого
разные файлы (например, +/etc/fedora-release+ в Fedora), и разные файлы (например, +/etc/fedora-release+ в Fedora), и
@@ -1813,7 +1829,8 @@ LVM, RAID и multipath). Если они вам не~нужны, вы легко
сложившуюся ситуацию, мы решили перейти к единому простому сложившуюся ситуацию, мы решили перейти к единому простому
формату представления этой информации. формату представления этой информации.
\item \item
\hreftt{http://0pointer.de/public/systemd-man/machine-id.html}{/etc/machine-id}: \hreftt{http://www.freedesktop.org/software/systemd/man/machine-id.html}%
{/etc/machine-id}:
файл с идентификатором данного компьютера (перекрывает файл с идентификатором данного компьютера (перекрывает
аналогичный идентификатор D-Bus). Гарантируется, что в любой аналогичный идентификатор D-Bus). Гарантируется, что в любой
системе, использующей systemd, этот файл будет существовать и системе, использующей systemd, этот файл будет существовать и
@@ -1822,7 +1839,8 @@ LVM, RAID и multipath). Если они вам не~нужны, вы легко
D-Bus, чтобы упростить решение множества задач, требующих D-Bus, чтобы упростить решение множества задач, требующих
наличия уникального и постоянного идентификатора компьютера. наличия уникального и постоянного идентификатора компьютера.
\item \item
\hreftt{http://0pointer.de/public/systemd-man/machine-info.html}{/etc/machine-info}: \hreftt{http://www.freedesktop.org/software/systemd/man/machine-info.html}%
{/etc/machine-info}:
новый конфигурационный файл, хранящий информации о полном новый конфигурационный файл, хранящий информации о полном
(описательном) имени хоста (например, <<Компьютер Леннарта>>) и (описательном) имени хоста (например, <<Компьютер Леннарта>>) и
значке, которым он будет обозначаться в графических оболочках, значке, которым он будет обозначаться в графических оболочках,
@@ -2094,8 +2112,9 @@ systemd?
быть подгружен автоматически, все равно существует гораздо более быть подгружен автоматически, все равно существует гораздо более
удобные методы указать его принудительную подгрузку~--- удобные методы указать его принудительную подгрузку~---
например, путем создания соответствующего файла в каталоге например, путем создания соответствующего файла в каталоге
\hreftt{http://0pointer.de/public/systemd-man/modules-load.d.html}{/etc/modules-load.d/} \hreftt{http://www.freedesktop.org/software/systemd/man/modules-load.d.html}%
(стандартный метод настройки принудительной подгрузки модулей). {/etc/modules-load.d/} (стандартный метод настройки
принудительной подгрузки модулей).
\item И наконец, хотелось бы отметить, что каталог +/etc+ определен как \item И наконец, хотелось бы отметить, что каталог +/etc+ определен как
место для хранения системных настроек (<<Host-specific system место для хранения системных настроек (<<Host-specific system
configuration>>, согласно FHS). Наличие внутри него подкаталога configuration>>, согласно FHS). Наличие внутри него подкаталога
@@ -2115,9 +2134,10 @@ systemd?
штатно поддерживаются systemd, нет никакого смысла дублировать штатно поддерживаются systemd, нет никакого смысла дублировать
их где-то еще (перечень опций, которые можно задать для любой их где-то еще (перечень опций, которые можно задать для любой
службы, приведен на страницах справки службы, приведен на страницах справки
\href{http://0pointer.de/public/systemd-man/systemd.exec.html}{systemd.exec(5)} \href{http://www.freedesktop.org/software/systemd/man/systemd.exec.html}%
и {systemd.exec(5)} и
\href{http://0pointer.de/public/systemd-man/systemd.service.html}{systemd.service(5)}.) \href{http://www.freedesktop.org/software/systemd/man/systemd.service.html}%
{systemd.service(5)}.)
Если же ваша настройка просто добавляет еще один уровень Если же ваша настройка просто добавляет еще один уровень
отключения запуска службы~--- не~плодите лишние сущности, отключения запуска службы~--- не~плодите лишние сущности,
откажитесь от нее. откажитесь от нее.
@@ -2140,7 +2160,7 @@ systemd?
штатные unit-файлы systemd. Если ваш файл из +sysconfig+ содержит лишь штатные unit-файлы systemd. Если ваш файл из +sysconfig+ содержит лишь
определения переменных, можно воспользоваться опцией определения переменных, можно воспользоваться опцией
+EnvironmentFile=-/etc/sysconfig/foobar+ (подробнее об этой опции см. +EnvironmentFile=-/etc/sysconfig/foobar+ (подробнее об этой опции см.
\href{http://0pointer.de/public/systemd-man/systemd.exec.html}{systemd.exec(5)}), \href{http://www.freedesktop.org/software/systemd/man/systemd.exec.html}{systemd.exec(5)}),
позволяющей прочитать из файла набор переменных окружения, который будет позволяющей прочитать из файла набор переменных окружения, который будет
установлен при запуске службы. Если же для задания настроек вам необходим установлен при запуске службы. Если же для задания настроек вам необходим
полноценный язык программирования~--- ничто не~мешает им воспользоваться. полноценный язык программирования~--- ничто не~мешает им воспользоваться.
@@ -2179,16 +2199,18 @@ systemd?
+/lib/systemd/system+ (а также, возможно, и в других\footnote{Прим. перев.: +/lib/systemd/system+ (а также, возможно, и в других\footnote{Прим. перев.:
Перечень каталогов, в которых выполняется поиск общесистемных юнит-файлов, Перечень каталогов, в которых выполняется поиск общесистемных юнит-файлов,
приведен на странице руководства приведен на странице руководства
\href{http://www.0pointer.de/public/systemd-man/systemd.html}{systemd(1)} \href{http://www.freedesktop.org/software/systemd/man/systemd.html}{systemd(1)}
(раздел <<System unit directories>>). Указанные выше каталоги (раздел <<System unit directories>>). Указанные выше каталоги
+/etc/systemd/systemd+ и +/lib/systemd/system+ соответствуют значениям по +/etc/systemd/systemd+ и +/lib/systemd/system+ соответствуют значениям по
умолчанию для упомянутых там переменных pkg-config +systemdsystemconfdir+ и умолчанию для упомянутых там переменных pkg-config +systemdsystemconfdir+ и
+systemdsystemunitdir+ соответственно.}). Для служб, работающих в нескольких +systemdsystemunitdir+ соответственно. Начиная с systemd версии 198, данный
экземплярах, эта схема становится немного сложнее: перечень, в более точной и развернутой форме, присутствует на странице
\emph{foobar}+@+\emph{quux}+.service+, где \emph{foobar}~--- имя службы, общее \href{http://www.freedesktop.org/software/systemd/man/systemd.unit.html}%
для всех экземпляров, а \emph{quux}~--- идентификатор конкретного экземпляра. {systemd.unit(5)}.}). Для служб, работающих в нескольких экземплярах, эта схема
Например, +serial-gett@ttyS2.service+~--- это служба getty для COM-порта, становится немного сложнее: \emph{foobar}+@+\emph{quux}+.service+, где
запущенная на +ttyS2+. \emph{foobar}~--- имя службы, общее для всех экземпляров, а \emph{quux}~---
идентификатор конкретного экземпляра. Например, +serial-gett@ttyS2.service+~---
это служба getty для COM-порта, запущенная на +ttyS2+.
При необходимости, экземпляры служб можно легко создать динамически. Скажем, вы При необходимости, экземпляры служб можно легко создать динамически. Скажем, вы
можете, безо всяких дополнительных настроек, запустить новый экземпляр getty на можете, безо всяких дополнительных настроек, запустить новый экземпляр getty на
@@ -2324,9 +2346,9 @@ serial-getty@serial-by\x2dpath-pci\x2d0000:00:1d.0\x2dusb\x2d0:1.4:1.1\x2dport0.
(Небольшое замечание: помимо +%i+ и +%I+, существует еще несколько (Небольшое замечание: помимо +%i+ и +%I+, существует еще несколько
спецификаторов, и большинство из них доступно и в обычных файлах конфигурации спецификаторов, и большинство из них доступно и в обычных файлах конфигурации
юнитов, а не~только в шаблонах. Подробности можно посмотреть на юнитов, а не~только в шаблонах. Подробности можно посмотреть на
\href{http://0pointer.de/public/systemd-man/systemd.unit.html}{странице \href{http://www.freedesktop.org/software/systemd/man/systemd.unit.html}%
руководства}, содержащей полный перечень этих спецификаторов с краткими {странице руководства}, содержащей полный перечень этих спецификаторов с
пояснениями.) краткими пояснениями.)
\section{Службы с активацией в стиле inetd} \section{Службы с активацией в стиле inetd}
\label{sec:inetd} \label{sec:inetd}
@@ -2369,7 +2391,8 @@ systemd прежде всего ориентирована на локальны
быть использован службами для обеспечения сокет-активации. В основе этого быть использован службами для обеспечения сокет-активации. В основе этого
\href{http://0pointer.de/blog/projects/socket-activation.html}{простого и \href{http://0pointer.de/blog/projects/socket-activation.html}{простого и
минималистичного} механизма лежит функция минималистичного} механизма лежит функция
\hreftt{http://0pointer.de/public/systemd-man/sd_listen_fds.html}{sd\_listen\_fds()}. \hreftt{http://www.freedesktop.org/software/systemd/man/sd_listen_fds.html}%
{sd\_listen\_fds()}.
Однако, интерфейс, традиционно используемый в inetd, еще проще. Он позволяет Однако, интерфейс, традиционно используемый в inetd, еще проще. Он позволяет
передавать запускаемой службе только один сокет, который формируется из потоков передавать запускаемой службе только один сокет, который формируется из потоков
STDIN и STDOUT запущенного процесса. Поддержка этого механизма также STDIN и STDOUT запущенного процесса. Поддержка этого механизма также
@@ -2506,17 +2529,17 @@ StandardInput=socket
собственно, и включает для данной службы режим совместимости с inetd-активацией. собственно, и включает для данной службы режим совместимости с inetd-активацией.
Опция +StandardInput=+ позволяет указать, куда будет подключен поток STDIN Опция +StandardInput=+ позволяет указать, куда будет подключен поток STDIN
процесса данной службы (подробности см. процесса данной службы (подробности см.
\href{http://0pointer.de/public/systemd-man/systemd.exec.html}{на странице \href{http://www.freedesktop.org/software/systemd/man/systemd.exec.html}%
руководства}). Задав для нее значение +socket+, мы обеспечиваем подключение {на странице руководства}). Задав для нее значение +socket+, мы обеспечиваем
этого потока к сокету соединения, как того и требует механизм inetd-активации. подключение этого потока к сокету соединения, как того и требует механизм
Заметим, что явно указывать опцию +StandardOutput=+ в данном случае inetd-активации. Заметим, что явно указывать опцию +StandardOutput=+ в данном
необязательно~--- она автоматически устанавливается в то же значение, что и случае необязательно~--- она автоматически устанавливается в то же значение, что
+StandardInput+, если явно не~указано что-то другое. Кроме того, можно отметить и +StandardInput+, если явно не~указано что-то другое. Кроме того, можно
наличие <<+-+>> перед именем бинарного файла sshd. Таким образом мы указываем отметить наличие <<+-+>> перед именем бинарного файла sshd. Таким образом мы
systemd игнорировать код выхода процесса sshd. По умолчанию, systemd сохраняет указываем systemd игнорировать код выхода процесса sshd. По умолчанию, systemd
коды выхода для всех экземпляров службы, завершившихся с ошибкой (сбросить эту сохраняет коды выхода для всех экземпляров службы, завершившихся с ошибкой
информацию можно командой +systemctl reset-failed+). SSH (сбросить эту информацию можно командой +systemctl reset-failed+). SSH довольно
довольно часто завершается с ненулевым кодом выхода, и мы разрешаем systemd часто завершается с ненулевым кодом выхода, и мы разрешаем systemd
не~регистрировать подобные <<ошибки>>. не~регистрировать подобные <<ошибки>>.
Служба +sshd@.service+ предназначена для работы в виде независимых экземпляров Служба +sshd@.service+ предназначена для работы в виде независимых экземпляров
@@ -2616,15 +2639,15 @@ Linux подсистема ipset гораздо лучше подходит дл
стороны, systemd тоже предоставляет ряд возможностей, отсутствующих в xinetd, в стороны, systemd тоже предоставляет ряд возможностей, отсутствующих в xinetd, в
частности, индивидуальный контроль над каждым экземпляром службы (см. выше), и частности, индивидуальный контроль над каждым экземпляром службы (см. выше), и
внушительный внушительный
\href{http://0pointer.de/public/systemd-man/systemd.exec.html}{набор настроек} \href{http://www.freedesktop.org/software/systemd/man/systemd.exec.html}{набор
для контроля окружения, в котором запускаются экземпляры. Я надеюсь, что настроек} для контроля окружения, в котором запускаются экземпляры. Я надеюсь,
возможностей systemd должно быть достаточно для решения большинства задач, а в что возможностей systemd должно быть достаточно для решения большинства задач, а
тех редких случаях, когда вам потребуются специфические опции xinetd~--- ничто в тех редких случаях, когда вам потребуются специфические опции xinetd~--- ничто
не~мешает вам запустить его в дополнение к systemd. Таким образом, уже сейчас в не~мешает вам запустить его в дополнение к systemd. Таким образом, уже сейчас в
большинстве случаев xinetd можно выкинуть из числа обязательных системных большинстве случаев xinetd можно выкинуть из числа обязательных системных
компонентов. Можно сказать, что systemd не~просто возвращает функциональность компонентов. Можно сказать, что systemd не~просто возвращает функциональность
классического юниксового inetd, но еще и восстанавливает ее ключевую классического юниксового inetd, но еще и восстанавливает ее ключевую роль в
роль в Linux-системах. Linux-системах.
Теперь, вооруженные этими знаниями, вы можете портировать свои службы с inetd на Теперь, вооруженные этими знаниями, вы можете портировать свои службы с inetd на
systemd. Но, конечно, будет лучше, если этим займутся разработчики из апстрима systemd. Но, конечно, будет лучше, если этим займутся разработчики из апстрима
@@ -2662,8 +2685,9 @@ Linux уже очень давно, но при этом практически
простыми в использовании, чтобы заинтересовать администраторов и апстримных простыми в использовании, чтобы заинтересовать администраторов и апстримных
разработчиков. Вот краткий перечень наиболее интересных разработчиков. Вот краткий перечень наиболее интересных
возможностей\footnote{Прим. перев.: В приведенном здесь списке не~упомянута возможностей\footnote{Прим. перев.: В приведенном здесь списке не~упомянута
встроенная в systemd поддержка фильтров seccomp, так как она была добавлена уже встроенная в systemd поддержка фильтров seccomp (опция +SystemCallFilter=+),
после написания исходной статьи.}: так как она была добавлена уже после написания исходной статьи, в выпуске
systemd 187.}:
\begin{itemize} \begin{itemize}
\item Изолирование служб от сети \item Изолирование служб от сети
\item Предоставление службам независимых каталогов +/tmp+ \item Предоставление службам независимых каталогов +/tmp+
@@ -2674,9 +2698,14 @@ Linux уже очень давно, но при этом практически
\end{itemize} \end{itemize}
Все эти опции описаны в man-страницах systemd, главным образом, в Все эти опции описаны в man-страницах systemd, главным образом, в
\href{http://0pointer.de/public/systemd-man/systemd.exec.html}{systemd.exec(5)}. \href{http://www.freedesktop.org/software/systemd/man/systemd.exec.html}{systemd.exec(5)}%
Если вам потребуются какие-либо уточнения, пожалуйста, обратитесь к этим \footnote{Прим. перев.: Начиная с systemd версии 206, значительная часть
страницам. обсуждаемых здесь настроек вынесена на отдельную страницу
\href{http://www.freedesktop.org/software/systemd/man/systemd.cgroup.html}%
{systemd.cgroup(5)}. Начиная с systemd 208, эта страница переименована в
\href{http://www.freedesktop.org/software/systemd/man/systemd.resource-control.html}%
{systemd.resource-control(5)}.}. Если вам потребуется дополнительная информация,
вы можете обратиться к ним.
Все эти опции доступны на системах с systemd, вне зависимости от использования Все эти опции доступны на системах с systemd, вне зависимости от использования
SELinux или любой другой реализации MAC. SELinux или любой другой реализации MAC.
@@ -2768,7 +2797,14 @@ PrivateTmp=yes
присутствуют: сокеты размещаются в защищенном подкаталоге, который создается на присутствуют: сокеты размещаются в защищенном подкаталоге, который создается на
ранних стадиях загрузки). Разумеется, для служб, использующих +/tmp+ в целях ранних стадиях загрузки). Разумеется, для служб, использующих +/tmp+ в целях
коммуникации, включение опции +PrivateTmp=yes+ недопустимо. К счастью, подобных коммуникации, включение опции +PrivateTmp=yes+ недопустимо. К счастью, подобных
служб сейчас уже не~так уж и много. служб сейчас уже не~так уж и много\footnote{Прим. перев.: Начиная с systemd 209,
поддерживается опция +JoinsNamespaceOf=+ (секция +[Unit]+), позволяющая
поместить два и более юнитов в одну <<песочницу>> (пространство имен), в
результате чего такие юниты смогут взаимодействовать между собой, как через
сетевой интерфейс обратной петли, так и через файлы в каталоге +/tmp+,
при этом оставаясь изолированными от остальной системы. Подробности можно
уточнить на странице руководства
\href{http://www.freedesktop.org/software/systemd/man/systemd.unit.html}{systemd.unit(5)}.}.
\end{caveat} \end{caveat}
Эта опция использует технологию пространств имен файловых систем (filesystem Эта опция использует технологию пространств имен файловых систем (filesystem
@@ -3338,8 +3374,8 @@ StartLimitAction=reboot-force
Да, и еще: если у вас возникнет вопрос, имеется ли в вашей системе аппаратный Да, и еще: если у вас возникнет вопрос, имеется ли в вашей системе аппаратный
таймер~--- скорее всего да, если ваш компьютер не~очень старый. Чтобы получить таймер~--- скорее всего да, если ваш компьютер не~очень старый. Чтобы получить
точный ответ, вы можете воспользоваться утилитой точный ответ, вы можете воспользоваться утилитой
\href{http://karelzak.blogspot.de/2012/05/eject1-sulogin1-wdctl1.html}{wdctl}, \hreftt{http://karelzak.blogspot.de/2012/05/eject1-sulogin1-wdctl1.html}{wdctl},
включенной в последний релиз util-linux\footnote{Прим. перев.: Утилита wdctl включенной в последний релиз util-linux\footnote{Прим. перев.: Утилита +wdctl+
присутствует в util-linux, начиная с версии~2.22, которая, на~момент написания присутствует в util-linux, начиная с версии~2.22, которая, на~момент написания
этих строк, еще не~вышла.}. Эта программа выведет всю необходимую этих строк, еще не~вышла.}. Эта программа выведет всю необходимую
информацию о вашем аппаратном сторожевом таймере. информацию о вашем аппаратном сторожевом таймере.
@@ -3498,14 +3534,16 @@ getty\footnote{Отметим, что +systemctl enable+ \emph{для экзем
\texttt{ln -s /usr/lib/systemd/system/serial-getty@.service \texttt{ln -s /usr/lib/systemd/system/serial-getty@.service
/etc/systemd/system/getty.target.wants/serial-getty@ttyS2.service ; systemctl /etc/systemd/system/getty.target.wants/serial-getty@ttyS2.service ; systemctl
daemon-reload}.}\footnote{\label{ftn:enableserial}Прим. перев.: На самом деле, daemon-reload}.}\footnote{\label{ftn:enableserial}Прим. перев.: На самом деле,
работать с символьными ссылками придется даже в современных версиях systemd (на работать с символьными ссылками пришлось бы даже в более свежих версиях
момент написания этих строк, последней является версия 204), так как systemd (до 209 включительно), так как в файле +serial-getty@.service+
разработчики забыли включить в файл +serial-getty@.service+ секцию +[Install]+, отсутствовала секция +[Install]+, в результате чего попытка выполнения
в результате чего попытка выполнения +systemctl enable+ для экземпляра +systemctl enable+ для экземпляра соответствующей службы приводила к
соответствующей службы ведет к закономерной ошибке. Впрочем, исправить это закономерной ошибке. Данная проблема была устранена только в systemd 210.
несложно: достаточно скопировать данный файл в +/etc/systemd/system/+, после В~случае использования более старых версий, исправить ее можно и самостоятельно:
чего дописать в него секцию +[Install]+ с параметром +WantedBy=getty.target+, а достаточно скопировать указанный файл из +/usr/lib/systemd/system/+ в
затем выполнить +systemctl daemon-reload+.}: +/etc/systemd/system/+, после чего дописать в него секцию +[Install]+,
содержащую параметр +WantedBy=getty.target+, и затем выполнить
+systemctl daemon-reload+.}:
\begin{Verbatim} \begin{Verbatim}
# systemctl enable serial-getty@ttyS2.service # systemctl enable serial-getty@ttyS2.service
# systemctl start serial-getty@ttyS2.service # systemctl start serial-getty@ttyS2.service
@@ -3547,8 +3585,9 @@ daemon-reload}.}\footnote{\label{ftn:enableserial}Прим. перев.: На с
а также сообщения, которые процессы служб выводят на STDOUT и STDERR. Полученная а также сообщения, которые процессы служб выводят на STDOUT и STDERR. Полученная
информация индексируется и предоставляется пользователю по запросу. Journal информация индексируется и предоставляется пользователю по запросу. Journal
может работать одновременно с традиционными демоном syslog (например, rsyslog может работать одновременно с традиционными демоном syslog (например, rsyslog
или syslog-ng), либо полностью его заменять. Более подробно см. в или syslog-ng), либо полностью его заменять. За подробностями стоит
\href{http://0pointer.de/blog/projects/the-journal.html}{первом анонсе}. обратиться к \href{http://0pointer.de/blog/projects/the-journal.html}{первому
анонсу}.
Journal был включен в Fedora начиная с F17. В Fedora~18 journal вырос в мощный и Journal был включен в Fedora начиная с F17. В Fedora~18 journal вырос в мощный и
удобный механизм работы с системным журналом. Однако, и в~F17, и в~F18 journal удобный механизм работы с системным журналом. Однако, и в~F17, и в~F18 journal
@@ -3617,7 +3656,7 @@ Journal был включен в Fedora начиная с F17. В Fedora~18 jour
\item Все отметки времени сформированы с учетом вашего часового пояса. \item Все отметки времени сформированы с учетом вашего часового пояса.
\item Для навигации по тексту используется просмотрщик (pager), по \item Для навигации по тексту используется просмотрщик (pager), по
умолчанию +less+\footnote{Прим. перев.: В инструментах systemd, умолчанию +less+\footnote{Прим. перев.: В инструментах systemd,
включая journalctl, просмотрщик включается только при прямом включая +journalctl+, просмотрщик включается только при прямом
выводе на экран, и отключается при перенаправлении вывода в файл выводе на экран, и отключается при перенаправлении вывода в файл
или передаче его по каналу (shell pipe).}. или передаче его по каналу (shell pipe).}.
\item Выводятся \emph{все} доступные данные, включая информацию из \item Выводятся \emph{все} доступные данные, включая информацию из
@@ -3680,7 +3719,10 @@ $ journalctl -f
При вызове +journalctl+ без параметров, она выводит все сообщения, начиная с При вызове +journalctl+ без параметров, она выводит все сообщения, начиная с
самого первого из сохраненных. Разумеется, это огромный объем информации. На самого первого из сохраненных. Разумеется, это огромный объем информации. На
практике иногда бывает достаточно ограничиться сообщениями, сгенерированными с практике иногда бывает достаточно ограничиться сообщениями, сгенерированными с
момента последней загрузки системы: момента последней загрузки системы\footnote{Прим. перев.: Начиная с systemd
версии 206, синтаксис опции <<+-b+>> был расширен: теперь она позволяет
просматривать логи не~только за текущую, но и за предыдущие загрузки, например,
<<+-b -1+>>~--- прошлая загрузка, <<+-b -2+>>~--- позапрошлая и т.д.}:
\begin{Verbatim} \begin{Verbatim}
$ journalctl -b $ journalctl -b
\end{Verbatim} \end{Verbatim}
@@ -3960,16 +4002,16 @@ systemd предоставляет ряд высокоуровневых нас
несколькими рабочими процессами получит такую же долю процессорного времени, несколькими рабочими процессами получит такую же долю процессорного времени,
как и Apache, даже если тот запустил 1000 CGI-процессов. Разумеется, такое как и Apache, даже если тот запустил 1000 CGI-процессов. Разумеется, такое
поведение при необходимости можно легко отключить~--- см. опцию поведение при необходимости можно легко отключить~--- см. опцию
\hreftt{http://0pointer.de/public/systemd-man/systemd.conf.html}{DefaultControllers=} \hreftt{http://www.freedesktop.org/software/systemd/man/systemd-system.conf.html}%
в файле +/etc/systemd/system.conf+. {DefaultControllers=} в файле +/etc/systemd/system.conf+.
Если \emph{равномерное} распределение процессорного времени между службами вас Если \emph{равномерное} распределение процессорного времени между службами вас
не~устраивает, и вы хотите выделить определенным службам больше или меньше не~устраивает, и вы хотите выделить определенным службам больше или меньше
времени~--- используйте опцию времени~--- используйте опцию
\hreftt{http://0pointer.de/public/systemd-man/systemd.exec.html}{CPUShares=} в \hreftt{http://www.freedesktop.org/software/systemd/man/systemd.resource-control.html}%
конфигурационном файле службы. По умолчанию это значение равно 1024. Увеличивая {CPUShares=} в конфигурационном файле службы. По умолчанию это значение равно
это число, вы даете службе больше процессорного времени, уменьшая~--- 1024. Увеличивая это число, вы даете службе больше процессорного времени,
соответственно, меньше. уменьшая~--- соответственно, меньше.
Рассмотрим небольшой практический пример. Допустим, вам нужно увеличить Рассмотрим небольшой практический пример. Допустим, вам нужно увеличить
для службы Apache относительную долю потребления процессора до 1500. Для этого для службы Apache относительную долю потребления процессора до 1500. Для этого
@@ -3999,19 +4041,19 @@ CPUShares=1500
основного файла. Все вышесказанное относится и к другим примерам из этого основного файла. Все вышесказанное относится и к другим примерам из этого
раздела.}. Сохраняем файл, приказываем systemd перечитать конфигурацию, и раздела.}. Сохраняем файл, приказываем systemd перечитать конфигурацию, и
перезапускаем Apache, чтобы настройки вступили в силу\footnote{Прим. перев.: перезапускаем Apache, чтобы настройки вступили в силу\footnote{Прим. перев.:
systemd версий до 197 включительно, не~имел штатного механизма для изменения systemd версий до 197 (включительно) не~имел штатного механизма для изменения
параметров контрольных групп <<на лету>> (без перезапуска службы). Но вы можете параметров контрольных групп <<на лету>> (без перезапуска службы). Если у вас
узнать контрольную группу службы командой наподобие все же возникнет такая необходимость, вы можете узнать контрольную группу службы
+systemctl show -p ControlGroup avahi-daemon.service+, и выполнить настройки командой +systemctl show -p ControlGroup имя_службы.service+, и выполнить
любым удобным для вас способом, например, через запись значений в псевдофайлы требуемые настройки напрямую через запись значений в псевдофайлы cgroupfs
cgroupfs (разумеется, при следующем запуске службы к ней будут применены (разумеется, при следующем запуске службы к ней будут применены параметры,
параметры, указанные в конфигурационном файле). В версиях systemd со 198 по 204, указанные в конфигурационном файле). В версиях systemd со 198 по 204,
в программе +systemctl+ поддерживались команды +set-cgroup-attr+, программа +systemctl+ поддерживала команды +set-cgroup-attr+,
+unset-cgroup-attr+ и +get-cgroup-attr+, позволявшие манипулировать практически +unset-cgroup-attr+ и +get-cgroup-attr+, позволявшие манипулировать настройками
всеми параметрами контрольных групп. Начиная с systemd 205, они были заменены контрольных групп. Начиная с systemd 205, они были заменены командой
командой +set-property+. Установленных таким образом параметры сохраняются во +set-property+, работающей с параметрами конфигурации юнитов. Установленные
вспомогательных конфигурационных файлах в +.d+-каталогах (см. примечание через +systemctl+ настройки сохраняются во вспомогательных конфигурационных
выше).}: файлах, которые размещаются в +.d+-каталогах (см. примечание выше).}:
\begin{Verbatim} \begin{Verbatim}
systemctl daemon-reload systemctl daemon-reload
systemctl restart httpd.service systemctl restart httpd.service
@@ -4055,8 +4097,12 @@ systemd создавать соответствующие группы, доба
Второй из этих пределов превышать нельзя, независимо от наличия свободной Второй из этих пределов превышать нельзя, независимо от наличия свободной
памяти. Подробнее см. раздел <<Soft limits>> в памяти. Подробнее см. раздел <<Soft limits>> в
\href{http://www.kernel.org/doc/Documentation/cgroups/memory.txt}{файле \href{http://www.kernel.org/doc/Documentation/cgroups/memory.txt}{файле
документации}.}. При этом поддерживаются суффиксы K, M, G и T, обозначающие документации}. Отметим, что из-за планируемого прекращения поддержки параметра
соответственно, килобайт, мегабайт, гигабайт и терабайт (по основанию 1024). +memory.soft_limit_in_bytes+ на уровне ядра, опция +MemorySoftLimit=+ была
\href{http://cgit.freedesktop.org/systemd/systemd/commit/?id=ddca82aca08712a302cfabdbe59f73ee9ed3f73a}%
{удалена} из systemd, начиная с версии 208.}. При этом поддерживаются суффиксы
K, M, G и T, обозначающие соответственно, килобайт, мегабайт, гигабайт и
терабайт (по основанию 1024).
\begin{Verbatim} \begin{Verbatim}
.include /usr/lib/systemd/system/httpd.service .include /usr/lib/systemd/system/httpd.service
@@ -4139,12 +4185,21 @@ BlockIOReadBandwith=/var/log 5M
недостаточно~--- допустим, вам нужно задать низкоуровневую настройку cgroups, недостаточно~--- допустим, вам нужно задать низкоуровневую настройку cgroups,
для которой мы (пока) не~добавили высокоуровневого аналога. На этот случай мы для которой мы (пока) не~добавили высокоуровневого аналога. На этот случай мы
предусмотрели универсальных механизм задания таких опций в конфигурационных предусмотрели универсальных механизм задания таких опций в конфигурационных
файлах юнитов\footnote{Прим. перев.: Описываемый механизм управления файлах юнитов\footnote{Прим. перев.: Описываемый здесь механизм управления
низкоуровневыми настройками контрольных групп (+ControlGroupAttribute=+) низкоуровневыми настройками контрольных групп (+ControlGroupAttribute=+)
присутствовал в systemd до 204 версии включительно. Начиная с версии 205, он был присутствовал в systemd до 204 версии включительно. Начиная с версии 205, он был
удален по требованию разработчиков cgroups. Также были удалены возможности удален по требованию разработчиков cgroups. Также были удалены возможности
напрямую задавать для юнита контрольную группу (+ControlGroup=+) и устанавливать напрямую задавать для юнита контрольную группу (+ControlGroup=+) и устанавливать
права доступа для управления группами (+ControlGroupModify=+).}. Рассмотрим, права доступа для управления группами (+ControlGroupModify=+). Взамен,
разработчики systemd планируют значительно расширить поддержку высокоуровневых
настроек для параметров cgroups~--- сразу после того, как разработчики
cgroups определятся, какие именно параметры они будут поддерживать. Наличие
некоторого хаоса в этой области обусловлено происходящей сейчас полной
переработкой реализации контрольных групп на уровне ядра и механизмов работы с
ними из пространства пользователя. Техническая сторона данного вопроса раскрыта
в статье
\href{http://www.freedesktop.org/wiki/Software/systemd/ControlGroupInterface}%
{The New Control Group Interfaces} (пока не~переведена).}. Рассмотрим,
например, задание для службы параметра \emph{swappiness} (относительная например, задание для службы параметра \emph{swappiness} (относительная
интенсивность использования подкачки для процессов службы). В systemd нет интенсивность использования подкачки для процессов службы). В systemd нет
высокоуровневой настройки для этого значения. Однако вы можете задать его, высокоуровневой настройки для этого значения. Однако вы можете задать его,
@@ -4176,8 +4231,8 @@ ControlGroupAttribute=memory.swappiness 70
Для углубленного изучения темы, затронутой в этой статье, вы можете обратиться к Для углубленного изучения темы, затронутой в этой статье, вы можете обратиться к
документации по документации по
\href{http://0pointer.de/public/systemd-man/systemd.exec.html}{поддерживаемым \href{http://www.freedesktop.org/software/systemd/man/systemd.resource-control.html}%
настройкам юнитов}, а также по контроллерам {поддерживаемым настройкам юнитов}, а также по контроллерам
\href{http://www.kernel.org/doc/Documentation/scheduler/sched-design-CFS.txt}{cpu}, \href{http://www.kernel.org/doc/Documentation/scheduler/sched-design-CFS.txt}{cpu},
\href{http://www.kernel.org/doc/Documentation/cgroups/memory.txt}{memory} и \href{http://www.kernel.org/doc/Documentation/cgroups/memory.txt}{memory} и
\href{http://www.kernel.org/doc/Documentation/cgroups/blkio-controller.txt}{blkio}. \href{http://www.kernel.org/doc/Documentation/cgroups/blkio-controller.txt}{blkio}.
@@ -4371,7 +4426,11 @@ $ gdbus call --system --dest org.freedesktop.systemd1 --object-path /org/freedes
те, которые пока не~поддерживают, ее те, которые пока не~поддерживают, ее
\href{http://0pointer.de/blog/projects/socket-activation.html}{не~так уж} и \href{http://0pointer.de/blog/projects/socket-activation.html}{не~так уж} и
\href{http://0pointer.de/blog/projects/socket-activation2.html}{сложно} \href{http://0pointer.de/blog/projects/socket-activation2.html}{сложно}
добавить). Реализованный в systemd механизм управления добавить\footnote{Прим. перев.: Начиная с версии 209, в состав systemd входит
утилита
\hreftt{http://www.freedesktop.org/software/systemd/man/systemd-socket-proxyd.html}%
{systemd-socket-proxyd}, позволяющая использовать сокет-активацию даже для
служб, которые ее не~поддерживают.}). Реализованный в systemd механизм управления
\hyperref[sec:instances]{экземплярами служб} позволяет подготовить \hyperref[sec:instances]{экземплярами служб} позволяет подготовить
универсальные шаблоны конфигурации служб, и в соответствии с ними для каждого универсальные шаблоны конфигурации служб, и в соответствии с ними для каждого
сайта будет запускаться свой экземпляр службы. Кроме того, не~стоит забывать, сайта будет запускаться свой экземпляр службы. Кроме того, не~стоит забывать,
@@ -4429,8 +4488,12 @@ systemd 197 (и, соответственно, с Fedora~19), мы добави
в systemd простейшим контейнерным менеджером~--- в systemd простейшим контейнерным менеджером~---
\hyperref[sec:chroots]{systemd-nspawn}. Мы надеемся, что соответствующая \hyperref[sec:chroots]{systemd-nspawn}. Мы надеемся, что соответствующая
возможность вскоре появится и в возможность вскоре появится и в
\href{http://libvirt.org/drvlxc.html}{libvirt-lxc}. А пока, за отсутствие \href{http://libvirt.org/drvlxc.html}{libvirt-lxc}\footnote{Прим. перев.:
альтернатив, рассмотрим использование этого механизма на примере systemd-nspawn. \href{https://www.redhat.com/archives/libvir-list/2013-July/msg00825.html}{Патчи},
реализующие эту возможность, были подготовлены и приняты разработчиками libvirt
во второй декаде июля 2013 г., и входят в libvirt начиная с версии~1.1.1.}. А
пока, за отсутствием альтернатив, рассмотрим использование этого механизма на
примере systemd-nspawn.
Начнем с установки файлов ОС контейнера в выбранный каталог. Детальное Начнем с установки файлов ОС контейнера в выбранный каталог. Детальное
рассмотрение этого вопроса выходит далеко за рамки нашего обсуждения, и рассмотрение этого вопроса выходит далеко за рамки нашего обсуждения, и
@@ -4476,12 +4539,13 @@ KillMode=process
перев.: Ручной запуск на хосте соответствующей команды +systemd-nspawn -b+ во перев.: Ручной запуск на хосте соответствующей команды +systemd-nspawn -b+ во
время работы такой службы просто создаст \emph{еще один контейнер}. Хотя время работы такой службы просто создаст \emph{еще один контейнер}. Хотя
корневой каталог у них один и тот же, пространства имен (например, списки корневой каталог у них один и тот же, пространства имен (например, списки
процессов) у каждого будут свои. Впрочем, данная задача может быть решена процессов) у каждого будут свои. Подключиться к работающему контейнеру можно при
утилитой +nsenter+, которая должна войти в следующий релиз util-linux помощи утилиты +nsenter+, которая включена в состав util-linux начиная с версии
(предположительно, 2.23).}. Чтобы исправить это упущение, настроим на контейнере 2.23 (на момент написания исходной статьи этой утилиты еще не~существовало).}.
SSH-сервер, причем таким образом, что подключение к его порту активировало весь Чтобы исправить это упущение, настроим на контейнере SSH-сервер, причем таким
контейнер, а затем активировало сервер, работающий внутри. Начнем с того, что образом, что подключение к его порту активировало весь контейнер, а затем
прикажем хосту слушать порт SSH для контейнера. Для этого создадим на хосте файл активировало сервер, работающий внутри. Начнем с того, что прикажем хосту
слушать порт SSH для контейнера. Для этого создадим на хосте файл
+/etc/systemd/system/mycontainer.socket+: +/etc/systemd/system/mycontainer.socket+:
\begin{Verbatim} \begin{Verbatim}
[Unit] [Unit]
@@ -4495,15 +4559,22 @@ ListenStream=23
слушать 23-й TCP-порт хоста. В примере выбран именной 23-й, потому что 22-й слушать 23-й TCP-порт хоста. В примере выбран именной 23-й, потому что 22-й
скорее всего окажется занят SSH-сервером самого хоста. nspawn виртуализует скорее всего окажется занят SSH-сервером самого хоста. nspawn виртуализует
списки процессов и точек монтирования, но не~сетевые стеки, поэтому порты хоста списки процессов и точек монтирования, но не~сетевые стеки, поэтому порты хоста
и гостей не~должны конфликтовать\footnote{Прим. перев.: Ограниченные возможности и гостей не~должны конфликтовать\footnote{Прим. перев.: До выхода 209 версии
виртуализации сети в +systemd-nspawn+ значительно затрудняют использование systemd, возможности по виртуализации сети в +systemd-nspawn+ были весьма
описываемой технологии. Ее практическое применение будет иметь смысл после ограниченными (поддерживалась только полная изоляция сети от хоста), что весьма
реализации соответствующей поддержки в lxc-libvirt, либо расширения возможностей затрудняло использование описываемой технологии. Впрочем, опытные администраторы
nspawn. Впрочем, опытные администраторы легко могут найти обходные пути, легко могли найти обходные пути, например: присваивание хосту дополнительного
например: присваивание хосту дополнительного IP-адреса (безо всякой IP-адреса (безо всякой виртуализации, командой +ip addr add+) и привязка
виртуализации, командой +ip addr add+) и привязка слушающих сокетов к конкретным слушающих сокетов к конкретным адресам (в параметре +ListenStream=+ сокет-файлов
адресам (в параметре +ListenStream=+ сокет-файлов и/или в директиве и/или в директиве +ListenAddress+ файла +sshd_config+ хоста). Начиная с systemd
+ListenAddress+ файла +sshd_config+ хоста).}. версии 209, +systemd-nspawn+ предоставляет довольно широкие возможности по
виртуализации сети: проброс сетевого интерфейса хоста в контейнер
(+--network-interface=+), а также создание в контейнере виртуального сетевого
интерфейса (+--network-veth+), связывающего его с хостом. Такой виртуальный
интерфейс при необходимости может быть объединен в мост с интерфейсами хоста
(+--network-bridge=+), что обеспечит доступ из контейнера к соответствующим
сегментам сети. Подробности см. на~странице руководства
\href{http://www.freedesktop.org/software/systemd/man/systemd-nspawn.html}{systemd-nspawn(1)}.}.
Пока что systemd, работающий внутри контейнера, не~знает, что делать с тем Пока что systemd, работающий внутри контейнера, не~знает, что делать с тем
сокетами, которые ему передает systemd хоста. Если вы попробуете подключиться к сокетами, которые ему передает systemd хоста. Если вы попробуете подключиться к
@@ -4521,7 +4592,7 @@ nspawn. Впрочем, опытные администраторы легко
+StandardInput=socket+, которые не~задействованы на хосте. Это обусловлено тем +StandardInput=socket+, которые не~задействованы на хосте. Это обусловлено тем
фактом, что внутри контейнера сокет-активация производится в стиле inetd (служба фактом, что внутри контейнера сокет-активация производится в стиле inetd (служба
получает только один сокет, причем замкнутый на ее потоки STDIN и STDOUT), в то получает только один сокет, причем замкнутый на ее потоки STDIN и STDOUT), в то
время как на стороне хоста используется родной стиль активации systemd, при время как на стороне хоста используется штатный стиль активации systemd, при
котором запущенному процессу (в данном случае +systemd-nspawn+) просто котором запущенному процессу (в данном случае +systemd-nspawn+) просто
передаются открытые файловые дескрипторы (+fd+) всех сокетов. Одно из достоинств передаются открытые файловые дескрипторы (+fd+) всех сокетов. Одно из достоинств
такого подхода~--- возможность передавать сразу несколько сокетов, что позволяет такого подхода~--- возможность передавать сразу несколько сокетов, что позволяет
@@ -4573,8 +4644,8 @@ systemd начнет прослушивать TCP-порт 23. При подкл
сокеты, для которых соответствующих юнитов не~найдется, будут сокеты, для которых соответствующих юнитов не~найдется, будут
закрыты\footnote{Прим. перев.: Стоит особо отметить, что описанная технология закрыты\footnote{Прим. перев.: Стоит особо отметить, что описанная технология
работает только для служб, поддерживающих сокет-активацию в режимах inetd (все работает только для служб, поддерживающих сокет-активацию в режимах inetd (все
классические inetd-службы, кроме встроенных) или systemd (зависят от библиотеки классические inetd-службы, кроме встроенных) или systemd (обычно зависят от
+libsystemd-daemon.so+, либо содержат в исходниках заголовочный файл библиотеки +libsystemd-daemon.so+, либо содержат в исходниках заголовочный файл
+sd-daemon.h+). Службы, которые сами открывают себе слушающий сокет и +sd-daemon.h+). Службы, которые сами открывают себе слушающий сокет и
не~содержат кода для приема уже открытого сокета, так активировать нельзя.}, а не~содержат кода для приема уже открытого сокета, так активировать нельзя.}, а
те сокеты, которые будут настроены для прослушивания внутри контейнера, но те сокеты, которые будут настроены для прослушивания внутри контейнера, но
@@ -4727,9 +4798,8 @@ systemd 198, необязательно копировать файл целик
Чтобы обеспечить автоматически запуск getty на этом порту при каждой загрузке, Чтобы обеспечить автоматически запуск getty на этом порту при каждой загрузке,
нужно поместить соответствующую символьную ссылку в каталог нужно поместить соответствующую символьную ссылку в каталог
+getty.target.wants/+\footnote{Прим. перев.: Приведенная в оригинале команда +getty.target.wants/+\footnote{Прим. перев.: Приведенная в оригинале команда
+systemctl enable serial-getty@ttyS2.service+ работать не~будет (по крайней +systemctl enable serial-getty@ttyS2.service+ в systemd версии 209 и ниже
мере, в версиях до 204 включительно). Подробнее работать не~будет. Подробнее см.~примечание~\ref{ftn:enableserial}.}:
см.~примечание~\ref{ftn:enableserial}.}:
\begin{Verbatim} \begin{Verbatim}
# ln -s /usr/lib/systemd/system/serial-getty@.service \ # ln -s /usr/lib/systemd/system/serial-getty@.service \
> /etc/systemd/system/getty.target.wants/serial-getty@ttyS2.service > /etc/systemd/system/getty.target.wants/serial-getty@ttyS2.service
@@ -4904,8 +4974,8 @@ $ systemd --test --system --unit=foobar.target
\section{Диагностика неполадок\sfnote{Перевод статьи \section{Диагностика неполадок\sfnote{Перевод статьи
<<\href{http://freedesktop.org/wiki/Software/systemd/Debugging}{Debugging <<\href{http://freedesktop.org/wiki/Software/systemd/Debugging}{Debugging
systemd Problems}>> с официального сайта проекта, по состоянию на 2013-05-26 systemd Problems}>> с официального сайта проекта, по состоянию на 2013-12-20
08:34:30 (коммит 10ae3).}} 10:44:01 (коммит abb5a).}}
\subsection{Диагностика проблем с загрузкой} \subsection{Диагностика проблем с загрузкой}
@@ -5037,7 +5107,7 @@ systemctl enable debug-shell.service
\begin{Verbatim} \begin{Verbatim}
cd $ПУТЬ_К_ВАШЕМУ_КОРНЮ/etc/systemd/system cd $ПУТЬ_К_ВАШЕМУ_КОРНЮ/etc/systemd/system
mkdir -p sysinit.target.wants mkdir -p sysinit.target.wants
ln -s /lib/systemd/system/debug-shell.service sysinit.target.wants/ ln -s /usr/lib/systemd/system/debug-shell.service sysinit.target.wants/
\end{Verbatim} \end{Verbatim}
Отладочная оболочка будет запущена с правами +root+ на консоли +tty9+ Отладочная оболочка будет запущена с правами +root+ на консоли +tty9+
@@ -5116,8 +5186,8 @@ sync && poweroff -f
systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M enforcing=0 systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M enforcing=0
\end{Verbatim} \end{Verbatim}
\item Создайте файл +/lib/systemd/system-shutdown/debug.sh+, добавьте \item Создайте файл +/usr/lib/systemd/system-shutdown/debug.sh+,
ему право на запуск и запишите в него следующие строки: добавьте ему право на запуск и запишите в него следующие строки:
\begin{Verbatim} \begin{Verbatim}
#!/bin/sh #!/bin/sh
mount -o remount,rw / mount -o remount,rw /
@@ -5222,7 +5292,8 @@ dmesg > dmesg.txt
systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M
\end{Verbatim} \end{Verbatim}
\item Файл +systemd-dump.txt+, полученный в результате выполнения \item Файл +systemd-dump.txt+, полученный в результате выполнения
команды команды\footnote{Прим. перев.: Начиная с systemd версии 207,
вместо +systemctl dump+ нужно вызывать +systemd-analyze dump+.}
\begin{Verbatim} \begin{Verbatim}
systemctl dump > systemd-dump.txt systemctl dump > systemd-dump.txt
\end{Verbatim} \end{Verbatim}
@@ -5235,7 +5306,7 @@ systemctl dump > systemd-dump.txt
\section{Совместимость с SysV\sfnote{Перевод статьи \section{Совместимость с SysV\sfnote{Перевод статьи
<<\href{http://www.freedesktop.org/wiki/Software/systemd/Incompatibilities}% <<\href{http://www.freedesktop.org/wiki/Software/systemd/Incompatibilities}%
{Compatibility with SysV}>> с официального сайта проекта, по {Compatibility with SysV}>> с официального сайта проекта, по
состоянию на 2013-05-18 08:20:25 (коммит fa003).}} состоянию на 2013-10-06 21:37:19 (коммит 4db1c).}}
systemd обеспечивает высокий уровень совместимости с поведением классической systemd обеспечивает высокий уровень совместимости с поведением классической
системы инициализации SysV init, реализованной во многих дистрибутивах. Это системы инициализации SysV init, реализованной во многих дистрибутивах. Это
@@ -5371,7 +5442,7 @@ API для скриптов. Тем не~менее, существует ряд
\section{Предсказуемые имена сетевых интерфейсов\sfnote{Перевод статьи \section{Предсказуемые имена сетевых интерфейсов\sfnote{Перевод статьи
<<\href{http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames}% <<\href{http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames}%
{Predictable Network Interface Names}>> с официального сайта проекта, по {Predictable Network Interface Names}>> с официального сайта проекта, по
состоянию на 2013-05-22 08:55:30 (коммит dc0a2).}} состоянию на 2014-02-21 15:36:45 (коммит 5613f).}}
Начиная с версии 197, systemd/udev присваивает сетевым интерфейсам (Ethernet, Начиная с версии 197, systemd/udev присваивает сетевым интерфейсам (Ethernet,
WLAN, WWAN\footnote{Прим. перев.: WWAN (Wireless Wide Area Network)~--- WLAN, WWAN\footnote{Прим. перев.: WWAN (Wireless Wide Area Network)~---
@@ -5475,7 +5546,12 @@ systemd/udev\footnote{Прим. перев.: См. коммит
\item Имена интерфейсов остаются неизменными при добавлении или \item Имена интерфейсов остаются неизменными при добавлении или
удалении устройств. удалении устройств.
\item Имена интерфейсов остаются неизменными при обновлении/изменении \item Имена интерфейсов остаются неизменными при обновлении/изменении
ядра и драйверов. ядра и драйверов\footnote{Прим. перев.: На самом деле, не~все
так просто. Если, в результате обновлении ядра/драйверов, в них
появится ранее отсутствовавшая поддержка вашей прошивки,
не~исключена вероятность, что имена некоторых интерфейсов
перейдут с третьей схемы на первую или вторую. Будьте готовы к
такому развитию событий.}.
\item Имена интерфейсов остаются неизменными при замене сломанных \item Имена интерфейсов остаются неизменными при замене сломанных
сетевых карт новыми. сетевых карт новыми.
\item Имена формируются автоматически, безо всякого вмешательства \item Имена формируются автоматически, безо всякого вмешательства
@@ -5507,39 +5583,65 @@ systemd/udev\footnote{Прим. перев.: См. коммит
\begin{enumerate} \begin{enumerate}
\item Вы можете полностью отключить новую схему, вернувшись к \item Вы можете полностью отключить новую схему, вернувшись к
классическим непредсказуемым именам. Для этого достаточно классическим непредсказуемым именам. Для этого достаточно
заблокировать (замаскировать) соответствующий файл правил udev: заблокировать (замаскировать) файл правил udev, отвечающий за
именование интерфейсов:
\begin{Verbatim} \begin{Verbatim}
ln -s /dev/null /etc/udev/rules.d/80-net-name-slot.rules ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules
\end{Verbatim} \end{Verbatim}
(Заметим, что в версиях systemd со 197 по 208 соответствующий
файл назывался +80-net-name-slot.rules+.)
\item Вы можете вручную назначить интерфейсам наиболее понятные для вас \item Вы можете вручную назначить интерфейсам наиболее понятные для вас
имена (например, +internet0+, +dmz0+, +lan0+). Для этого, имена (например, +internet0+, +dmz0+, +lan0+). Для этого,
подготовьте свои собственные правила, указав в них нужные имена подготовьте свои собственные правила, указав в них нужные имена
при помощи параметра +NAME+, после чего сохраните их в файл с при помощи параметра +NAME+, после чего сохраните их в файл с
более высоким приоритетом, чем правила по умолчанию, например, более высоким приоритетом, чем правила по умолчанию, например,
+/etc/udev/rules.d/70-my-net-names.rules+. (Приоритет файлов +/etc/udev/rules.d/70-my-net-names.rules+\footnote{Прим. перев.:
определяется на основании алфавитной сортировки их имен.) Начиная с systemd 209, существует более удобный способ настройки
имен и других параметров сетевых интерфейсов (MAC-адреса,
скорости, дуплекса, MTU, состояния Wake on LAN)~--- он описан в
секции <<Network Link Configuration>> на странице руководства
\href{http://www.freedesktop.org/software/systemd/man/udev.html#Network%20Link%20Configuration}{udev(7)}.}.
(Приоритет файлов определяется на основании алфавитной
сортировки их имен.)
\item Вы можете скорректировать правила, используемые по умолчанию, \item Вы можете скорректировать правила, используемые по умолчанию,
например, задействовав схему именования интерфейсов по например, задействовав схему именования интерфейсов по
MAC-адресам. Для, этого скопируйте файл правил в каталог +/etc+ MAC-адресам. Для, этого скопируйте соответствующий
конфигурационный файл в каталог +/etc+
\begin{Verbatim} \begin{Verbatim}
cp /usr/lib/udev/rules.d/80-net-name-slot.rules /etc/udev/rules.d/80-net-name-slot.rules cp /usr/lib/systemd/network/99-default.link /etc/systemd/network/99-default.link
\end{Verbatim} \end{Verbatim}
после чего измените его так, как считаете нужным. после чего измените значение параметра +NamePolicy=+ так, как
считаете нужным (подробнее см.~секцию <<Network Link
Configuration>> на странице руководства
\href{http://www.freedesktop.org/software/systemd/man/udev.html#Network%20Link%20Configuration}{udev(7)})%
\footnote{Прим. перев.: В systemd версий со 197 по 208, за
логику именования интерфейсов отвечал файл правил udev
+/usr/lib/udev/rules.d/80-net-name-slot.rules+, поэтому
копировать из +/usr/lib+ в +/etc+ и редактировать нужно было
именно его. Начиная с версии 209, управление именованием
интерфейсов вынесено в udev-утилиту (built-in) +net_setup_link+,
которая вызывается через файл правил
+/etc/udev/rules.d/80-net-setup-link.rules+ и настраивается
через файлы +*.link+, размещенные в каталогах
+{/etc,/run,/usr/lib}/systemd/network+. За подготовку исходных
данных, на основе которых формируются имена интерфейсов, как и
раньше, отвечает утилита +net_id+.}.
\end{enumerate} \end{enumerate}
Кроме того, начиная с systemd версии 199, поддерживается параметр загрузки Кроме того, начиная с systemd версии 199, поддерживается параметр загрузки
+net.ifnames=0+, позволяющий отключить механизм предсказуемых имен (указание его +net.ifnames=0+, позволяющий отключить механизм предсказуемых имен (указание его
в конфигурации загрузчика эквивалентно первому из вышеперечисленных вариантов). в файле конфигурации загрузчика практически эквивалентно первому из
вышеперечисленных вариантов).
\subsection{Как именно работает новая схема?} \subsection{Как именно работает новая схема?}
Подробности технической реализации описаны в блоке комментариев в Подробности технической реализации описаны в блоке комментариев в
\href{http://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-net_id.c#n20}% \href{http://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-net_id.c#n20}%
{исходном коде net-id built-in}. Ознакомьтесь с ним, если у вас возникают {исходном коде net\_id built-in}. Ознакомьтесь с ним, если у вас возникают
вопросы, касающиеся расшифровки новых имен\footnote{Прим. перев.: Далее вопросы, касающиеся расшифровки новых имен\footnote{Прим. перев.: Далее
приводится перевод упомянутого блока комментариев. Последним коммитом, приводится перевод упомянутого блока комментариев. Последним коммитом,
затронувшим данный файл, на момент перевода является a4bbe от 8 июля затронувшим данный файл, на момент перевода является e0d4a от 9 января
2013 г.}. 2014 г.}.
\begin{Verbatim} \begin{Verbatim}
Предсказуемые имена сетевых интерфейсов формируются на основании: Предсказуемые имена сетевых интерфейсов формируются на основании:
@@ -5550,8 +5652,9 @@ cp /usr/lib/udev/rules.d/80-net-name-slot.rules /etc/udev/rules.d/80-net-name-sl
Первые два символа в имени определяют тип интерфейса: Первые два символа в имени определяют тип интерфейса:
en -- ethernet en -- ethernet
wl -- wlan sl -- SLIP (IP через последовательный порт)
ww -- wwan wl -- WLAN
ww -- WWAN
Последующие символы определяеются используемой схемой: Последующие символы определяеются используемой схемой:
o<index> -- для устройств, встроенных в материнскую плату o<index> -- для устройств, встроенных в материнскую плату
@@ -5595,7 +5698,7 @@ Multi-function PCI устройство с двумя портами:
ID_NET_NAME_MAC=enx78e7d1ea46dc ID_NET_NAME_MAC=enx78e7d1ea46dc
ID_NET_NAME_PATH=enp2s0f1 ID_NET_NAME_PATH=enp2s0f1
Подключенная к PCI wlan-карта: Подключенная к PCI WLAN-карта:
/sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlp3s0 /sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlp3s0
ID_NET_NAME_MAC=wlx0024d7e31130 ID_NET_NAME_MAC=wlx0024d7e31130
ID_NET_NAME_PATH=wlp3s0 ID_NET_NAME_PATH=wlp3s0