Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
06c29b851c | ||
|
|
97ba7a7ac6 | ||
|
|
8af5fceade |
360
s4a.tex
360
s4a.tex
@@ -23,6 +23,8 @@ pdfauthor={Lennart Poettering, Sergey Ptashnick}}
|
||||
\newcommand{\sfnote}[1]{\texorpdfstring{\protect\footnote%
|
||||
{Прим. перев.: #1}}{}}
|
||||
\newcommand{\qna}[1]{\medskip\par\textbf{Вопрос: #1}\par Ответ:}
|
||||
\newcommand\yousaywtf[1]{\emph{#1}}
|
||||
\newcommand\yousaywtfsk[1]{\yousaywtf{#1}\medskip\par}
|
||||
% Настройка макета страницы
|
||||
\setlength{\hoffset}{-1.5cm}
|
||||
\addtolength{\textwidth}{2cm}
|
||||
@@ -35,6 +37,7 @@ pdfauthor={Lennart Poettering, Sergey Ptashnick}}
|
||||
% И листингов
|
||||
\definecolor{gray}{gray}{0.75}
|
||||
\fvset{frame=leftline,rulecolor=\color{gray},framerule=1mm}
|
||||
\definecolor{dgreen}{rgb}{0,0.6,0}
|
||||
% Запрет висячих строк
|
||||
\clubpenalty=10000
|
||||
\widowpenalty=10000
|
||||
@@ -52,7 +55,7 @@ pdfauthor={Lennart Poettering, Sergey Ptashnick}}
|
||||
Unported}}
|
||||
\maketitle
|
||||
\tableofcontents
|
||||
\newpage
|
||||
%\newpage
|
||||
\sectiona{Предисловие автора}
|
||||
Многие из вас, наверное, уже знают, что
|
||||
\href{http://www.freedesktop.org/wiki/Software/systemd}{systemd}~--- это новая
|
||||
@@ -88,7 +91,7 @@ systemd эти сообщения будут пробегать все быст
|
||||
сообщения. Тем не~менее, информация, которую они несут, была и остается
|
||||
чрезвычайно важной~--- они показывают, успешно ли запустилась каждая служба, или
|
||||
попытка ее запуска закончилась ошибкой (зеленое
|
||||
\texttt{[~\textcolor{green}{OK}~]} или красное
|
||||
\texttt{[~\textcolor{dgreen}{OK}~]} или красное
|
||||
\texttt{[~\textcolor{red}{FAILED}~]} соответственно). Итак, с ростом скорости
|
||||
загрузки систем, возникает неприятная ситуация: информация о результатах
|
||||
запуска служб бывает очень важна, а просматривать ее все тяжелее. systemd
|
||||
@@ -3496,7 +3499,7 @@ getty\footnote{Отметим, что +systemctl enable+ \emph{для экзем
|
||||
/etc/systemd/system/getty.target.wants/serial-getty@ttyS2.service ; systemctl
|
||||
daemon-reload}.}\footnote{\label{ftn:enableserial}Прим. перев.: На самом деле,
|
||||
работать с символьными ссылками придется даже в современных версиях systemd (на
|
||||
момент написания этих строк, последней является версия 202), так как
|
||||
момент написания этих строк, последней является версия 204), так как
|
||||
разработчики забыли включить в файл +serial-getty@.service+ секцию +[Install]+,
|
||||
в результате чего попытка выполнения +systemctl enable+ для экземпляра
|
||||
соответствующей службы ведет к закономерной ошибке. Впрочем, исправить это
|
||||
@@ -3996,17 +3999,18 @@ CPUShares=1500
|
||||
основного файла. Все вышесказанное относится и к другим примерам из этого
|
||||
раздела.}. Сохраняем файл, приказываем systemd перечитать конфигурацию, и
|
||||
перезапускаем Apache, чтобы настройки вступили в силу\footnote{Прим. перев.:
|
||||
systemd версий до 197 включительно, не~поддерживает изменение параметров
|
||||
контрольных групп без перезапуска службы. Но вы можете узнать контрольную группу
|
||||
службы командой наподобие +systemctl show -p ControlGroup avahi-daemon.service+,
|
||||
и выполнить настройки любым удобным для вас способом, например, через запись
|
||||
значений в псевдофайлы cgroupfs (разумеется, при следующем запуске службы к ней
|
||||
будут применены параметры, указанные в конфигурационном файле). Начиная с
|
||||
systemd 198, в программу +systemctl+ добавлена поддержка команд
|
||||
+set-cgroup-attr+, +unset-cgroup-attr+ и +get-cgroup-attr+, позволяющих
|
||||
манипулировать практически всеми параметрами контрольных групп. При этом
|
||||
поддерживается сохранение установленных таким образом параметров в виде
|
||||
вспомогательных конфигурационных файлов в +.d+-каталогах (см. примечание
|
||||
systemd версий до 197 включительно, не~имел штатного механизма для изменения
|
||||
параметров контрольных групп <<на лету>> (без перезапуска службы). Но вы можете
|
||||
узнать контрольную группу службы командой наподобие
|
||||
+systemctl show -p ControlGroup avahi-daemon.service+, и выполнить настройки
|
||||
любым удобным для вас способом, например, через запись значений в псевдофайлы
|
||||
cgroupfs (разумеется, при следующем запуске службы к ней будут применены
|
||||
параметры, указанные в конфигурационном файле). В версиях systemd со 198 по 204,
|
||||
в программе +systemctl+ поддерживались команды +set-cgroup-attr+,
|
||||
+unset-cgroup-attr+ и +get-cgroup-attr+, позволявшие манипулировать практически
|
||||
всеми параметрами контрольных групп. Начиная с systemd 205, они были заменены
|
||||
командой +set-property+. Установленных таким образом параметры сохраняются во
|
||||
вспомогательных конфигурационных файлах в +.d+-каталогах (см. примечание
|
||||
выше).}:
|
||||
\begin{Verbatim}
|
||||
systemctl daemon-reload
|
||||
@@ -4135,11 +4139,16 @@ BlockIOReadBandwith=/var/log 5M
|
||||
недостаточно~--- допустим, вам нужно задать низкоуровневую настройку cgroups,
|
||||
для которой мы (пока) не~добавили высокоуровневого аналога. На этот случай мы
|
||||
предусмотрели универсальных механизм задания таких опций в конфигурационных
|
||||
файлах юнитов. Рассмотрим, например, задание для службы параметра
|
||||
\emph{swappiness} (относительная интенсивность использования подкачки для
|
||||
процессов службы). В systemd нет высокоуровневой настройки для этого значения.
|
||||
Однако вы можете задать его, используя низкоуровневую настройку
|
||||
+ControlGroupAttribute=+:
|
||||
файлах юнитов\footnote{Прим. перев.: Описываемый механизм управления
|
||||
низкоуровневыми настройками контрольных групп (+ControlGroupAttribute=+)
|
||||
присутствовал в systemd до 204 версии включительно. Начиная с версии 205, он был
|
||||
удален по требованию разработчиков cgroups. Также были удалены возможности
|
||||
напрямую задавать для юнита контрольную группу (+ControlGroup=+) и устанавливать
|
||||
права доступа для управления группами (+ControlGroupModify=+).}. Рассмотрим,
|
||||
например, задание для службы параметра \emph{swappiness} (относительная
|
||||
интенсивность использования подкачки для процессов службы). В systemd нет
|
||||
высокоуровневой настройки для этого значения. Однако вы можете задать его,
|
||||
используя низкоуровневую настройку +ControlGroupAttribute=+:
|
||||
\begin{Verbatim}
|
||||
.include /usr/lib/systemd/system/httpd.service
|
||||
|
||||
@@ -4621,7 +4630,7 @@ systemd, начиная с версии 197. Тем не~менее, наша р
|
||||
\section{FAQ (часто задаваемые вопросы)\sfnote{Перевод статьи
|
||||
<<\href{http://www.freedesktop.org/wiki/Software/systemd/FrequentlyAskedQuestions}%
|
||||
{Frequently Asked Questions}>> с официального сайта проекта, по состоянию на
|
||||
2013-01-15 16:59:29 (ревизия \No29).}}
|
||||
2013-05-26 08:17:02 (коммит 8cf2b).}}
|
||||
|
||||
Также смотрите статью
|
||||
\href{http://www.freedesktop.org/wiki/Software/systemd/TipsAndTricks}{Tips \&
|
||||
@@ -4651,7 +4660,9 @@ Tricks}\footnote{Прим. перев.: На самом деле, смотрет
|
||||
\qna{Как изменить уровень выполнения, в который система грузится по умолчанию?}
|
||||
Соответствующее целевое состояние задается символьной ссылкой
|
||||
+/etc/systemd/system/default.target+. Для его смены достаточно перезаписать эту
|
||||
ссылку. Например, так:
|
||||
ссылку\footnote{Прим. перев.: Начиная с systemd 205, в программу +systemctl+
|
||||
были добавлены команды +set-default+ и +get-default+, упрощающие подобные
|
||||
действия, например, +systemctl set-default multi-user.target+.}. Например, так:
|
||||
\begin{Verbatim}
|
||||
# ln -sf /usr/lib/systemd/system/multi-user.target /etc/systemd/system/default.target
|
||||
\end{Verbatim}
|
||||
@@ -4663,7 +4674,7 @@ Tricks}\footnote{Прим. перев.: На самом деле, смотрет
|
||||
\qna{Как узнать текущий уровень выполнения?}
|
||||
В один и тот же момент времени может быть активно несколько целевых состояний,
|
||||
поэтому понятие текущего уровня выполнения (единственного и однозначно
|
||||
определенно) применимо уже далеко не~всегда. Узнать, какие состояния сейчас
|
||||
определенного) применимо уже далеко не~всегда. Узнать, какие состояния сейчас
|
||||
активны, вы можете при помощи команды
|
||||
\begin{Verbatim}
|
||||
$ systemctl list-units --type=target
|
||||
@@ -4677,18 +4688,18 @@ $ systemctl list-units --type=target
|
||||
при каждом обновлении. Что делать?}
|
||||
Наиболее разумным решением будет скопировать исходный файл из
|
||||
+/usr/lib/systemd/system+ в +/etc/systemd/system+ и внести изменения в
|
||||
полученную копию. Файлы из +/etc+ защищены от посягательств пакетного менеджера,
|
||||
и при этом имеют приоритет над файлами из +/usr+. Если же вы захотите вернуться
|
||||
к настройкам по умолчанию, достаточно будет просто удалить или переименовать
|
||||
созданный вами файл\footnote{Прим. перев.: Начиная с версии systemd 198,
|
||||
необязательно копировать файл целиком, если вы хотите добавить/изменить
|
||||
отдельные настройки. Можно просто создать в +/etc/systemd/system/+ подкаталог
|
||||
+имя_службы.service.d+, а в нем~--- файл с именем, заканчивающимся на +.conf+,
|
||||
например, +mysettings.conf+, после чего вписать в этот файл необходимые
|
||||
настройки. Они будут применены <<поверх>> настроек из штатного файла
|
||||
(расположенного в +/usr+).}.
|
||||
полученную копию. Юнит-файлы из +/etc+ защищены от посягательств пакетного
|
||||
менеджера, и при этом имеют приоритет над файлами из +/usr+. Если же вы захотите
|
||||
вернуться к настройкам по умолчанию, достаточно будет просто удалить или
|
||||
переименовать созданный вами файл\footnote{Прим. перев.: Начиная с версии
|
||||
systemd 198, необязательно копировать файл целиком, если вы хотите
|
||||
добавить/изменить отдельные настройки. Можно просто создать в
|
||||
+/etc/systemd/system/+ подкаталог +имя_службы.service.d+, а в нем~--- файл с
|
||||
именем, заканчивающимся на +.conf+, например, +mysettings.conf+, после чего
|
||||
вписать в этот файл необходимые настройки. Они будут применены <<поверх>>
|
||||
настроек из штатного файла (расположенного в +/usr+).}.
|
||||
|
||||
\qna{Служба foo.service по умолчанию запускается только при поступлении
|
||||
\qna{Служба \texttt{foo.service} по умолчанию запускается только при поступлении
|
||||
входящего соединения (или подключении определенного оборудования, или при
|
||||
появлении заданного файла). Как сделать так, чтобы она запускалась сразу при
|
||||
загрузке?}
|
||||
@@ -4717,7 +4728,7 @@ $ systemctl list-units --type=target
|
||||
нужно поместить соответствующую символьную ссылку в каталог
|
||||
+getty.target.wants/+\footnote{Прим. перев.: Приведенная в оригинале команда
|
||||
+systemctl enable serial-getty@ttyS2.service+ работать не~будет (по крайней
|
||||
мере, в версиях до 202 включительно). Подробнее
|
||||
мере, в версиях до 204 включительно). Подробнее
|
||||
см.~примечание~\ref{ftn:enableserial}.}:
|
||||
\begin{Verbatim}
|
||||
# ln -s /usr/lib/systemd/system/serial-getty@.service \
|
||||
@@ -4725,9 +4736,9 @@ $ systemctl list-units --type=target
|
||||
# systemctl daemon-reload
|
||||
\end{Verbatim}
|
||||
|
||||
Обратите внимание, что на виртуальных терминала getty запускаются автоматически,
|
||||
как только пользователь переключается на данный терминал. Максимальное
|
||||
количество таких терминалов задается параметром +NAutoVTs=+ в файле
|
||||
Обратите внимание, что на виртуальных терминалах getty запускаются
|
||||
автоматически, как только пользователь переключается на данный терминал.
|
||||
Максимальное количество таких терминалов задается параметром +NAutoVTs=+ в файле
|
||||
\href{http://www.freedesktop.org/software/systemd/man/logind.html}%
|
||||
{logind.conf(7)}. Также см. главу~\ref{sec:getty}.
|
||||
|
||||
@@ -4765,9 +4776,9 @@ $ psc
|
||||
\end{Verbatim}
|
||||
или просто посмотреть \verb+/proc/$PID/cgroup+. Также см. главу~\ref{sec:cgls}.
|
||||
|
||||
\qna{Почему вы не~используете infotify для отслеживания изменений в настройках?}
|
||||
\qna{Почему вы не~используете inotify для отслеживания изменений в настройках?}
|
||||
К сожалению, реализовать это весьма проблематично. За подробностями вы можете
|
||||
обратиться к обсуждению этой проблемы в
|
||||
обратиться к обсуждению в
|
||||
\href{https://bugzilla.redhat.com/show_bug.cgi?id=615527}{bugzilla}\footnote{Прим.
|
||||
перев.: Вкратце, суть проблемы состоит в том, что перемещение/переименование
|
||||
файла не~является атомарной операцией, а состоит из удаления одного файла и
|
||||
@@ -4781,11 +4792,11 @@ $ psc
|
||||
\texttt{/etc/init.d/foobar}?}
|
||||
При наличии обоих этих файлов, приоритет всегда отдается штатному service-файлу,
|
||||
независимо от того, включен ли запуск соответствующего скрипта (например, через
|
||||
+chkconfig+) или нет. Обратите внимание, что отключение юнит-файла (например,
|
||||
через +systemctl disable+ приведет к полному отключению службы, даже если
|
||||
+chkconfig+) или нет. Обратите внимание, что отключение юнит-файла (в частности,
|
||||
через +systemctl disable+) приведет к полному отключению службы, даже если
|
||||
init-скрипт при этом будет включен.
|
||||
|
||||
\qna{Как заставить \texttt{journalctl} выводить полные (не~сокращенные строки)?}
|
||||
\qna{Как заставить \texttt{journalctl} выводить полные (не~сокращенные) строки?}
|
||||
Используйте
|
||||
\begin{Verbatim}
|
||||
# journalctl --full
|
||||
@@ -4808,7 +4819,11 @@ systemd все работало!}
|
||||
Это тоже долгая история. См. приложения~\ref{sec:apifs}.
|
||||
|
||||
\qna{Как просмотреть список работающих служб?}
|
||||
Запустите команду +systemctl+ без параметров:
|
||||
Запустите команду +systemctl+ без параметров\footnote{Прим. перев.: +systemctl+
|
||||
без параметров выведет состояние всех активных юнитов (в т.ч. сокетов,
|
||||
устройств, точек монтирования, целевых состояний, таймеров, и т.д.). Чтобы
|
||||
ограничиться только службами, добавьте параметр +-t service+. Чтобы вывести все
|
||||
службы/юниты, включая неактивные, добавьте параметр +-a+.}:
|
||||
\begin{Verbatim}[fontsize=\small]
|
||||
$ systemctl
|
||||
UNIT LOAD ACTIVE SUB JOB DESCRIPTION
|
||||
@@ -4858,18 +4873,22 @@ iscsi.service netfs.service
|
||||
|
||||
Вместо +Wants+ вы можете использовать другие типы зависимостей: +WantedBy+,
|
||||
+Requires+, +RequiredBy+, +Conflicts+, +ConflictedBy+, +Before+,
|
||||
+After+\footnote{Прим. перев.: Разница между \texttt{*s} и \texttt{*edBy}~---
|
||||
в направлении зависимости. Например, если \texttt{multi-user.target} запрашивает
|
||||
запуск (\texttt{Wants}) юнита \texttt{rc-local.service}, то она будет
|
||||
указана в свойстве \texttt{WantedBy} этого юнита. Интересно, что свойство
|
||||
\texttt{ConflictedBy} существует, однако задать его вручную нельзя~--- оно
|
||||
формируется только на основании \texttt{Conflicts} других служб. Что касается
|
||||
разница между +Wants+ и +Requires+, то первое является пожеланием, а второе
|
||||
требованием. Если \emph{требуемый} юнит не~сможет запуститься, значит
|
||||
не~запустится и сам зависящий от него юнит. \emph{Пожелания} не~накладывают
|
||||
такого ограничения. А указания \emph{порядка} запуска (\texttt{Before},
|
||||
\texttt{After}) вообще не~формируют зависимостей и работают только тогда, когда
|
||||
такие зависимости, прямо или косвенно, уже заданы.}.
|
||||
+After+\footnote{\label{ftn:wants}Прим. перев.: Разница между +*s+ и +*edBy+~---
|
||||
в направлении зависимости. Например, если цель +multi-user.target+ запрашивает
|
||||
запуск (+Wants+) службы +rc-local.service+, то она будет
|
||||
указана в свойстве +WantedBy+ этой службы. Интересно, что свойство
|
||||
+ConflictedBy+ существует, однако задать его напрямую нельзя~--- оно
|
||||
формируется только на основании +Conflicts+ других служб. Что касается
|
||||
разницы между +Wants+ и +Requires+, то первое является пожеланием, а второе
|
||||
требованием. Если требуемый (required) юнит не~сможет запуститься, то
|
||||
не~запустится и сам зависящий от него юнит. Пожелания (wants) не~накладывают
|
||||
такого ограничения~--- будет сделана попытка запуска зависимого юнита, но
|
||||
результат ее никак не~отразится на зависящем юните. А указания \emph{порядка}
|
||||
запуска (+Before+, +After+) вообще не~формируют зависимостей и работают только
|
||||
тогда, когда такие зависимости, прямо или косвенно, уже заданы.}\footnote{Прим.
|
||||
перев. Отметим, что начиная с systemd 198, +systemctl+ поддерживает
|
||||
специализированную команду +list-dependencies+, позволяющую отследить прямые и
|
||||
косвенные (<<рекурсивные>>) зависимости заданного юнита.}.
|
||||
|
||||
\qna{Как узнать, что будет запущено при загрузке системы в заданное целевое
|
||||
состояние?}
|
||||
@@ -4885,8 +4904,8 @@ $ systemd --test --system --unit=foobar.target
|
||||
|
||||
\section{Диагностика неполадок\sfnote{Перевод статьи
|
||||
<<\href{http://freedesktop.org/wiki/Software/systemd/Debugging}{Debugging
|
||||
systemd Problems}>> с официального сайта проекта, по состоянию на 2013-01-08
|
||||
19:13:31 (ревизия \No26).}}
|
||||
systemd Problems}>> с официального сайта проекта, по состоянию на 2013-05-26
|
||||
08:34:30 (коммит 10ae3).}}
|
||||
|
||||
\subsection{Диагностика проблем с загрузкой}
|
||||
|
||||
@@ -4898,7 +4917,7 @@ systemd Problems}>> с официального сайта проекта, по
|
||||
\begin{Verbatim}[commandchars=\\\{\}]
|
||||
Welcome to \textcolor{blue}{Fedora \emph{ВЕРСИЯ} (\emph{имя релиза})}!
|
||||
Starting \emph{название}...
|
||||
[ \textcolor{green}{OK} ] Stared \emph{название}...
|
||||
[ \textcolor{dgreen}{OK} ] Stared \emph{название}...
|
||||
\end{Verbatim}
|
||||
(Пример можно посмотреть на
|
||||
\href{http://freedesktop.org/wiki/Software/systemd/Debugging?action=AttachFile&do=view&target=f17boot.png}{скриншоте}.)
|
||||
@@ -4906,13 +4925,12 @@ Welcome to \textcolor{blue}{Fedora \emph{ВЕРСИЯ} (\emph{имя релиз
|
||||
Если у вас есть доступ к оболочке, это значительно упрощает диагностику и
|
||||
решение проблем. В том случае, когда до приглашения входа в систему дело так и
|
||||
не~доходит, попробуйте переключиться на другую виртуальную консоль, нажав
|
||||
CTRL--ALT--F<\emph{цифра}>. Дело в том, что при проблемах, связанных с запуском
|
||||
X-сервера, может возникать ситуация, когда на первой консоли (+tty1+)
|
||||
приглашение ко входу отсутствует, но все остальные консоли при этом работают
|
||||
нормально.
|
||||
CTRL--ALT--F<\emph{цифра}>. При проблемах, связанных с запуском X-сервера, может
|
||||
возникать ситуация, когда на первой консоли (+tty1+) приглашение ко входу
|
||||
отсутствует, но все остальные консоли при этом работают нормально.
|
||||
|
||||
Если ни~на одной из виртуальных консолей приглашение так и не~появилось~---
|
||||
попробуйте выждать еще \emph{порядка 5 минут}. Только после этого можно
|
||||
попробуйте выждать еще \emph{не~менее 5 минут}. Только после этого можно
|
||||
будет считать процесс загрузки окончательно зависшим. Если подвисание
|
||||
обусловлено всего лишь сбоем при запуске какой-то службы, то после истечения
|
||||
тайм-аута проблемная служба будет убита, и загрузка продолжится. Другой
|
||||
@@ -4943,7 +4961,22 @@ X-сервера, может возникать ситуация, когда н
|
||||
на последовательную консоль: меню Вид (View)~$\Rightarrow$ Текстовые
|
||||
консоли (Text Consoles)), вы можете попросить systemd выводить на эту
|
||||
консоль подробную отладочную информацию о ходе загрузки, добавив к
|
||||
параметрам ядра следующие аргументы:
|
||||
параметрам ядра следующие аргументы\footnote{\label{ftn:netconsole}
|
||||
Прим. перев.: Стоит упомянуть еще об одном отладочном инструменте~---
|
||||
\hreftt{https://www.kernel.org/doc/Documentation/networking/netconsole.txt}%
|
||||
{netconsole}. Это механизм ядра, позволяющий отправлять содержимое
|
||||
буфера +kmsg+ (см.
|
||||
\hreftt{http://linux.die.net/man/8/dmesg}{dmesg(8)}) по сети на заданный
|
||||
компьютер. Обратите внимание, что его настройка через командную строку
|
||||
ядра (параметр +netconsole=...+) работает только если он вкомпилирован в
|
||||
ядро монолитно. Если же он собран модулем, его необходимо настраивать
|
||||
через +/etc/modprobe.d/*.conf+ или +configfs+ (впрочем, некоторые версии
|
||||
+modprobe+ поддерживают чтение параметров модулей из командной строки
|
||||
ядра, так что можно попробовать добавить туда
|
||||
+netconsole.netconsole=...+), а также задавать его принудительную
|
||||
подгрузку через параметр ядра +modules-load=netconsole+. Кроме того, при
|
||||
этом надо обеспечить перенаправление логов systemd в буфер ядра~---
|
||||
соответствующие параметры см. в разделе~\ref{sssec:kmsg}.}:
|
||||
\begin{Verbatim}
|
||||
systemd.log_level=debug systemd.log_target=console console=ttyS0,38400
|
||||
\end{Verbatim}
|
||||
@@ -4999,8 +5032,8 @@ systemctl enable debug-shell.service
|
||||
на +/bin/bash+.
|
||||
|
||||
\textbf{Совет:} Если вы не~можете воспользоваться командой +systemctl+
|
||||
(например, загрузились с помощью другой операционной системы), вы можете
|
||||
выполнить соответствующие действия и напрямую:
|
||||
(например, загрузились с помощью другой операционной системы),
|
||||
выполните соответствующие действия напрямую:
|
||||
\begin{Verbatim}
|
||||
cd $ПУТЬ_К_ВАШЕМУ_КОРНЮ/etc/systemd/system
|
||||
mkdir -p sysinit.target.wants
|
||||
@@ -5030,6 +5063,7 @@ ln -s /lib/systemd/system/debug-shell.service sysinit.target.wants/
|
||||
\end{description}
|
||||
|
||||
\subsubsection{Если у вас есть доступ к оболочке}
|
||||
\label{sssec:kmsg}
|
||||
|
||||
Если вам все-таки удалось получить доступ к оболочке системы, вы можете
|
||||
воспользоваться ею для сбора диагностической информации. Загрузите систему со
|
||||
@@ -5104,7 +5138,9 @@ mount -o remount,ro /
|
||||
собрать диагностическую информацию другими методами (которые мы уже
|
||||
рассматривали применительно к проблемам загрузки):
|
||||
\begin{itemize}
|
||||
\item Используйте \hyperlink{it:serial}{последовательную консоль}.
|
||||
\item Используйте \hyperlink{it:serial}{последовательную
|
||||
консоль}\footnote{Прим. перев.: Здесь опять же стоит напомнить
|
||||
про +netconsole+ (см. примечание~\ref{ftn:netconsole}).}.
|
||||
\item Воспользуйтесь \hyperlink{it:dbgshell}{отладочной оболочкой}~---
|
||||
она полезна не~только на ранних стадиях загрузки, но и на
|
||||
поздних стадиях остановки системы.
|
||||
@@ -5154,7 +5190,7 @@ May 11 20:26:23 scratch foo[1329]: Failed to parse config
|
||||
|
||||
\subsection{Подготовка сообщений об ошибках}
|
||||
|
||||
Если вы собираетесь отправить сообщение об ошибке в systemd, пожалуйста,
|
||||
Если вы собираетесь отправить сообщение об ошибке systemd, пожалуйста,
|
||||
включите в него диагностическую информацию, в частности, содержимое системных
|
||||
журналов. Журналы должны быть полными (без вырезок), не~заархивированными, с
|
||||
MIME-типом +text/plain+.
|
||||
@@ -5199,14 +5235,14 @@ systemctl dump > systemd-dump.txt
|
||||
\section{Совместимость с SysV\sfnote{Перевод статьи
|
||||
<<\href{http://www.freedesktop.org/wiki/Software/systemd/Incompatibilities}%
|
||||
{Compatibility with SysV}>> с официального сайта проекта, по
|
||||
состоянию на 2013-01-11 19:04:14 (ревизия \No26).}}
|
||||
состоянию на 2013-05-18 08:20:25 (коммит fa003).}}
|
||||
|
||||
systemd обеспечивает высокий уровень совместимости с поведением классической
|
||||
системы инициализации SysV init, реализованной во многих дистрибутивах. Это
|
||||
касается как непосредственного взаимодействия с пользователем, так и поддержки
|
||||
API для скриптов. Тем не~менее, существует ряд ограничений, обусловленных
|
||||
техническими соображениями, а также особенностями дизайна systemd и/или
|
||||
дистрибутивов. Ниже приведен список таких ограничений. Большая их часть
|
||||
дистрибутивов. Ниже приведен список таких ограничений. Б\'{о}льшая их часть
|
||||
затрагивает дистрибутивно-специфичные расширения SysV init, и поэтому будет
|
||||
ощутима только для пользователей отдельных дистрибутивов.
|
||||
\begin{itemize}
|
||||
@@ -5228,7 +5264,13 @@ API для скриптов. Тем не~менее, существует ряд
|
||||
дистрибутивы, которые одновременно поддерживают и init-скрипты,
|
||||
и юнит-файлы. В таких дистрибутивах даже прямое обращение к
|
||||
скрипту при необходимости будет преобразовано в соответствующий
|
||||
запрос к systemd.)
|
||||
запрос к systemd\footnote{Прим. перев.: Такое поведение
|
||||
задают разработчики дистрибутива, при помощи
|
||||
корректировки файла, содержащего стандартные функции для
|
||||
init-скриптов (например, +/etc/rc.d/init.d/functions+ в
|
||||
Fedora или +/etc/rc.status+ в openSUSE). Этот файл
|
||||
вызывается практически из всех init-скриптов в самом начале их
|
||||
работы.}.)
|
||||
\item Информация о зависимостях служб, прописанная в LSB-заголовке
|
||||
скрипта, играет существенную роль. Большинство реализаций SysV
|
||||
в различных дистрибутивах практически не~используют эту
|
||||
@@ -5238,7 +5280,9 @@ API для скриптов. Тем не~менее, существует ряд
|
||||
интерпретирует эти заголовки корректно, и использует
|
||||
содержащуюся в них информацию при выполнении различных операций
|
||||
со службами (а не~только в момент их установки, как это делают
|
||||
некоторые другие реализации SysV.)
|
||||
некоторые другие реализации SysV\footnote{Прим. перев.:
|
||||
Например, +insserv+, используемый как дополнение к SysV init в
|
||||
Debian (а ранее и в openSUSE).}).
|
||||
\item Все операции со скриптами ограничены по времени при помощи
|
||||
тайм-аутов. В отличие от классических SysV-систем, где зависший
|
||||
init-скрипт полностью останавливает загрузку, systemd
|
||||
@@ -5254,7 +5298,7 @@ API для скриптов. Тем не~менее, существует ряд
|
||||
init-скрипты не~поддерживаются (в частности, игнорируется
|
||||
используемый в LSB-заголовках скриптов Debian флаг
|
||||
+X-Interactive+). К счастью, большинство дистрибутивов все равно
|
||||
не~поддерживали интерактивные init-скрипты. Если вашему скрипту
|
||||
не~поддерживало интерактивные init-скрипты. Если вашему скрипту
|
||||
нужно запросить пароль для зашифрованного диска или
|
||||
SSL-ключа, вы можете воспользоваться для этого специальным
|
||||
механизмом, предоставляемым systemd (см.
|
||||
@@ -5263,10 +5307,17 @@ API для скриптов. Тем не~менее, существует ряд
|
||||
\href{http://www.freedesktop.org/software/systemd/man/systemd-ask-password.html}%
|
||||
{страницу руководства}).
|
||||
\item Дополнительные команды для init-скриптов (кроме стандартных,
|
||||
таких, как +start+, +stop+, +status+ и т.д.)
|
||||
таких, как +start+, +stop+, +status+, +restart+, +reload+,
|
||||
+try-restart+, +force-reload+\footnote{Прим. перев.: Точный
|
||||
список <<стандартных>> команд для SysV init-скриптов зависит от
|
||||
используемого дистрибутива. Так уж исторически сложилось, что
|
||||
практически каждый дистрибутив использовал собственные стандарты
|
||||
интерфейсов SysV init. Это отразилось и на <<заглушках>>,
|
||||
используемых для обратной совместимости. Выше приведен список
|
||||
команд, которые поддерживаются как в Fedora, так и в openSUSE.})
|
||||
не~поддерживаются\footnote{Прим. перев.: В частности, это
|
||||
касается специфичных для init-скрипта +/etc/init.d/iptables+
|
||||
команд +save+ и +panic+.}.
|
||||
ограничение касается специфичных для init-скрипта
|
||||
+/etc/init.d/iptables+ команд +save+ и +panic+.}.
|
||||
\item Также не~поддерживается возможность указывать после стандартных
|
||||
команд скрипту дополнительные параметры. Такое расширение SysV
|
||||
не~прописано ни~в каких стандартах, и реализация его поддержки
|
||||
@@ -5285,10 +5336,10 @@ API для скриптов. Тем не~менее, существует ряд
|
||||
отличается гораздо б\'{о}льшей гибкостью и эффективностью,
|
||||
чем система уровней исполнения. Как следствие, в некоторых
|
||||
случаях попытка узнать текущий уровень исполнения (например,
|
||||
при помощи +/sbin/runlevel+) может вернуть <<+N+>> (т.е.
|
||||
<<уровень выполнения неизвестен>>), что может привести к
|
||||
нарушению работы скриптов, использующих явную проверку текущего
|
||||
уровня исполнения. Избегайте подобных проверок.
|
||||
при помощи +/sbin/runlevel+) может вернуть просто <<+N+>> (т.е.
|
||||
<<уровень выполнения неизвестен>>), что приведет к нарушению
|
||||
работы скриптов, использующих явную проверку текущего уровня
|
||||
исполнения. Избегайте подобных проверок.
|
||||
\item +/sbin/chkconfig+ и аналогичные программы могут выводить
|
||||
некорректную информацию о состоянии службы (включена/отключена).
|
||||
Они оперируют только init-скриптами, игнорируя штатные
|
||||
@@ -5320,7 +5371,7 @@ API для скриптов. Тем не~менее, существует ряд
|
||||
\section{Предсказуемые имена сетевых интерфейсов\sfnote{Перевод статьи
|
||||
<<\href{http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames}%
|
||||
{Predictable Network Interface Names}>> с официального сайта проекта, по
|
||||
состоянию на 2013-01-22 20:22:48 (ревизия \No27).}}
|
||||
состоянию на 2013-05-22 08:55:30 (коммит dc0a2).}}
|
||||
|
||||
Начиная с версии 197, systemd/udev присваивает сетевым интерфейсам (Ethernet,
|
||||
WLAN, WWAN\footnote{Прим. перев.: WWAN (Wireless Wide Area Network)~---
|
||||
@@ -5344,7 +5395,7 @@ WLAN, WWAN\footnote{Прим. перев.: WWAN (Wireless Wide Area Network)~---
|
||||
идентифицируются как раз по именам.
|
||||
|
||||
Существует несколько подходов к решению этой проблемы. В течение многих лет udev
|
||||
поддерживал механизм постоянной привязки имен к интерфейсам, на основе
|
||||
поддерживал механизм постоянной привязки имен к интерфейсам на основе
|
||||
MAC-адресов. Такой подход имел множество недостатков, в том числе: требование
|
||||
доступности корневого каталога на запись (что возможно далеко не~всегда);
|
||||
необходимость внесения изменений в образ системы после загрузки на новом
|
||||
@@ -5361,7 +5412,7 @@ systemd/udev\footnote{Прим. перев.: См. коммит
|
||||
{3e214} от 3 апреля 2012 года, в котором, среди прочего, был удален каталог
|
||||
+src/udev/src/rule_generator+.}.
|
||||
|
||||
Другая попытка решения обсуждаемой проблемы~--- +biosdevname+, программа,
|
||||
Другая попытка решения обсуждаемой проблемы~--- biosdevname, программа,
|
||||
формирующая имена интерфейсов на основании их физического расположении на
|
||||
материнской плате. Соответствующая информация запрашивается у BIOS. В чем-то
|
||||
такая схема похожа на ту, которую udev уже давно использует для формирования
|
||||
@@ -5390,7 +5441,7 @@ systemd/udev\footnote{Прим. перев.: См. коммит
|
||||
различных механизмов именования сетевых интерфейсов, получив в итоге схему,
|
||||
похожую на biosdevname, но отличающуюся большей гибкостью и максимально
|
||||
приближенную к алгоритмам идентификации устройств, используемым в ядре.
|
||||
В частности, udev теперь штатно поддерживает следующие механизмы именования
|
||||
В частности, udev теперь штатно поддерживает следующие схемы именования
|
||||
сетевых интерфейсов:
|
||||
\begin{enumerate}
|
||||
\item Имена устройств, встроенных в материнскую плату, формируются на
|
||||
@@ -5408,7 +5459,7 @@ systemd/udev\footnote{Прим. перев.: См. коммит
|
||||
|
||||
По умолчанию, systemd 197 при именовании сетевых интерфейсов последовательно
|
||||
пытается применить схемы 1--3 (для первых двух требуется информация от
|
||||
EFI/BIOS). Если ни одна из них не~подходит, используется схема 5. Что касается
|
||||
прошивки). Если ни одна из них не~подходит, используется схема 5. Что касается
|
||||
схемы 4~--- она не~задействована по умолчанию, однако ее можно включить вручную.
|
||||
|
||||
Вышеописанная комбинированная схема используется лишь \emph{в последнюю
|
||||
@@ -5418,7 +5469,7 @@ EFI/BIOS). Если ни одна из них не~подходит, испол
|
||||
|
||||
\subsection{Еще раз, что здесь хорошего?}
|
||||
|
||||
С нашей новой схемой вы получаете:
|
||||
Достоинства нашей новой схемы:
|
||||
\begin{itemize}
|
||||
\item Имена интерфейсов остаются неизменными после перезагрузок.
|
||||
\item Имена интерфейсов остаются неизменными при добавлении или
|
||||
@@ -5434,13 +5485,13 @@ EFI/BIOS). Если ни одна из них не~подходит, испол
|
||||
устройство.
|
||||
\item Изменения в аппаратной конфигурации не~приводят к необходимости
|
||||
записи в каталог +/etc+.
|
||||
\item Полная поддержка системам, корень которых доступен только
|
||||
\item Полная поддержка систем, корень которых доступен только
|
||||
для чтения.
|
||||
\item Схема именования аналогичная той, которая используется
|
||||
\item Логика именования аналогична той, которая используется
|
||||
udev для формирования стабильных символьных ссылок в каталоге
|
||||
+/dev+ (+by-path+).
|
||||
\item Работает как на x86, так и на~других архитектурах.
|
||||
\item Работает одинаково во всех дистрибутивах, использующих на
|
||||
\item Работает одинаково во всех дистрибутивах, использующих
|
||||
systemd/udev.
|
||||
\item От этой схемы очень легко отказаться (см. ниже).
|
||||
\end{itemize}
|
||||
@@ -5476,6 +5527,10 @@ cp /usr/lib/udev/rules.d/80-net-name-slot.rules /etc/udev/rules.d/80-net-name-sl
|
||||
после чего измените его так, как считаете нужным.
|
||||
\end{enumerate}
|
||||
|
||||
Кроме того, начиная с systemd версии 199, поддерживается параметр загрузки
|
||||
+net.ifnames=0+, позволяющий отключить механизм предсказуемых имен (указание его
|
||||
в конфигурации загрузчика эквивалентно первому из вышеперечисленных вариантов).
|
||||
|
||||
\subsection{Как именно работает новая схема?}
|
||||
|
||||
Подробности технической реализации описаны в блоке комментариев в
|
||||
@@ -5483,13 +5538,13 @@ cp /usr/lib/udev/rules.d/80-net-name-slot.rules /etc/udev/rules.d/80-net-name-sl
|
||||
{исходном коде net-id built-in}. Ознакомьтесь с ним, если у вас возникают
|
||||
вопросы, касающиеся расшифровки новых имен\footnote{Прим. перев.: Далее
|
||||
приводится перевод упомянутого блока комментариев. Последним коммитом,
|
||||
затронувшим данный файл, на момент перевода является b92be от 24 марта
|
||||
затронувшим данный файл, на момент перевода является a4bbe от 8 июля
|
||||
2013 г.}.
|
||||
|
||||
\begin{Verbatim}
|
||||
Предсказуемые имена сетевых интерфейсов формируются на основании:
|
||||
- индексов встроенных в материнскую плату устройств (по информации EFI/BIOS)
|
||||
- индексов hotplug-слотов PCI-E (по информации EFI/BIOS)
|
||||
- индексов встроенных в материнскую плату устройств (по информации от прошивки)
|
||||
- индексов hotplug-слотов PCI-E (по информации от прошивки)
|
||||
- физического расположения точки подключения оборудования
|
||||
- MAC-адресов
|
||||
|
||||
@@ -5502,13 +5557,16 @@ cp /usr/lib/udev/rules.d/80-net-name-slot.rules /etc/udev/rules.d/80-net-name-sl
|
||||
o<index> -- для устройств, встроенных в материнскую плату
|
||||
s<slot>[f<function>][d<dev_id>] -- для hotplug-слотов
|
||||
x<MAC> -- при именовании по MAC-адресу
|
||||
p<bus>s<slot>[f<function>][d<dev_id>] -- на основании физического
|
||||
[P<domain>]p<bus>s<slot>[f<function>][d<dev_id>] -- на основании физического
|
||||
расположения PCI-устройства
|
||||
p<bus>s<slot>[f<function>][u<port>][..][c<config>][i<interface>]
|
||||
[P<domain>]p<bus>s<slot>[f<function>][u<port>][..][c<config>][i<interface>]
|
||||
-- идентификационная цепочка для USB-устройств
|
||||
|
||||
Все многофункциональные (multi-function) PCI-устройства содержат в своем имени
|
||||
номер функции [f<function>] (отсчитываются от нуля).
|
||||
номер функции "f<function>" (отсчитываются от нуля).
|
||||
|
||||
При именовании по расположению устройства, индекс PCI-домена "P<domain>"
|
||||
указывается только в том случае, если он отличен от нулевого.
|
||||
|
||||
Для USB-устройства формируется полная цепочка номеров портов хабов, через
|
||||
которые оно подключено. Если итоговая строка будет длиннее 15 символов, она
|
||||
@@ -5517,7 +5575,7 @@ cp /usr/lib/udev/rules.d/80-net-name-slot.rules /etc/udev/rules.d/80-net-name-sl
|
||||
|
||||
Примеры:
|
||||
|
||||
Подключенная к PCI сетевая карта, которая идентифцироуется прошивкой
|
||||
Подключенная к PCI сетевая карта, которая идентифицируется прошивкой
|
||||
по индексу "1":
|
||||
ID_NET_NAME_ONBOARD=eno1
|
||||
ID_NET_NAME_ONBOARD_LABEL=Ethernet Port 1
|
||||
@@ -5555,51 +5613,52 @@ Multi-function PCI устройство с двумя портами:
|
||||
|
||||
\section{Специальные файловые системы\sfnote{Перевод статьи
|
||||
<<\href{http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems}{API
|
||||
File Systems}>> с официального сайта проекта, по состоянию на 2013-01-17
|
||||
11:06:59 (ревизия \No14).}}
|
||||
File Systems}>> с официального сайта проекта, по состоянию на 2013-05-26
|
||||
08:37:25 (коммит 6a93f).}}
|
||||
\label{sec:apifs}
|
||||
|
||||
\emph{Итак, вы запустили программу mount(8), и увидели в ее выводе множество
|
||||
странных файловых систем, не~указанных в /etc/fstab. У вас могут возникнуть
|
||||
вопросы: <<Как их убрать?>> или <<Как задать для них параметры монтирования?>>.}
|
||||
\yousaywtfsk{Итак, вы запустили программу mount(8), и увидели в ее выводе
|
||||
множество странных файловых систем, не~указанных в /etc/fstab. У вас могут
|
||||
возникнуть вопросы: <<Как их убрать?>> или <<Как задать для них параметры
|
||||
монтирования?>>.}
|
||||
|
||||
В Linux предусмотрено несколько способов взаимодействия программ из пространства
|
||||
пользователя с ядром. Наиболее популярными механизмами являются системные вызовы
|
||||
(syscall), интерфейсы Netlink, а также виртуальные файловые системы (ФС), такие,
|
||||
как +/proc+ и +/sys+. Подобные ФС являются лишь программными интерфейсами, и
|
||||
не~предоставляют возможности для долговременного хранения данных (в частности,
|
||||
между перезагрузками системы). Они просто используют классические механизмы
|
||||
работы с файлами для предоставления доступа к различным данным и настройкам.
|
||||
Кроме того, существуют специальные ФС, используемые программами для собственных
|
||||
нужд, в частности, для хранения сегментов разделяемой памяти (shared memory),
|
||||
временных файлов и сокетов. В данной статье мы обсудим все эти разновидности
|
||||
не~обеспечивают долговременного хранения данных (в частности, между
|
||||
перезагрузками системы). Они просто используют классические механизмы работы с
|
||||
файлами для предоставления доступа к различным данным и настройкам. Кроме того,
|
||||
существуют специальные ФС, используемые программами для собственных нужд, в
|
||||
частности, для хранения сегментов разделяемой памяти (shared memory), временных
|
||||
файлов и сокетов. В данной статье мы обсудим все эти разновидности
|
||||
\emph{специальных файловых систем}. Ниже представлен список таких ФС,
|
||||
поддерживаемых в типовых Linux-системах:
|
||||
\begin{itemize}
|
||||
\item +/sys+ предоставляет доступ к драйверам и устройствам, а также
|
||||
некоторым другим параметрам ядра
|
||||
\item +/proc+ дает доступ к информации о выполняемых процессах,
|
||||
настройкам ядра, а также другим параметрам
|
||||
\item +/dev+ отображает файлы устройств (device nodes)
|
||||
\item +/run+ содержит файлы и сокеты, используемые программами
|
||||
\item +/tmp+ хранит временные и часто изменяемые объекты (X)
|
||||
некоторым другим параметрам ядра;
|
||||
\item +/proc+ дает доступ к информации о выполняемых процессах,
|
||||
настройкам ядра, а также другим параметрам;
|
||||
\item +/dev+ отображает файлы устройств (device nodes);
|
||||
\item +/run+ содержит файлы и сокеты, используемые программами;
|
||||
\item +/tmp+ хранит временные и часто изменяемые объекты (X);
|
||||
\item +/sys/fs/cgroup+ (и другие файловые системы, смонтированные в
|
||||
подкаталогах этого каталога) позволяют работать с иерархией
|
||||
контрольных групп
|
||||
контрольных групп;
|
||||
\item +/sys/kernel/security+, +/sys/kernel/debug+ (X),
|
||||
+/sys/kernel/config+ (X) предоставляют доступ к
|
||||
специализированным механизмам ядра
|
||||
\item +/sys/fs/selinux+ используется для взаимодействия с SELinux
|
||||
\item +/dev/shm+ содержит объекты разделяемой памяти
|
||||
\item +/dev/pts+ обеспечивает доступ к псевдо-TTY устройствам
|
||||
специализированным механизмам ядра;
|
||||
\item +/sys/fs/selinux+ используется для взаимодействия с SELinux;
|
||||
\item +/dev/shm+ содержит объекты разделяемой памяти;
|
||||
\item +/dev/pts+ обеспечивает доступ к псевдо-TTY устройствам;
|
||||
\item +/proc/sys/fs/binfmt_misc+ используется для регистрации в ядре
|
||||
дополнительных бинарных форматов (X)
|
||||
\item +/dev/mqueue+ содержит объекты IPC-механизма mqueue (X)
|
||||
дополнительных бинарных форматов (X);
|
||||
\item +/dev/mqueue+ содержит объекты IPC-механизма mqueue (X);
|
||||
\item +/dev/hugepages+ позволяет программам запрашивать выделение
|
||||
<<гигантских>> страниц памяти (X)
|
||||
<<гигантских>> страниц памяти (X);
|
||||
\item +/sys/fs/fuse/connections+ обеспечивает доступ к
|
||||
FUSE-соединениям (X)
|
||||
\item +/sys/firmware/efi/efivars+ предоставляет доступ к переменным EFI
|
||||
FUSE-соединениям (X);
|
||||
\item +/sys/firmware/efi/efivars+ предоставляет доступ к переменным EFI;
|
||||
\end{itemize}
|
||||
|
||||
systemd монтирует все эти файловые системы на ранних стадиях загрузки, даже если
|
||||
@@ -5622,20 +5681,20 @@ systemd монтирует все эти файловые системы на р
|
||||
укажете, будут автоматически применяться к соответствующим ФС. Проще говоря:
|
||||
если вам нужно изменить параметры монтирования для специальных ФС, просто
|
||||
добавьте их в +/etc/fstab+ с указанием соответствующих опций. Кроме параметров
|
||||
монтирования, так можно изменить и сам тип файловой системы. В частности, этот
|
||||
способ позволяет переключить +/tmp+ с +tmpfs+ на физический дисковый раздел.
|
||||
монтирования, так можно изменить и сам тип файловой системы (в частности,
|
||||
перенести +/tmp+ из +tmpfs+ на раздел физического диска).
|
||||
|
||||
Также вы можете полностью отключить монтирование некоторых (но не~всех)
|
||||
специальных систем, если это действительно необходимо. Отключаемые ФС в списке
|
||||
выше отмечены (X). Для их отключения, достаточно замаскировать соответствующий
|
||||
юнит:
|
||||
выше отмечены (X). Для их отключения, достаточно заблокировать (замаскировать)
|
||||
соответствующий юнит:
|
||||
\begin{Verbatim}
|
||||
systemctl mask dev-hugepages.mount
|
||||
\end{Verbatim}
|
||||
|
||||
В результате выполнения такой операции, соответствующая ФС больше не~будет
|
||||
монтироваться по умолчанию, начиная со следующей загрузки системы. О том, что
|
||||
такое маскировка юнита, вы можете прочитать в~главе~\ref{sec:off}.
|
||||
такое блокировка юнита, вы можете прочитать в~главе~\ref{sec:off}.
|
||||
|
||||
На всякий случай отметим, что применение к специальным ФС параметров монтирования,
|
||||
указанных в +/etc/fstab+, обеспечивается службой
|
||||
@@ -5665,10 +5724,10 @@ systemctl mask tmp.mount
|
||||
\section{Запуск служб после появления сети\sfnote{Перевод статьи
|
||||
<<\href{http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget}{Running
|
||||
Services After the Network is up}>> с официального сайта проекта, по состоянию
|
||||
на 2013-01-17 23:22:58 (ревизия \No17).}}
|
||||
на 2013-07-16 15:16:55 (коммит 8b44c).}}
|
||||
\label{sec:networktarget}
|
||||
|
||||
\emph{Итак, ваша служба настроена на запуск только после достижения цели
|
||||
\yousaywtfsk{Итак, ваша служба настроена на запуск только после достижения цели
|
||||
network.target, однако, несмотря на это, она все равно запускается до появления
|
||||
сети. У вас возникают вопросы: <<Почему так происходит?>> и <<Как это
|
||||
исправить?>>.}
|
||||
@@ -5676,8 +5735,8 @@ network.target, однако, несмотря на это, она все рав
|
||||
Цель +network.target+ является systemd-шным аналогом LSB-сущности (facility)
|
||||
\verb+$network+. Определение этой сущности в стандарте
|
||||
\href{http://refspecs.linuxbase.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/facilname.html}%
|
||||
{довольно расплывчато} и оставляет широкий простор для трактовок. Вот примеры
|
||||
некоторых из них:
|
||||
{довольно расплывчато} и оставляет широкий простор для различных трактовок. Вот
|
||||
примеры некоторых из них:
|
||||
\begin{itemize}
|
||||
\item Все заданные в настройках сетевые интерфейсы переведены в состояние
|
||||
UP и получили IP-адреса.
|
||||
@@ -5685,7 +5744,7 @@ network.target, однако, несмотря на это, она все рав
|
||||
зарегистрирована несущая (link beat), получили IP-адреса.
|
||||
Наличие или отсутствие явных настроек роли не~играет.
|
||||
\item Доступен DNS-сервер.
|
||||
\item Доступен некоторый выбранный сервер.
|
||||
\item Доступна некоторая выбранная сетевая служба.
|
||||
\item Доступен некий абстрактный <<интернет>>.
|
||||
\item Все заданные в настройках ethernet-интерфейсы переведены в
|
||||
состояние UP, однако процесс настройки PPP-интерфейсов еще
|
||||
@@ -5693,7 +5752,7 @@ network.target, однако, несмотря на это, она все рав
|
||||
\item Активирован некий профиль сетевых настроек, задающий одно из
|
||||
условий выше. В разных профилях могут использоваться разные
|
||||
условия.
|
||||
\item Выполняется некоторое условие (выбор условия определяется
|
||||
\item Выполняется некоторый набор условий (выбор условий определяется
|
||||
физическим расположением системы).
|
||||
\item Настроен как минимум один глобальный адрес IPv4.
|
||||
\item Настроен как минимум один глобальный адрес IPv6.
|
||||
@@ -5776,11 +5835,8 @@ service-файл, запускающий любую заданную вами п
|
||||
всего указать здесь ту же самую +network.target+: в результате, ваша служба и
|
||||
+network.target+ будут взаимно зависеть друг от друга, но при этом
|
||||
+network.target+ будет активирована только после того, как отработает ваша
|
||||
служба. Разница между +WantedBy=+ и +RequiredBy=+ состоит в том, что при
|
||||
использовании Require требуется \emph{успешное} завершение запуска вашей службы.
|
||||
Если он завершится с ненулевым кодом выхода или по сигналу, +network.target+
|
||||
не~будет активирована. В то время как для Want достаточно просто завершения
|
||||
запуска, вне зависимости от успешности. В качестве основы вы можете взять
|
||||
служба (о разницы между +WantedBy=+ и +RequiredBy=+ см.
|
||||
примечание~\ref{ftn:wants}). В качестве основы вы можете взять
|
||||
\href{http://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/data/NetworkManager-wait-online.service.in}%
|
||||
{апстримный файл} +NetworkManager-wait-online.service+. В завершение,
|
||||
не~забудьте выполнить для своей службы +systemctl enable+.}.
|
||||
@@ -5802,7 +5858,7 @@ service-файл, запускающий любую заданную вами п
|
||||
\item Отслеживайте изменений конфигурации сети при помощи
|
||||
\href{https://www.kernel.org/doc/man-pages/online/pages/man7/rtnetlink.7.html}%
|
||||
{rtnetlink} и реагируйте соответствующим образом. Это наиболее
|
||||
правильный, но далеко не~всегда простой способ.
|
||||
правильный, но далеко не~всегда самый простой способ.
|
||||
\item Если вы разрабатываете серверное приложение: слушайте только
|
||||
адреса 0.0.0.0 и 127.0.0.1. Оба этих псевдо-адреса должны быть
|
||||
доступны постоянно. Если ваша программа будет слушать только их,
|
||||
@@ -5819,13 +5875,13 @@ service-файл, запускающий любую заданную вами п
|
||||
\section{Моя служба не~может получить приоритет realtime\sfnote{Перевод статьи
|
||||
<<\href{http://www.freedesktop.org/wiki/Software/systemd/MyServiceCantGetRealtime}%
|
||||
{My Service Can't Get Realtime!}>> с официального сайта проекта, по состоянию на
|
||||
2013-01-15 16:54:09 (ревизия \No1).}}
|
||||
2013-05-18 08:20:36 (коммит 2f77b).}}
|
||||
\label{sec:realtime}
|
||||
|
||||
\emph{Итак, у вас есть служба, которая требует приоритет реального времени
|
||||
\yousaywtf{Итак, у вас есть служба, которая требует приоритет реального времени
|
||||
(realtime). Однако, когда вы пытаетесь запустить ее на системе, работающей под
|
||||
управлением systemd, ваша служба не~может получить этот приоритет, хотя обладает
|
||||
всеми необходимыми для этого привилегиями. Вы хотите понять, почему это
|
||||
всеми необходимыми для этого привилегиями. Вы хотите понять, почему так
|
||||
происходит, и как это можно исправить.}
|
||||
|
||||
\subsection*{В чем же дело?}
|
||||
@@ -5841,7 +5897,7 @@ service-файл, запускающий любую заданную вами п
|
||||
существенный недостаток: она требует явного задания realtime-бюджета времени (RT
|
||||
budget) для своих контрольных групп. Если же бюджет группы не~задан, то ее
|
||||
процессы не~смогут получить приоритет реального времени (соответствующая
|
||||
операция будет завершаться с ошибкой +EPERM+~--- <<недостаточные полномочия>>).
|
||||
операция будет завершаться с ошибкой +EPERM+~--- <<недостаточно полномочий>>).
|
||||
systemd не~может присваивать такой бюджет \emph{каждой} группе, просто потому,
|
||||
что не~знает, как его правильно делить между ними. Бюджет выдается в абсолютных
|
||||
единицах времени, и их общее количество ограничено. Мы не~можем предложить
|
||||
@@ -5856,22 +5912,28 @@ systemd не~может присваивать такой бюджет \emph{к
|
||||
\item Можно просто отключить использование cpu-контроллера по умолчанию
|
||||
для системных служб. Для этого, задайте в файле
|
||||
+/etc/systemd/system.conf+ параметр +DefaultControllers=+ равным
|
||||
пустой строке, после чего перезагрузите систему. (Также вы
|
||||
пустой строке, после чего перезагрузите систему. (Либо вы
|
||||
можете отключить контроллер +cpu+ на этапе сборки ядра. systemd
|
||||
не~пытается использовать контроллеры, которые не~поддерживаются
|
||||
ядром.)
|
||||
\item Также вы можете отключить группировку по +cpu+ только для
|
||||
конкретных служб. Для этого отредактируйте конфигурацию службы,
|
||||
добавив параметр +ControlGroup=cpu:/+ в секцию +[Service]+. В
|
||||
добавив параметр
|
||||
\begin{Verbatim}
|
||||
ControlGroup=cpu:/
|
||||
\end{Verbatim}
|
||||
в секцию +[Service]+. В
|
||||
результате, процессы данной службы будут помещены не~в
|
||||
собственную контрольную группу (как это делалось по умолчанию),
|
||||
а в корневую контрольную группу иерархии +cpu+. Процессы из
|
||||
корневой группы располагают полным realtime-бюджетом.
|
||||
\item И наконец, вы можете явно выделить своей службе некоторый бюджет.
|
||||
Для этого добавьте в секцию +[Service]+ строку наподобие
|
||||
+ControlGroupAttribute=cpu.rt_runtime_us 500000+. Подробнее о
|
||||
правильном распределении бюджета читайте в
|
||||
\href{http://www.kernel.org/doc/Documentation/scheduler/sched-design-CFS.txt}%
|
||||
\begin{Verbatim}
|
||||
ControlGroupAttribute=cpu.rt_runtime_us 500000
|
||||
\end{Verbatim}
|
||||
Подробнее о правильном распределении бюджета читайте в
|
||||
\href{http://www.kernel.org/doc/Documentation/scheduler/sched-rt-group.txt}%
|
||||
{документации к ядру}.
|
||||
\end{itemize}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user