Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
97ba7a7ac6 | ||
|
|
8af5fceade | ||
|
|
0e79197eb1 |
631
s4a.tex
631
s4a.tex
@@ -22,6 +22,9 @@ pdfauthor={Lennart Poettering, Sergey Ptashnick}}
|
|||||||
{\smallskip\par}
|
{\smallskip\par}
|
||||||
\newcommand{\sfnote}[1]{\texorpdfstring{\protect\footnote%
|
\newcommand{\sfnote}[1]{\texorpdfstring{\protect\footnote%
|
||||||
{Прим. перев.: #1}}{}}
|
{Прим. перев.: #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}
|
\setlength{\hoffset}{-1.5cm}
|
||||||
\addtolength{\textwidth}{2cm}
|
\addtolength{\textwidth}{2cm}
|
||||||
@@ -34,6 +37,7 @@ pdfauthor={Lennart Poettering, Sergey Ptashnick}}
|
|||||||
% И листингов
|
% И листингов
|
||||||
\definecolor{gray}{gray}{0.75}
|
\definecolor{gray}{gray}{0.75}
|
||||||
\fvset{frame=leftline,rulecolor=\color{gray},framerule=1mm}
|
\fvset{frame=leftline,rulecolor=\color{gray},framerule=1mm}
|
||||||
|
\definecolor{dgreen}{rgb}{0,0.6,0}
|
||||||
% Запрет висячих строк
|
% Запрет висячих строк
|
||||||
\clubpenalty=10000
|
\clubpenalty=10000
|
||||||
\widowpenalty=10000
|
\widowpenalty=10000
|
||||||
@@ -51,7 +55,7 @@ pdfauthor={Lennart Poettering, Sergey Ptashnick}}
|
|||||||
Unported}}
|
Unported}}
|
||||||
\maketitle
|
\maketitle
|
||||||
\tableofcontents
|
\tableofcontents
|
||||||
\newpage
|
%\newpage
|
||||||
\sectiona{Предисловие автора}
|
\sectiona{Предисловие автора}
|
||||||
Многие из вас, наверное, уже знают, что
|
Многие из вас, наверное, уже знают, что
|
||||||
\href{http://www.freedesktop.org/wiki/Software/systemd}{systemd}~--- это новая
|
\href{http://www.freedesktop.org/wiki/Software/systemd}{systemd}~--- это новая
|
||||||
@@ -76,6 +80,8 @@ Unported}}
|
|||||||
\end{flushright}
|
\end{flushright}
|
||||||
|
|
||||||
\section{Контроль процесса загрузки}
|
\section{Контроль процесса загрузки}
|
||||||
|
\label{sec:verify}
|
||||||
|
|
||||||
Как правило, во время загрузки Linux по экрану быстро пробегает огромное
|
Как правило, во время загрузки Linux по экрану быстро пробегает огромное
|
||||||
количество различных сообщений. Так как мы интенсивно работаем над
|
количество различных сообщений. Так как мы интенсивно работаем над
|
||||||
параллелизацией и ускорением процесса загрузки, с каждой новой версией
|
параллелизацией и ускорением процесса загрузки, с каждой новой версией
|
||||||
@@ -85,7 +91,7 @@ systemd эти сообщения будут пробегать все быст
|
|||||||
сообщения. Тем не~менее, информация, которую они несут, была и остается
|
сообщения. Тем не~менее, информация, которую они несут, была и остается
|
||||||
чрезвычайно важной~--- они показывают, успешно ли запустилась каждая служба, или
|
чрезвычайно важной~--- они показывают, успешно ли запустилась каждая служба, или
|
||||||
попытка ее запуска закончилась ошибкой (зеленое
|
попытка ее запуска закончилась ошибкой (зеленое
|
||||||
\texttt{[~\textcolor{green}{OK}~]} или красное
|
\texttt{[~\textcolor{dgreen}{OK}~]} или красное
|
||||||
\texttt{[~\textcolor{red}{FAILED}~]} соответственно). Итак, с ростом скорости
|
\texttt{[~\textcolor{red}{FAILED}~]} соответственно). Итак, с ростом скорости
|
||||||
загрузки систем, возникает неприятная ситуация: информация о результатах
|
загрузки систем, возникает неприятная ситуация: информация о результатах
|
||||||
запуска служб бывает очень важна, а просматривать ее все тяжелее. systemd
|
запуска служб бывает очень важна, а просматривать ее все тяжелее. systemd
|
||||||
@@ -234,6 +240,8 @@ systemd сообщает нам, что ntpd был запущен (с иден
|
|||||||
возникшие во время исполнения службы.
|
возникшие во время исполнения службы.
|
||||||
|
|
||||||
\section{О службах и процессах}
|
\section{О службах и процессах}
|
||||||
|
\label{sec:cgls}
|
||||||
|
|
||||||
В большинстве современных Linux-систем количество одновременно работающих
|
В большинстве современных Linux-систем количество одновременно работающих
|
||||||
процессов обычно весьма значительно. Понять, откуда взялся и что делает тот
|
процессов обычно весьма значительно. Понять, откуда взялся и что делает тот
|
||||||
или иной процесс, становится все сложнее и сложнее. Многие службы используют
|
или иной процесс, становится все сложнее и сложнее. Многие службы используют
|
||||||
@@ -3341,6 +3349,7 @@ StartLimitAction=reboot-force
|
|||||||
заслуга реализации сторожевого контроля в systemd.
|
заслуга реализации сторожевого контроля в systemd.
|
||||||
|
|
||||||
\section{Запуск getty на последовательных (и не~только) консолях}
|
\section{Запуск getty на последовательных (и не~только) консолях}
|
||||||
|
\label{sec:getty}
|
||||||
|
|
||||||
\emph{Если вам лень читать всю статью целиком: для запуска getty на
|
\emph{Если вам лень читать всю статью целиком: для запуска getty на
|
||||||
последовательной консоли\footnote{Прим. перев.: Здесь и в дальнейшем автор
|
последовательной консоли\footnote{Прим. перев.: Здесь и в дальнейшем автор
|
||||||
@@ -3488,15 +3497,15 @@ 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{Прим. перев.: На самом деле, работать с символьными
|
daemon-reload}.}\footnote{\label{ftn:enableserial}Прим. перев.: На самом деле,
|
||||||
ссылками придется даже в современных версиях systemd (на момент написания этих
|
работать с символьными ссылками придется даже в современных версиях systemd (на
|
||||||
строк, последней является версия 202), так как разработчики забыли включить в
|
момент написания этих строк, последней является версия 204), так как
|
||||||
файл +serial-getty@.service+ секцию +[Install]+, в результате чего попытка
|
разработчики забыли включить в файл +serial-getty@.service+ секцию +[Install]+,
|
||||||
выполнения +systemctl enable+ для экземпляра соответствующей службы ведет к
|
в результате чего попытка выполнения +systemctl enable+ для экземпляра
|
||||||
закономерной ошибке. Впрочем, исправить это несложно: достаточно скопировать
|
соответствующей службы ведет к закономерной ошибке. Впрочем, исправить это
|
||||||
данный файл в +/etc/systemd/system/+, после чего дописать в него секцию
|
несложно: достаточно скопировать данный файл в +/etc/systemd/system/+, после
|
||||||
+[Install]+ с параметром +WantedBy=getty.target+, а затем выполнить
|
чего дописать в него секцию +[Install]+ с параметром +WantedBy=getty.target+, а
|
||||||
+systemctl daemon-reload+.}:
|
затем выполнить +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
|
||||||
@@ -4612,6 +4621,279 @@ systemd, начиная с версии 197. Тем не~менее, наша р
|
|||||||
|
|
||||||
\appendix
|
\appendix
|
||||||
|
|
||||||
|
\section{FAQ (часто задаваемые вопросы)\sfnote{Перевод статьи
|
||||||
|
<<\href{http://www.freedesktop.org/wiki/Software/systemd/FrequentlyAskedQuestions}%
|
||||||
|
{Frequently Asked Questions}>> с официального сайта проекта, по состоянию на
|
||||||
|
2013-01-15 16:59:29 (ревизия \No29).}}
|
||||||
|
|
||||||
|
Также смотрите статью
|
||||||
|
\href{http://www.freedesktop.org/wiki/Software/systemd/TipsAndTricks}{Tips \&
|
||||||
|
Tricks}\footnote{Прим. перев.: На самом деле, смотреть там особо не~на что.
|
||||||
|
Б\'{о}льшая часть приведенного там материала вполне соответствует формату FAQ, и
|
||||||
|
поэтому была перенесена в текущую главу. Исключением являются только
|
||||||
|
<<cgroup tree>> и <<ps with cgroups>>, но они подробно рассмотрены в
|
||||||
|
главе~\ref{sec:cgls}.}.
|
||||||
|
|
||||||
|
\qna{Как изменить текущий уровень выполнения (runlevel)?}
|
||||||
|
В systemd уровни выполнения оформлены в виде целевых состояний (target units).
|
||||||
|
Команда перехода в заданное состояние выглядит так:
|
||||||
|
\begin{Verbatim}
|
||||||
|
# systemctl isolate runlevel5.target
|
||||||
|
\end{Verbatim}
|
||||||
|
|
||||||
|
Отметим, что концепция уровней исполнения уже порядком устарела, и вместо
|
||||||
|
номеров уровней удобнее оперировать более выразительными именами целевых
|
||||||
|
состояний:
|
||||||
|
\begin{Verbatim}
|
||||||
|
# systemctl isolate graphical.target
|
||||||
|
\end{Verbatim}
|
||||||
|
|
||||||
|
Подобные команды изменят только текущий уровень выполнения. Их действие никак
|
||||||
|
не~повлияет на последующие загрузки системы.
|
||||||
|
|
||||||
|
\qna{Как изменить уровень выполнения, в который система грузится по умолчанию?}
|
||||||
|
Соответствующее целевое состояние задается символьной ссылкой
|
||||||
|
+/etc/systemd/system/default.target+. Для его смены достаточно перезаписать эту
|
||||||
|
ссылку. Например, так:
|
||||||
|
\begin{Verbatim}
|
||||||
|
# ln -sf /usr/lib/systemd/system/multi-user.target /etc/systemd/system/default.target
|
||||||
|
\end{Verbatim}
|
||||||
|
или так
|
||||||
|
\begin{Verbatim}
|
||||||
|
# ln -sf /usr/lib/systemd/system/graphical.target /etc/systemd/system/default.target
|
||||||
|
\end{Verbatim}
|
||||||
|
|
||||||
|
\qna{Как узнать текущий уровень выполнения?}
|
||||||
|
В один и тот же момент времени может быть активно несколько целевых состояний,
|
||||||
|
поэтому понятие текущего уровня выполнения (единственного и однозначно
|
||||||
|
определенного) применимо уже далеко не~всегда. Узнать, какие состояния сейчас
|
||||||
|
активны, вы можете при помощи команды
|
||||||
|
\begin{Verbatim}
|
||||||
|
$ systemctl list-units --type=target
|
||||||
|
\end{Verbatim}
|
||||||
|
|
||||||
|
Если вам нужна именно одна цифра, вы можете воспользоваться классической
|
||||||
|
командой +runlevel+, однако, по изложенным выше причинам, она далеко не~всегда
|
||||||
|
способна адекватно оценить текущую ситуацию.
|
||||||
|
|
||||||
|
\qna{Я изменил service-файл, но пакетный менеджер перезаписывает мои изменения
|
||||||
|
при каждом обновлении. Что делать?}
|
||||||
|
Наиболее разумным решением будет скопировать исходный файл из
|
||||||
|
+/usr/lib/systemd/system+ в +/etc/systemd/system+ и внести изменения в
|
||||||
|
полученную копию. Юнит-файлы из +/etc+ защищены от посягательств пакетного
|
||||||
|
менеджера, и при этом имеют приоритет над файлами из +/usr+. Если же вы захотите
|
||||||
|
вернуться к настройкам по умолчанию, достаточно будет просто удалить или
|
||||||
|
переименовать созданный вами файл\footnote{Прим. перев.: Начиная с версии
|
||||||
|
systemd 198, необязательно копировать файл целиком, если вы хотите
|
||||||
|
добавить/изменить отдельные настройки. Можно просто создать в
|
||||||
|
+/etc/systemd/system/+ подкаталог +имя_службы.service.d+, а в нем~--- файл с
|
||||||
|
именем, заканчивающимся на +.conf+, например, +mysettings.conf+, после чего
|
||||||
|
вписать в этот файл необходимые настройки. Они будут применены <<поверх>>
|
||||||
|
настроек из штатного файла (расположенного в +/usr+).}.
|
||||||
|
|
||||||
|
\qna{Служба \texttt{foo.service} по умолчанию запускается только при поступлении
|
||||||
|
входящего соединения (или подключении определенного оборудования, или при
|
||||||
|
появлении заданного файла). Как сделать так, чтобы она запускалась сразу при
|
||||||
|
загрузке?}
|
||||||
|
Достаточно поместить символьную ссылку на соответствующий service-файл в каталог
|
||||||
|
+multi-user.target.wants/+.
|
||||||
|
\begin{Verbatim}
|
||||||
|
# ln -sf /usr/lib/systemd/system/foobar.service \
|
||||||
|
> /etc/systemd/system/multi-user.target.wants/foobar.service
|
||||||
|
# systemctl daemon-reload
|
||||||
|
\end{Verbatim}
|
||||||
|
|
||||||
|
В это каталоге содержатся ссылки на все юниты, которые нужно запустить в
|
||||||
|
состоянии multi-user (эквивалент уровня выполнения 3, т.е. загрузка с запуском
|
||||||
|
всех служб, но не~графического интерфейса). Так как цель +graphical.target+
|
||||||
|
тянет по зависимости и +multi-user.target+, то ваша служба будет запущена также
|
||||||
|
и при <<графических>> загрузках.
|
||||||
|
|
||||||
|
\qna{Я хочу запустить еще один экземпляр getty, как это сделать?}
|
||||||
|
Для запуска getty на последовательном порту, достаточно запустить
|
||||||
|
соответствующий экземпляр службы +serial-getty@.service+:
|
||||||
|
\begin{Verbatim}
|
||||||
|
# systemctl start serial-getty@ttyS2.service
|
||||||
|
\end{Verbatim}
|
||||||
|
|
||||||
|
Чтобы обеспечить автоматически запуск getty на этом порту при каждой загрузке,
|
||||||
|
нужно поместить соответствующую символьную ссылку в каталог
|
||||||
|
+getty.target.wants/+\footnote{Прим. перев.: Приведенная в оригинале команда
|
||||||
|
+systemctl enable serial-getty@ttyS2.service+ работать не~будет (по крайней
|
||||||
|
мере, в версиях до 204 включительно). Подробнее
|
||||||
|
см.~примечание~\ref{ftn:enableserial}.}:
|
||||||
|
\begin{Verbatim}
|
||||||
|
# ln -s /usr/lib/systemd/system/serial-getty@.service \
|
||||||
|
> /etc/systemd/system/getty.target.wants/serial-getty@ttyS2.service
|
||||||
|
# systemctl daemon-reload
|
||||||
|
\end{Verbatim}
|
||||||
|
|
||||||
|
Обратите внимание, что на виртуальных терминалах getty запускаются
|
||||||
|
автоматически, как только пользователь переключается на данный терминал.
|
||||||
|
Максимальное количество таких терминалов задается параметром +NAutoVTs=+ в файле
|
||||||
|
\href{http://www.freedesktop.org/software/systemd/man/logind.html}%
|
||||||
|
{logind.conf(7)}. Также см. главу~\ref{sec:getty}.
|
||||||
|
|
||||||
|
\qna{Как узнать, какой службе принадлежат вот эти процессы?}
|
||||||
|
Для этого можно воспользоваться командой +ps+
|
||||||
|
\begin{Verbatim}[fontsize=\small]
|
||||||
|
$ alias psc='ps xawf -eo pid,user,cgroup,args'
|
||||||
|
$ psc
|
||||||
|
PID USER CGROUP COMMAND
|
||||||
|
...
|
||||||
|
1 root name=systemd:/systemd-1 /bin/systemd systemd.log_target=kmsg systemd.log_level=debug selinux=0
|
||||||
|
415 root name=systemd:/systemd-1/sysinit.service /sbin/udevd -d
|
||||||
|
928 root name=systemd:/systemd-1/atd.service /usr/sbin/atd -f
|
||||||
|
930 root name=systemd:/systemd-1/ntpd.service /usr/sbin/ntpd -n
|
||||||
|
932 root name=systemd:/systemd-1/crond.service /usr/sbin/crond -n
|
||||||
|
935 root name=systemd:/systemd-1/auditd.service /sbin/auditd -n
|
||||||
|
943 root name=systemd:/systemd-1/auditd.service \_ /sbin/audispd
|
||||||
|
964 root name=systemd:/systemd-1/auditd.service \_ /usr/sbin/sedispatch
|
||||||
|
937 root name=systemd:/systemd-1/acpid.service /usr/sbin/acpid -f
|
||||||
|
941 rpc name=systemd:/systemd-1/rpcbind.service /sbin/rpcbind -f
|
||||||
|
944 root name=systemd:/systemd-1/rsyslog.service /sbin/rsyslogd -n -c 4
|
||||||
|
947 root name=systemd:/systemd-1/systemd-logger.service /lib/systemd/systemd-logger
|
||||||
|
950 root name=systemd:/systemd-1/cups.service /usr/sbin/cupsd -f
|
||||||
|
955 dbus name=systemd:/systemd-1/messagebus.service /bin/dbus-daemon --system --address=systemd: --nofork --systemd-activation
|
||||||
|
969 root name=systemd:/systemd-1/getty@.service/tty6 /sbin/mingetty tty6
|
||||||
|
970 root name=systemd:/systemd-1/getty@.service/tty5 /sbin/mingetty tty5
|
||||||
|
971 root name=systemd:/systemd-1/getty@.service/tty1 /sbin/mingetty tty1
|
||||||
|
973 root name=systemd:/systemd-1/getty@.service/tty4 /sbin/mingetty tty4
|
||||||
|
974 root name=systemd:/user/lennart/2 login -- lennart
|
||||||
|
1824 lennart name=systemd:/user/lennart/2 \_ -bash
|
||||||
|
975 root name=systemd:/systemd-1/getty@.service/tty3 /sbin/mingetty tty3
|
||||||
|
988 root name=systemd:/systemd-1/polkitd.service /usr/libexec/polkit-1/polkitd
|
||||||
|
994 rtkit name=systemd:/systemd-1/rtkit-daemon.service /usr/libexec/rtkit-daemon
|
||||||
|
...
|
||||||
|
\end{Verbatim}
|
||||||
|
или просто посмотреть \verb+/proc/$PID/cgroup+. Также см. главу~\ref{sec:cgls}.
|
||||||
|
|
||||||
|
\qna{Почему вы не~используете inotify для отслеживания изменений в настройках?}
|
||||||
|
К сожалению, реализовать это весьма проблематично. За подробностями вы можете
|
||||||
|
обратиться к обсуждению в
|
||||||
|
\href{https://bugzilla.redhat.com/show_bug.cgi?id=615527}{bugzilla}\footnote{Прим.
|
||||||
|
перев.: Вкратце, суть проблемы состоит в том, что перемещение/переименование
|
||||||
|
файла не~является атомарной операцией, а состоит из удаления одного файла и
|
||||||
|
создания другого. Эти операции могут следовать в произвольном порядке с
|
||||||
|
некоторым интервалом, что может привести к временному исчезновению службы, либо
|
||||||
|
к появлению двух конфликтующих служб.}.
|
||||||
|
|
||||||
|
\qna{У моей службы есть как штатный service-файл, так и init-скрипт (с тем же
|
||||||
|
именем). Какой из этих файлов главнее~---
|
||||||
|
\texttt{/usr/lib/systemd/system/foobar.service} или
|
||||||
|
\texttt{/etc/init.d/foobar}?}
|
||||||
|
При наличии обоих этих файлов, приоритет всегда отдается штатному service-файлу,
|
||||||
|
независимо от того, включен ли запуск соответствующего скрипта (например, через
|
||||||
|
+chkconfig+) или нет. Обратите внимание, что отключение юнит-файла (в частности,
|
||||||
|
через +systemctl disable+) приведет к полному отключению службы, даже если
|
||||||
|
init-скрипт при этом будет включен.
|
||||||
|
|
||||||
|
\qna{Как заставить \texttt{journalctl} выводить полные (не~сокращенные) строки?}
|
||||||
|
Используйте
|
||||||
|
\begin{Verbatim}
|
||||||
|
# journalctl --full
|
||||||
|
\end{Verbatim}
|
||||||
|
|
||||||
|
\qna{Моя служба пытается получить приоритет реального времени, но получает
|
||||||
|
ошибку EPERM, хотя обладает всеми необходимыми привилегиями. А без вашего
|
||||||
|
systemd все работало!}
|
||||||
|
По умолчанию, systemd помещает каждую системную службу в собственную контрольную
|
||||||
|
группу контроллера +cpu+. К сожалению, из-за существующего в реализации данного
|
||||||
|
контроллера ограничения, это приводит к невозможности получения приоритета
|
||||||
|
реального времени для служб. Подробное обсуждение этой проблемы и методы ее
|
||||||
|
решения смотрите в приложении~\ref{sec:realtime}.
|
||||||
|
|
||||||
|
\qna{Моя служба настроена на запуск после \texttt{network.target}, однако она
|
||||||
|
все равно запускается раньше, чем появляется сеть. Почему?}
|
||||||
|
Это длинная история. См. приложение~\ref{sec:networktarget}.
|
||||||
|
|
||||||
|
\qna{systemd монтирует в \texttt{/tmp} \texttt{tmpfs}. Как это отключить?}
|
||||||
|
Это тоже долгая история. См. приложения~\ref{sec:apifs}.
|
||||||
|
|
||||||
|
\qna{Как просмотреть список работающих служб?}
|
||||||
|
Запустите команду +systemctl+ без параметров\footnote{Прим. перев.: +systemctl+
|
||||||
|
без параметров выведет состояние всех активных юнитов (в т.ч. сокетов,
|
||||||
|
устройств, точек монтирования, целевых состояний, таймеров, и т.д.). Чтобы
|
||||||
|
ограничиться только службами, добавьте параметр +-t service+. Чтобы вывести все
|
||||||
|
службы/юниты, включая неактивные, добавьте параметр +-a+.}:
|
||||||
|
\begin{Verbatim}[fontsize=\small]
|
||||||
|
$ systemctl
|
||||||
|
UNIT LOAD ACTIVE SUB JOB DESCRIPTION
|
||||||
|
accounts-daemon.service loaded active running Accounts Service
|
||||||
|
atd.service loaded active running Job spooling tools
|
||||||
|
avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
|
||||||
|
bluetooth.service loaded active running Bluetooth Manager
|
||||||
|
colord-sane.service loaded active running Daemon for monitoring attached scanners and registering them with colord
|
||||||
|
colord.service loaded active running Manage, Install and Generate Color Profiles
|
||||||
|
crond.service loaded active running Command Scheduler
|
||||||
|
cups.service loaded active running CUPS Printing Service
|
||||||
|
dbus.service loaded active running D-Bus System Message Bus
|
||||||
|
...
|
||||||
|
\end{Verbatim}
|
||||||
|
|
||||||
|
\qna{Как узнать текущее состояние службы?}
|
||||||
|
Воспользуйтесь командой +systemctl status+:
|
||||||
|
\begin{Verbatim}[fontsize=\small]
|
||||||
|
$ systemctl status udisks2.service
|
||||||
|
udisks2.service - Storage Daemon
|
||||||
|
Loaded: loaded (/usr/lib/systemd/system/udisks2.service; static)
|
||||||
|
Active: active (running) since Wed, 27 Jun 2012 20:49:25 +0200; 1 day and 1h ago
|
||||||
|
Main PID: 615 (udisksd)
|
||||||
|
CGroup: name=systemd:/system/udisks2.service
|
||||||
|
└ 615 /usr/lib/udisks2/udisksd --no-debug
|
||||||
|
|
||||||
|
Jun 27 20:49:25 epsilon udisksd[615]: udisks daemon version 1.94.0 starting
|
||||||
|
Jun 27 20:49:25 epsilon udisksd[615]: Acquired the name org.freedesktop.UDisks2 on the system message bus
|
||||||
|
\end{Verbatim}
|
||||||
|
|
||||||
|
\qna{Как отследить зависимости между юнитами?}
|
||||||
|
Допустим, вы хотите узнать, какие юниты будут запущены при активации
|
||||||
|
+multi-user.target+:
|
||||||
|
\begin{Verbatim}
|
||||||
|
$ systemctl show -p "Wants" multi-user.target
|
||||||
|
Wants=rc-local.service avahi-daemon.service rpcbind.service
|
||||||
|
NetworkManager.service acpid.service dbus.service atd.service crond.service
|
||||||
|
auditd.service ntpd.service udisks.service bluetooth.service cups.service
|
||||||
|
wpa_supplicant.service getty.target modem-manager.service portreserve.service
|
||||||
|
abrtd.service yum-updatesd.service upowerd.service test-first.service
|
||||||
|
pcscd.service rsyslog.service haldaemon.service remote-fs.target
|
||||||
|
plymouth-quit.service systemd-update-utmp-runlevel.service sendmail.service
|
||||||
|
lvm2-monitor.service cpuspeed.service udev-post.service mdmonitor.service
|
||||||
|
iscsid.service livesys.service livesys-late.service irqbalance.service
|
||||||
|
iscsi.service netfs.service
|
||||||
|
\end{Verbatim}
|
||||||
|
|
||||||
|
Вместо +Wants+ вы можете использовать другие типы зависимостей: +WantedBy+,
|
||||||
|
+Requires+, +RequiredBy+, +Conflicts+, +ConflictedBy+, +Before+,
|
||||||
|
+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{Как узнать, что будет запущено при загрузке системы в заданное целевое
|
||||||
|
состояние?}
|
||||||
|
Вы можете заставить systemd рассчитать <<начальную>> транзакцию, определяющую
|
||||||
|
алгоритм загрузки в заданное состояние +foobar.target+:
|
||||||
|
\begin{Verbatim}
|
||||||
|
$ systemd --test --system --unit=foobar.target
|
||||||
|
\end{Verbatim}
|
||||||
|
|
||||||
|
Обратите внимание, что эта команда предназначена исключительно для отладки, и ее
|
||||||
|
работа на самом деле не~ограничивается расчетом транзакции, поэтому не~стоит
|
||||||
|
вызывать ее в скриптах.
|
||||||
|
|
||||||
\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-01-08
|
systemd Problems}>> с официального сайта проекта, по состоянию на 2013-01-08
|
||||||
@@ -4627,7 +4909,7 @@ systemd Problems}>> с официального сайта проекта, по
|
|||||||
\begin{Verbatim}[commandchars=\\\{\}]
|
\begin{Verbatim}[commandchars=\\\{\}]
|
||||||
Welcome to \textcolor{blue}{Fedora \emph{ВЕРСИЯ} (\emph{имя релиза})}!
|
Welcome to \textcolor{blue}{Fedora \emph{ВЕРСИЯ} (\emph{имя релиза})}!
|
||||||
Starting \emph{название}...
|
Starting \emph{название}...
|
||||||
[ \textcolor{green}{OK} ] Stared \emph{название}...
|
[ \textcolor{dgreen}{OK} ] Stared \emph{название}...
|
||||||
\end{Verbatim}
|
\end{Verbatim}
|
||||||
(Пример можно посмотреть на
|
(Пример можно посмотреть на
|
||||||
\href{http://freedesktop.org/wiki/Software/systemd/Debugging?action=AttachFile&do=view&target=f17boot.png}{скриншоте}.)
|
\href{http://freedesktop.org/wiki/Software/systemd/Debugging?action=AttachFile&do=view&target=f17boot.png}{скриншоте}.)
|
||||||
@@ -4635,13 +4917,12 @@ Welcome to \textcolor{blue}{Fedora \emph{ВЕРСИЯ} (\emph{имя релиз
|
|||||||
Если у вас есть доступ к оболочке, это значительно упрощает диагностику и
|
Если у вас есть доступ к оболочке, это значительно упрощает диагностику и
|
||||||
решение проблем. В том случае, когда до приглашения входа в систему дело так и
|
решение проблем. В том случае, когда до приглашения входа в систему дело так и
|
||||||
не~доходит, попробуйте переключиться на другую виртуальную консоль, нажав
|
не~доходит, попробуйте переключиться на другую виртуальную консоль, нажав
|
||||||
CTRL--ALT--F<\emph{цифра}>. Дело в том, что при проблемах, связанных с запуском
|
CTRL--ALT--F<\emph{цифра}>. При проблемах, связанных с запуском X-сервера, может
|
||||||
X-сервера, может возникать ситуация, когда на первой консоли (+tty1+)
|
возникать ситуация, когда на первой консоли (+tty1+) приглашение ко входу
|
||||||
приглашение ко входу отсутствует, но все остальные консоли при этом работают
|
отсутствует, но все остальные консоли при этом работают нормально.
|
||||||
нормально.
|
|
||||||
|
|
||||||
Если ни~на одной из виртуальных консолей приглашение так и не~появилось~---
|
Если ни~на одной из виртуальных консолей приглашение так и не~появилось~---
|
||||||
попробуйте выждать еще \emph{порядка 5 минут}. Только после этого можно
|
попробуйте выждать еще \emph{не~менее 5 минут}. Только после этого можно
|
||||||
будет считать процесс загрузки окончательно зависшим. Если подвисание
|
будет считать процесс загрузки окончательно зависшим. Если подвисание
|
||||||
обусловлено всего лишь сбоем при запуске какой-то службы, то после истечения
|
обусловлено всего лишь сбоем при запуске какой-то службы, то после истечения
|
||||||
тайм-аута проблемная служба будет убита, и загрузка продолжится. Другой
|
тайм-аута проблемная служба будет убита, и загрузка продолжится. Другой
|
||||||
@@ -4672,7 +4953,22 @@ X-сервера, может возникать ситуация, когда н
|
|||||||
на последовательную консоль: меню Вид (View)~$\Rightarrow$ Текстовые
|
на последовательную консоль: меню Вид (View)~$\Rightarrow$ Текстовые
|
||||||
консоли (Text Consoles)), вы можете попросить systemd выводить на эту
|
консоли (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}
|
\begin{Verbatim}
|
||||||
systemd.log_level=debug systemd.log_target=console console=ttyS0,38400
|
systemd.log_level=debug systemd.log_target=console console=ttyS0,38400
|
||||||
\end{Verbatim}
|
\end{Verbatim}
|
||||||
@@ -4728,8 +5024,8 @@ systemctl enable debug-shell.service
|
|||||||
на +/bin/bash+.
|
на +/bin/bash+.
|
||||||
|
|
||||||
\textbf{Совет:} Если вы не~можете воспользоваться командой +systemctl+
|
\textbf{Совет:} Если вы не~можете воспользоваться командой +systemctl+
|
||||||
(например, загрузились с помощью другой операционной системы), вы можете
|
(например, загрузились с помощью другой операционной системы),
|
||||||
выполнить соответствующие действия и напрямую:
|
выполните соответствующие действия напрямую:
|
||||||
\begin{Verbatim}
|
\begin{Verbatim}
|
||||||
cd $ПУТЬ_К_ВАШЕМУ_КОРНЮ/etc/systemd/system
|
cd $ПУТЬ_К_ВАШЕМУ_КОРНЮ/etc/systemd/system
|
||||||
mkdir -p sysinit.target.wants
|
mkdir -p sysinit.target.wants
|
||||||
@@ -4759,6 +5055,7 @@ ln -s /lib/systemd/system/debug-shell.service sysinit.target.wants/
|
|||||||
\end{description}
|
\end{description}
|
||||||
|
|
||||||
\subsubsection{Если у вас есть доступ к оболочке}
|
\subsubsection{Если у вас есть доступ к оболочке}
|
||||||
|
\label{sssec:kmsg}
|
||||||
|
|
||||||
Если вам все-таки удалось получить доступ к оболочке системы, вы можете
|
Если вам все-таки удалось получить доступ к оболочке системы, вы можете
|
||||||
воспользоваться ею для сбора диагностической информации. Загрузите систему со
|
воспользоваться ею для сбора диагностической информации. Загрузите систему со
|
||||||
@@ -4833,7 +5130,9 @@ mount -o remount,ro /
|
|||||||
собрать диагностическую информацию другими методами (которые мы уже
|
собрать диагностическую информацию другими методами (которые мы уже
|
||||||
рассматривали применительно к проблемам загрузки):
|
рассматривали применительно к проблемам загрузки):
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Используйте \hyperlink{it:serial}{последовательную консоль}.
|
\item Используйте \hyperlink{it:serial}{последовательную
|
||||||
|
консоль}\footnote{Прим. перев.: Здесь опять же стоит напомнить
|
||||||
|
про +netconsole+ (см. примечание~\ref{ftn:netconsole}).}.
|
||||||
\item Воспользуйтесь \hyperlink{it:dbgshell}{отладочной оболочкой}~---
|
\item Воспользуйтесь \hyperlink{it:dbgshell}{отладочной оболочкой}~---
|
||||||
она полезна не~только на ранних стадиях загрузки, но и на
|
она полезна не~только на ранних стадиях загрузки, но и на
|
||||||
поздних стадиях остановки системы.
|
поздних стадиях остановки системы.
|
||||||
@@ -4883,7 +5182,7 @@ May 11 20:26:23 scratch foo[1329]: Failed to parse config
|
|||||||
|
|
||||||
\subsection{Подготовка сообщений об ошибках}
|
\subsection{Подготовка сообщений об ошибках}
|
||||||
|
|
||||||
Если вы собираетесь отправить сообщение об ошибке в systemd, пожалуйста,
|
Если вы собираетесь отправить сообщение об ошибке systemd, пожалуйста,
|
||||||
включите в него диагностическую информацию, в частности, содержимое системных
|
включите в него диагностическую информацию, в частности, содержимое системных
|
||||||
журналов. Журналы должны быть полными (без вырезок), не~заархивированными, с
|
журналов. Журналы должны быть полными (без вырезок), не~заархивированными, с
|
||||||
MIME-типом +text/plain+.
|
MIME-типом +text/plain+.
|
||||||
@@ -4925,6 +5224,142 @@ systemctl dump > systemd-dump.txt
|
|||||||
\end{Verbatim}
|
\end{Verbatim}
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
|
\section{Совместимость с SysV\sfnote{Перевод статьи
|
||||||
|
<<\href{http://www.freedesktop.org/wiki/Software/systemd/Incompatibilities}%
|
||||||
|
{Compatibility with SysV}>> с официального сайта проекта, по
|
||||||
|
состоянию на 2013-01-11 19:04:14 (ревизия \No26).}}
|
||||||
|
|
||||||
|
systemd обеспечивает высокий уровень совместимости с поведением классической
|
||||||
|
системы инициализации SysV init, реализованной во многих дистрибутивах. Это
|
||||||
|
касается как непосредственного взаимодействия с пользователем, так и поддержки
|
||||||
|
API для скриптов. Тем не~менее, существует ряд ограничений, обусловленных
|
||||||
|
техническими соображениями, а также особенностями дизайна systemd и/или
|
||||||
|
дистрибутивов. Ниже приведен список таких ограничений. Б\'{о}льшая их часть
|
||||||
|
затрагивает дистрибутивно-специфичные расширения SysV init, и поэтому будет
|
||||||
|
ощутима только для пользователей отдельных дистрибутивов.
|
||||||
|
\begin{itemize}
|
||||||
|
\item Если разработчики вашего дистрибутива отказались от SysV
|
||||||
|
init-скрипта в пользу штатного юнит-файла, прямой вызов этого
|
||||||
|
скрипта (например, +/etc/init.d/foobar start+), очевидно,
|
||||||
|
работать не~будет. Лучше воспользоваться стандартной и
|
||||||
|
универсальной командой +/sbin/service foobar start+, которая
|
||||||
|
одинаково хорошо работает как с systemd, так и с SysV init.
|
||||||
|
Отметим, что прямое обращение к скрипту в любом случае не~вполне
|
||||||
|
корректно, так как запущенная служба унаследует часть контекста
|
||||||
|
выполнения (переменные окружения, umask, ограничения по
|
||||||
|
ресурсам, идентификаторы аудита, и т.д.) от пользовательской
|
||||||
|
оболочки, из которой был запущен скрипт. Вызов скрипта через
|
||||||
|
+/sbin/service+ исправляет этот недостаток, пусть и частично.
|
||||||
|
Кроме того, стоит заметить, что стандарт LSB предписывает
|
||||||
|
обращаться к службам только через +/sbin/service+.
|
||||||
|
(Вышеуказанное ограничение \emph{не}~распространяется на
|
||||||
|
дистрибутивы, которые одновременно поддерживают и init-скрипты,
|
||||||
|
и юнит-файлы. В таких дистрибутивах даже прямое обращение к
|
||||||
|
скрипту при необходимости будет преобразовано в соответствующий
|
||||||
|
запрос к systemd\footnote{Прим. перев.: Такое поведение
|
||||||
|
задают разработчики дистрибутива, при помощи
|
||||||
|
корректировки файла, содержащего стандартные функции для
|
||||||
|
init-скриптов (например, +/etc/rc.d/init.d/functions+ в
|
||||||
|
Fedora или +/etc/rc.status+ в openSUSE). Этот файл
|
||||||
|
вызывается практически из всех init-скриптов в самом начале их
|
||||||
|
работы.}.)
|
||||||
|
\item Информация о зависимостях служб, прописанная в LSB-заголовке
|
||||||
|
скрипта, играет существенную роль. Большинство реализаций SysV
|
||||||
|
в различных дистрибутивах практически не~используют эту
|
||||||
|
информацию, либо используют ее очень ограниченно. Вследствие
|
||||||
|
этого, информацию о зависимостях часто указывали некорректно
|
||||||
|
или не~полностью. В отличие от подобных реализаций, systemd
|
||||||
|
интерпретирует эти заголовки корректно, и использует
|
||||||
|
содержащуюся в них информацию при выполнении различных операций
|
||||||
|
со службами (а не~только в момент их установки, как это делают
|
||||||
|
некоторые другие реализации SysV\footnote{Прим. перев.:
|
||||||
|
Например, +insserv+, используемый как дополнение к SysV init в
|
||||||
|
Debian (а ранее и в openSUSE).}).
|
||||||
|
\item Все операции со скриптами ограничены по времени при помощи
|
||||||
|
тайм-аутов. В отличие от классических SysV-систем, где зависший
|
||||||
|
init-скрипт полностью останавливает загрузку, systemd
|
||||||
|
ограничивает максимальную длительность работы скрипта пятью
|
||||||
|
минутами.
|
||||||
|
\item Службы запускаются в совершенно чистом контексте исполнения.
|
||||||
|
Они уже не~наследуют контекст у оболочки, из которой был вызван
|
||||||
|
их скрипт. В частности, это касается специфических переменных,
|
||||||
|
таких как \verb+$HOME+. Как следствие, скрипты, их использующие,
|
||||||
|
не~смогут работать корректно.
|
||||||
|
\item Службы и их скрипты не~могут читать с STDIN~--- для них этот поток
|
||||||
|
подключен к +/dev/null+. Следовательно, интерактивные
|
||||||
|
init-скрипты не~поддерживаются (в частности, игнорируется
|
||||||
|
используемый в LSB-заголовках скриптов Debian флаг
|
||||||
|
+X-Interactive+). К счастью, большинство дистрибутивов все равно
|
||||||
|
не~поддерживало интерактивные init-скрипты. Если вашему скрипту
|
||||||
|
нужно запросить пароль для зашифрованного диска или
|
||||||
|
SSL-ключа, вы можете воспользоваться для этого специальным
|
||||||
|
механизмом, предоставляемым systemd (см.
|
||||||
|
\href{http://www.freedesktop.org/wiki/Software/systemd/PasswordAgents}%
|
||||||
|
{описание} и
|
||||||
|
\href{http://www.freedesktop.org/software/systemd/man/systemd-ask-password.html}%
|
||||||
|
{страницу руководства}).
|
||||||
|
\item Дополнительные команды для init-скриптов (кроме стандартных,
|
||||||
|
таких, как +start+, +stop+, +status+, +restart+, +reload+,
|
||||||
|
+try-restart+, +force-reload+\footnote{Прим. перев.: Точный
|
||||||
|
список <<стандартных>> команд для SysV init-скриптов зависит от
|
||||||
|
используемого дистрибутива. Так уж исторически сложилось, что
|
||||||
|
практически каждый дистрибутив использовал собственные стандарты
|
||||||
|
интерфейсов SysV init. Это отразилось и на <<заглушках>>,
|
||||||
|
используемых для обратной совместимости. Выше приведен список
|
||||||
|
команд, которые поддерживаются как в Fedora, так и в openSUSE.})
|
||||||
|
не~поддерживаются\footnote{Прим. перев.: В частности, это
|
||||||
|
ограничение касается специфичных для init-скрипта
|
||||||
|
+/etc/init.d/iptables+ команд +save+ и +panic+.}.
|
||||||
|
\item Также не~поддерживается возможность указывать после стандартных
|
||||||
|
команд скрипту дополнительные параметры. Такое расширение SysV
|
||||||
|
не~прописано ни~в каких стандартах, и реализация его поддержки
|
||||||
|
была бы весьма проблематичной.
|
||||||
|
\item systemd останавливает только те службы, которые выполняются.
|
||||||
|
Традиционный SysV init при завершении
|
||||||
|
работы системы запускает все скрипты, предписанные +K*+-ссылками
|
||||||
|
для текущего уровня исполнения. systemd в аналогичной ситуации
|
||||||
|
действует более последовательно, и не~пытается остановить те
|
||||||
|
службы, которые не~были запущены.
|
||||||
|
\item Поддержка уровней исполнения (runlevels) в systemd имеет некоторые
|
||||||
|
ограничения. Хотя все уровни исполнения SysV имеют
|
||||||
|
соответствующие им целевые состояния (target units), далеко
|
||||||
|
не~все целевые состояния имеют соответствующие им уровни
|
||||||
|
исполнения. Это обусловлено тем, что механизм целевых состояний
|
||||||
|
отличается гораздо б\'{о}льшей гибкостью и эффективностью,
|
||||||
|
чем система уровней исполнения. Как следствие, в некоторых
|
||||||
|
случаях попытка узнать текущий уровень исполнения (например,
|
||||||
|
при помощи +/sbin/runlevel+) может вернуть просто <<+N+>> (т.е.
|
||||||
|
<<уровень выполнения неизвестен>>), что приведет к нарушению
|
||||||
|
работы скриптов, использующих явную проверку текущего уровня
|
||||||
|
исполнения. Избегайте подобных проверок.
|
||||||
|
\item +/sbin/chkconfig+ и аналогичные программы могут выводить
|
||||||
|
некорректную информацию о состоянии службы (включена/отключена).
|
||||||
|
Они оперируют только init-скриптами, игнорируя штатные
|
||||||
|
юнит-файлы. Кроме того, они опираются на механизм уровней
|
||||||
|
выполнения, который поддерживается не~полностью (см. выше).
|
||||||
|
\item По умолчанию, уровни исполнения 2, 3 и 4 являются эквивалентами
|
||||||
|
целевого состояния +multi-user.target+. Если включить службу на
|
||||||
|
одном из них, то она будет включена и на остальных. Впрочем, это
|
||||||
|
лишь настройка по умолчанию, и ничто не~мешает вам определить их
|
||||||
|
независимо. Тем не~менее, мы рекомендуем отказаться от уровней
|
||||||
|
исполнения в пользу более гибкого механизма целевых состояний
|
||||||
|
systemd.
|
||||||
|
\item Дистрибутивно-специфичные квази-уровни исполнения, используемые
|
||||||
|
для организации запуска скриптов на ранних стадиях загрузки, больше
|
||||||
|
не~поддерживаются\footnote{Прим. перев.: Начиная с версии 196,
|
||||||
|
см. коммит
|
||||||
|
\href{http://cgit.freedesktop.org/systemd/systemd/commit/?id=3cdebc217c42c8529086f2965319b6a48eaaeabe}%
|
||||||
|
{3cdeb} от 16 ноября 2012 г.}. Примерами таких уровней являются
|
||||||
|
+S+ в Debian и +b+ в openSUSE. Разумеется, это никак
|
||||||
|
не~затрагивает поддержку обычных уровней исполнения, которую мы
|
||||||
|
намерены сохранять еще очень долго.
|
||||||
|
\item По умолчанию, SysV-службы не~могут получить приоритет реального
|
||||||
|
времени, даже если располагают полными привилегиями. За
|
||||||
|
подробностями и методами решения обратитесь к
|
||||||
|
приложению~\ref{sec:realtime}.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
|
||||||
\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}>> с официального сайта проекта, по
|
||||||
@@ -4952,7 +5387,7 @@ WLAN, WWAN\footnote{Прим. перев.: WWAN (Wireless Wide Area Network)~---
|
|||||||
идентифицируются как раз по именам.
|
идентифицируются как раз по именам.
|
||||||
|
|
||||||
Существует несколько подходов к решению этой проблемы. В течение многих лет udev
|
Существует несколько подходов к решению этой проблемы. В течение многих лет udev
|
||||||
поддерживал механизм постоянной привязки имен к интерфейсам, на основе
|
поддерживал механизм постоянной привязки имен к интерфейсам на основе
|
||||||
MAC-адресов. Такой подход имел множество недостатков, в том числе: требование
|
MAC-адресов. Такой подход имел множество недостатков, в том числе: требование
|
||||||
доступности корневого каталога на запись (что возможно далеко не~всегда);
|
доступности корневого каталога на запись (что возможно далеко не~всегда);
|
||||||
необходимость внесения изменений в образ системы после загрузки на новом
|
необходимость внесения изменений в образ системы после загрузки на новом
|
||||||
@@ -4969,7 +5404,7 @@ systemd/udev\footnote{Прим. перев.: См. коммит
|
|||||||
{3e214} от 3 апреля 2012 года, в котором, среди прочего, был удален каталог
|
{3e214} от 3 апреля 2012 года, в котором, среди прочего, был удален каталог
|
||||||
+src/udev/src/rule_generator+.}.
|
+src/udev/src/rule_generator+.}.
|
||||||
|
|
||||||
Другая попытка решения обсуждаемой проблемы~--- +biosdevname+, программа,
|
Другая попытка решения обсуждаемой проблемы~--- biosdevname, программа,
|
||||||
формирующая имена интерфейсов на основании их физического расположении на
|
формирующая имена интерфейсов на основании их физического расположении на
|
||||||
материнской плате. Соответствующая информация запрашивается у BIOS. В чем-то
|
материнской плате. Соответствующая информация запрашивается у BIOS. В чем-то
|
||||||
такая схема похожа на ту, которую udev уже давно использует для формирования
|
такая схема похожа на ту, которую udev уже давно использует для формирования
|
||||||
@@ -4998,24 +5433,25 @@ systemd/udev\footnote{Прим. перев.: См. коммит
|
|||||||
различных механизмов именования сетевых интерфейсов, получив в итоге схему,
|
различных механизмов именования сетевых интерфейсов, получив в итоге схему,
|
||||||
похожую на biosdevname, но отличающуюся большей гибкостью и максимально
|
похожую на biosdevname, но отличающуюся большей гибкостью и максимально
|
||||||
приближенную к алгоритмам идентификации устройств, используемым в ядре.
|
приближенную к алгоритмам идентификации устройств, используемым в ядре.
|
||||||
В частности, udev теперь штатно поддерживает следующие механизмы именования
|
В частности, udev теперь штатно поддерживает следующие схемы именования
|
||||||
сетевых интерфейсов:
|
сетевых интерфейсов:
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item Схема именования для устройств, встроенных в материнскую плату (на
|
\item Имена устройств, встроенных в материнскую плату, формируются на
|
||||||
основании информации от EFI/BIOS), например: +eno1+.
|
основании информации от прошивки\footnote{Прим. перев.:
|
||||||
\item Схема именования для устройств, подключенных в слоты PCI Express
|
BIOS, (U)EFI, SPARC Boot PROM, \ldots.}, например: +eno1+.
|
||||||
(также на основании информации от EFI/BIOS), например: +ens1+.
|
\item Имена устройств, подключенных в слоты PCI Express, формируются
|
||||||
\item Схема именования, основанная на физическом расположении точки
|
также на основании информации от прошивки, например: +ens1+.
|
||||||
подключения оборудования, например, +enp2s0+.
|
\item Имена устройств формируются исходя из физического расположении
|
||||||
\item Схема именования на основании MAC-адреса, например,
|
точки подключения оборудования, например, +enp2s0+.
|
||||||
|
\item Имена устройств формируются на основе их MAC-адресов, например,
|
||||||
+enx78e7d1ea46da+.
|
+enx78e7d1ea46da+.
|
||||||
\item Классические, непредсказуемые имена, присвоенные ядром, например,
|
\item Используются классические, непредсказуемые имена, присвоенные
|
||||||
+eth0+.
|
ядром, например, +eth0+.
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
|
|
||||||
По умолчанию, systemd 197 при именовании сетевых интерфейсов последовательно
|
По умолчанию, systemd 197 при именовании сетевых интерфейсов последовательно
|
||||||
пытается применить схемы 1--3 (для первых двух требуется информация от
|
пытается применить схемы 1--3 (для первых двух требуется информация от
|
||||||
EFI/BIOS). Если ни одна из них не~подходит, используется схема 5. Что касается
|
прошивки). Если ни одна из них не~подходит, используется схема 5. Что касается
|
||||||
схемы 4~--- она не~задействована по умолчанию, однако ее можно включить вручную.
|
схемы 4~--- она не~задействована по умолчанию, однако ее можно включить вручную.
|
||||||
|
|
||||||
Вышеописанная комбинированная схема используется лишь \emph{в последнюю
|
Вышеописанная комбинированная схема используется лишь \emph{в последнюю
|
||||||
@@ -5025,7 +5461,7 @@ EFI/BIOS). Если ни одна из них не~подходит, испол
|
|||||||
|
|
||||||
\subsection{Еще раз, что здесь хорошего?}
|
\subsection{Еще раз, что здесь хорошего?}
|
||||||
|
|
||||||
С нашей новой схемой вы получаете:
|
Достоинства нашей новой схемы:
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Имена интерфейсов остаются неизменными после перезагрузок.
|
\item Имена интерфейсов остаются неизменными после перезагрузок.
|
||||||
\item Имена интерфейсов остаются неизменными при добавлении или
|
\item Имена интерфейсов остаются неизменными при добавлении или
|
||||||
@@ -5041,13 +5477,13 @@ EFI/BIOS). Если ни одна из них не~подходит, испол
|
|||||||
устройство.
|
устройство.
|
||||||
\item Изменения в аппаратной конфигурации не~приводят к необходимости
|
\item Изменения в аппаратной конфигурации не~приводят к необходимости
|
||||||
записи в каталог +/etc+.
|
записи в каталог +/etc+.
|
||||||
\item Полная поддержка системам, корень которых доступен только
|
\item Полная поддержка систем, корень которых доступен только
|
||||||
для чтения.
|
для чтения.
|
||||||
\item Схема именования аналогичная той, которая используется
|
\item Логика именования аналогична той, которая используется
|
||||||
udev для формирования стабильных символьных ссылок в каталоге
|
udev для формирования стабильных символьных ссылок в каталоге
|
||||||
+/dev+ (+by-path+).
|
+/dev+ (+by-path+).
|
||||||
\item Работает как на x86, так и на~других архитектурах.
|
\item Работает как на x86, так и на~других архитектурах.
|
||||||
\item Работает одинаково во всех дистрибутивах, использующих на
|
\item Работает одинаково во всех дистрибутивах, использующих
|
||||||
systemd/udev.
|
systemd/udev.
|
||||||
\item От этой схемы очень легко отказаться (см. ниже).
|
\item От этой схемы очень легко отказаться (см. ниже).
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
@@ -5095,8 +5531,8 @@ cp /usr/lib/udev/rules.d/80-net-name-slot.rules /etc/udev/rules.d/80-net-name-sl
|
|||||||
|
|
||||||
\begin{Verbatim}
|
\begin{Verbatim}
|
||||||
Предсказуемые имена сетевых интерфейсов формируются на основании:
|
Предсказуемые имена сетевых интерфейсов формируются на основании:
|
||||||
- индексов встроенных в материнскую плату устройств (по информации EFI/BIOS)
|
- индексов встроенных в материнскую плату устройств (по информации от прошивки)
|
||||||
- индексов hotplug-слотов PCI-E (по информации EFI/BIOS)
|
- индексов hotplug-слотов PCI-E (по информации от прошивки)
|
||||||
- физического расположения точки подключения оборудования
|
- физического расположения точки подключения оборудования
|
||||||
- MAC-адресов
|
- MAC-адресов
|
||||||
|
|
||||||
@@ -5124,7 +5560,7 @@ cp /usr/lib/udev/rules.d/80-net-name-slot.rules /etc/udev/rules.d/80-net-name-sl
|
|||||||
|
|
||||||
Примеры:
|
Примеры:
|
||||||
|
|
||||||
Подключенная к PCI сетевая карта, которая идентифцироуется прошивкой
|
Подключенная к PCI сетевая карта, которая идентифицируется прошивкой
|
||||||
по индексу "1":
|
по индексу "1":
|
||||||
ID_NET_NAME_ONBOARD=eno1
|
ID_NET_NAME_ONBOARD=eno1
|
||||||
ID_NET_NAME_ONBOARD_LABEL=Ethernet Port 1
|
ID_NET_NAME_ONBOARD_LABEL=Ethernet Port 1
|
||||||
@@ -5164,48 +5600,50 @@ Multi-function PCI устройство с двумя портами:
|
|||||||
<<\href{http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems}{API
|
<<\href{http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems}{API
|
||||||
File Systems}>> с официального сайта проекта, по состоянию на 2013-01-17
|
File Systems}>> с официального сайта проекта, по состоянию на 2013-01-17
|
||||||
11:06:59 (ревизия \No14).}}
|
11:06:59 (ревизия \No14).}}
|
||||||
|
\label{sec:apifs}
|
||||||
|
|
||||||
\emph{Итак, вы запустили программу mount(8), и увидели в ее выводе множество
|
\yousaywtfsk{Итак, вы запустили программу mount(8), и увидели в ее выводе
|
||||||
странных файловых систем, не~указанных в /etc/fstab. У вас могут возникнуть
|
множество странных файловых систем, не~указанных в /etc/fstab. У вас могут
|
||||||
вопросы: <<Как их убрать?>> или <<Как задать для них параметры монтирования?>>.}
|
возникнуть вопросы: <<Как их убрать?>> или <<Как задать для них параметры
|
||||||
|
монтирования?>>.}
|
||||||
|
|
||||||
В Linux предусмотрено несколько способов взаимодействия программ из пространства
|
В Linux предусмотрено несколько способов взаимодействия программ из пространства
|
||||||
пользователя с ядром. Наиболее популярными механизмами являются системные вызовы
|
пользователя с ядром. Наиболее популярными механизмами являются системные вызовы
|
||||||
(syscall), интерфейсы Netlink, а также виртуальные файловые системы (ФС), такие,
|
(syscall), интерфейсы Netlink, а также виртуальные файловые системы (ФС), такие,
|
||||||
как +/proc+ и +/sys+. Подобные ФС являются лишь программными интерфейсами, и
|
как +/proc+ и +/sys+. Подобные ФС являются лишь программными интерфейсами, и
|
||||||
не~предоставляют возможности для долговременного хранения данных (в частности,
|
не~обеспечивают долговременного хранения данных (в частности, между
|
||||||
между перезагрузками системы). Они просто используют классические механизмы
|
перезагрузками системы). Они просто используют классические механизмы работы с
|
||||||
работы с файлами для предоставления доступа к различным данным и настройкам.
|
файлами для предоставления доступа к различным данным и настройкам. Кроме того,
|
||||||
Кроме того, существуют специальные ФС, используемые программами для собственных
|
существуют специальные ФС, используемые программами для собственных нужд, в
|
||||||
нужд, в частности, для хранения сегментов разделяемой памяти (shared memory),
|
частности, для хранения сегментов разделяемой памяти (shared memory), временных
|
||||||
временных файлов и сокетов. В данной статье мы обсудим все эти разновидности
|
файлов и сокетов. В данной статье мы обсудим все эти разновидности
|
||||||
\emph{специальных файловых систем}. Ниже представлен список таких ФС,
|
\emph{специальных файловых систем}. Ниже представлен список таких ФС,
|
||||||
поддерживаемых в типовых Linux-системах:
|
поддерживаемых в типовых Linux-системах:
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item +/sys+ предоставляет доступ к драйверам и устройствам, а также
|
\item +/sys+ предоставляет доступ к драйверам и устройствам, а также
|
||||||
некоторым другим параметрам ядра
|
некоторым другим параметрам ядра;
|
||||||
\item +/proc+ дает доступ к информации о выполняемых процессах,
|
\item +/proc+ дает доступ к информации о выполняемых процессах,
|
||||||
настройкам ядра, а также другим параметрам
|
настройкам ядра, а также другим параметрам;
|
||||||
\item +/dev+ отображает файлы устройств (device nodes)
|
\item +/dev+ отображает файлы устройств (device nodes);
|
||||||
\item +/run+ содержит файлы и сокеты, используемые программами
|
\item +/run+ содержит файлы и сокеты, используемые программами;
|
||||||
\item +/tmp+ хранит временные и часто изменяемые объекты (X)
|
\item +/tmp+ хранит временные и часто изменяемые объекты (X);
|
||||||
\item +/sys/fs/cgroup+ (и другие файловые системы, смонтированные в
|
\item +/sys/fs/cgroup+ (и другие файловые системы, смонтированные в
|
||||||
подкаталогах этого каталога) позволяют работать с иерархией
|
подкаталогах этого каталога) позволяют работать с иерархией
|
||||||
контрольных групп
|
контрольных групп;
|
||||||
\item +/sys/kernel/security+, +/sys/kernel/debug+ (X),
|
\item +/sys/kernel/security+, +/sys/kernel/debug+ (X),
|
||||||
+/sys/kernel/config+ (X) предоставляют доступ к
|
+/sys/kernel/config+ (X) предоставляют доступ к
|
||||||
специализированным механизмам ядра
|
специализированным механизмам ядра;
|
||||||
\item +/sys/fs/selinux+ используется для взаимодействия с SELinux
|
\item +/sys/fs/selinux+ используется для взаимодействия с SELinux;
|
||||||
\item +/dev/shm+ содержит объекты разделяемой памяти
|
\item +/dev/shm+ содержит объекты разделяемой памяти;
|
||||||
\item +/dev/pts+ обеспечивает доступ к псевдо-TTY устройствам
|
\item +/dev/pts+ обеспечивает доступ к псевдо-TTY устройствам;
|
||||||
\item +/proc/sys/fs/binfmt_misc+ используется для регистрации в ядре
|
\item +/proc/sys/fs/binfmt_misc+ используется для регистрации в ядре
|
||||||
дополнительных бинарных форматов (X)
|
дополнительных бинарных форматов (X);
|
||||||
\item +/dev/mqueue+ содержит объекты IPC-механизма mqueue (X)
|
\item +/dev/mqueue+ содержит объекты IPC-механизма mqueue (X);
|
||||||
\item +/dev/hugepages+ позволяет программам запрашивать выделение
|
\item +/dev/hugepages+ позволяет программам запрашивать выделение
|
||||||
<<гигантских>> страниц памяти (X)
|
<<гигантских>> страниц памяти (X);
|
||||||
\item +/sys/fs/fuse/connections+ обеспечивает доступ к
|
\item +/sys/fs/fuse/connections+ обеспечивает доступ к
|
||||||
FUSE-соединениям (X)
|
FUSE-соединениям (X);
|
||||||
\item +/sys/firmware/efi/efivars+ предоставляет доступ к переменным EFI
|
\item +/sys/firmware/efi/efivars+ предоставляет доступ к переменным EFI;
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
systemd монтирует все эти файловые системы на ранних стадиях загрузки, даже если
|
systemd монтирует все эти файловые системы на ранних стадиях загрузки, даже если
|
||||||
@@ -5228,20 +5666,20 @@ systemd монтирует все эти файловые системы на р
|
|||||||
укажете, будут автоматически применяться к соответствующим ФС. Проще говоря:
|
укажете, будут автоматически применяться к соответствующим ФС. Проще говоря:
|
||||||
если вам нужно изменить параметры монтирования для специальных ФС, просто
|
если вам нужно изменить параметры монтирования для специальных ФС, просто
|
||||||
добавьте их в +/etc/fstab+ с указанием соответствующих опций. Кроме параметров
|
добавьте их в +/etc/fstab+ с указанием соответствующих опций. Кроме параметров
|
||||||
монтирования, так можно изменить и сам тип файловой системы. В частности, этот
|
монтирования, так можно изменить и сам тип файловой системы (в частности,
|
||||||
способ позволяет переключить +/tmp+ с +tmpfs+ на физический дисковый раздел.
|
перенести +/tmp+ из +tmpfs+ на раздел физического диска).
|
||||||
|
|
||||||
Также вы можете полностью отключить монтирование некоторых (но не~всех)
|
Также вы можете полностью отключить монтирование некоторых (но не~всех)
|
||||||
специальных систем, если это действительно необходимо. Отключаемые ФС в списке
|
специальных систем, если это действительно необходимо. Отключаемые ФС в списке
|
||||||
выше отмечены (X). Для их отключения, достаточно замаскировать соответствующий
|
выше отмечены (X). Для их отключения, достаточно заблокировать (замаскировать)
|
||||||
юнит:
|
соответствующий юнит:
|
||||||
\begin{Verbatim}
|
\begin{Verbatim}
|
||||||
systemctl mask dev-hugepages.mount
|
systemctl mask dev-hugepages.mount
|
||||||
\end{Verbatim}
|
\end{Verbatim}
|
||||||
|
|
||||||
В результате выполнения такой операции, соответствующая ФС больше не~будет
|
В результате выполнения такой операции, соответствующая ФС больше не~будет
|
||||||
монтироваться по умолчанию, начиная со следующей загрузки системы. О том, что
|
монтироваться по умолчанию, начиная со следующей загрузки системы. О том, что
|
||||||
такое маскировка юнита, вы можете прочитать в~главе~\ref{sec:off}.
|
такое блокировка юнита, вы можете прочитать в~главе~\ref{sec:off}.
|
||||||
|
|
||||||
На всякий случай отметим, что применение к специальным ФС параметров монтирования,
|
На всякий случай отметим, что применение к специальным ФС параметров монтирования,
|
||||||
указанных в +/etc/fstab+, обеспечивается службой
|
указанных в +/etc/fstab+, обеспечивается службой
|
||||||
@@ -5272,8 +5710,9 @@ systemctl mask tmp.mount
|
|||||||
<<\href{http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget}{Running
|
<<\href{http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget}{Running
|
||||||
Services After the Network is up}>> с официального сайта проекта, по состоянию
|
Services After the Network is up}>> с официального сайта проекта, по состоянию
|
||||||
на 2013-01-17 23:22:58 (ревизия \No17).}}
|
на 2013-01-17 23:22:58 (ревизия \No17).}}
|
||||||
|
\label{sec:networktarget}
|
||||||
|
|
||||||
\emph{Итак, ваша служба настроена на запуск только после достижения цели
|
\yousaywtfsk{Итак, ваша служба настроена на запуск только после достижения цели
|
||||||
network.target, однако, несмотря на это, она все равно запускается до появления
|
network.target, однако, несмотря на это, она все равно запускается до появления
|
||||||
сети. У вас возникают вопросы: <<Почему так происходит?>> и <<Как это
|
сети. У вас возникают вопросы: <<Почему так происходит?>> и <<Как это
|
||||||
исправить?>>.}
|
исправить?>>.}
|
||||||
@@ -5281,8 +5720,8 @@ network.target, однако, несмотря на это, она все рав
|
|||||||
Цель +network.target+ является systemd-шным аналогом LSB-сущности (facility)
|
Цель +network.target+ является systemd-шным аналогом LSB-сущности (facility)
|
||||||
\verb+$network+. Определение этой сущности в стандарте
|
\verb+$network+. Определение этой сущности в стандарте
|
||||||
\href{http://refspecs.linuxbase.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/facilname.html}%
|
\href{http://refspecs.linuxbase.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/facilname.html}%
|
||||||
{довольно расплывчато} и оставляет широкий простор для трактовок. Вот примеры
|
{довольно расплывчато} и оставляет широкий простор для различных трактовок. Вот
|
||||||
некоторых из них:
|
примеры некоторых из них:
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Все заданные в настройках сетевые интерфейсы переведены в состояние
|
\item Все заданные в настройках сетевые интерфейсы переведены в состояние
|
||||||
UP и получили IP-адреса.
|
UP и получили IP-адреса.
|
||||||
@@ -5290,7 +5729,7 @@ network.target, однако, несмотря на это, она все рав
|
|||||||
зарегистрирована несущая (link beat), получили IP-адреса.
|
зарегистрирована несущая (link beat), получили IP-адреса.
|
||||||
Наличие или отсутствие явных настроек роли не~играет.
|
Наличие или отсутствие явных настроек роли не~играет.
|
||||||
\item Доступен DNS-сервер.
|
\item Доступен DNS-сервер.
|
||||||
\item Доступен некоторый выбранный сервер.
|
\item Доступна некоторая выбранная сетевая служба.
|
||||||
\item Доступен некий абстрактный <<интернет>>.
|
\item Доступен некий абстрактный <<интернет>>.
|
||||||
\item Все заданные в настройках ethernet-интерфейсы переведены в
|
\item Все заданные в настройках ethernet-интерфейсы переведены в
|
||||||
состояние UP, однако процесс настройки PPP-интерфейсов еще
|
состояние UP, однако процесс настройки PPP-интерфейсов еще
|
||||||
@@ -5298,7 +5737,7 @@ network.target, однако, несмотря на это, она все рав
|
|||||||
\item Активирован некий профиль сетевых настроек, задающий одно из
|
\item Активирован некий профиль сетевых настроек, задающий одно из
|
||||||
условий выше. В разных профилях могут использоваться разные
|
условий выше. В разных профилях могут использоваться разные
|
||||||
условия.
|
условия.
|
||||||
\item Выполняется некоторое условие (выбор условия определяется
|
\item Выполняется некоторый набор условий (выбор условий определяется
|
||||||
физическим расположением системы).
|
физическим расположением системы).
|
||||||
\item Настроен как минимум один глобальный адрес IPv4.
|
\item Настроен как минимум один глобальный адрес IPv4.
|
||||||
\item Настроен как минимум один глобальный адрес IPv6.
|
\item Настроен как минимум один глобальный адрес IPv6.
|
||||||
@@ -5381,11 +5820,8 @@ service-файл, запускающий любую заданную вами п
|
|||||||
всего указать здесь ту же самую +network.target+: в результате, ваша служба и
|
всего указать здесь ту же самую +network.target+: в результате, ваша служба и
|
||||||
+network.target+ будут взаимно зависеть друг от друга, но при этом
|
+network.target+ будут взаимно зависеть друг от друга, но при этом
|
||||||
+network.target+ будет активирована только после того, как отработает ваша
|
+network.target+ будет активирована только после того, как отработает ваша
|
||||||
служба. Разница между +WantedBy=+ и +RequiredBy=+ состоит в том, что при
|
служба (о разницы между +WantedBy=+ и +RequiredBy=+ см.
|
||||||
использовании Require требуется \emph{успешное} завершение запуска вашей службы.
|
примечание~\ref{ftn:wants}). В качестве основы вы можете взять
|
||||||
Если он завершится с ненулевым кодом выхода или по сигналу, +network.target+
|
|
||||||
не~будет активирована. В то время как для Want достаточно просто завершения
|
|
||||||
запуска, вне зависимости от успешности. В качестве основы вы можете взять
|
|
||||||
\href{http://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/data/NetworkManager-wait-online.service.in}%
|
\href{http://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/data/NetworkManager-wait-online.service.in}%
|
||||||
{апстримный файл} +NetworkManager-wait-online.service+. В завершение,
|
{апстримный файл} +NetworkManager-wait-online.service+. В завершение,
|
||||||
не~забудьте выполнить для своей службы +systemctl enable+.}.
|
не~забудьте выполнить для своей службы +systemctl enable+.}.
|
||||||
@@ -5407,7 +5843,7 @@ service-файл, запускающий любую заданную вами п
|
|||||||
\item Отслеживайте изменений конфигурации сети при помощи
|
\item Отслеживайте изменений конфигурации сети при помощи
|
||||||
\href{https://www.kernel.org/doc/man-pages/online/pages/man7/rtnetlink.7.html}%
|
\href{https://www.kernel.org/doc/man-pages/online/pages/man7/rtnetlink.7.html}%
|
||||||
{rtnetlink} и реагируйте соответствующим образом. Это наиболее
|
{rtnetlink} и реагируйте соответствующим образом. Это наиболее
|
||||||
правильный, но далеко не~всегда простой способ.
|
правильный, но далеко не~всегда самый простой способ.
|
||||||
\item Если вы разрабатываете серверное приложение: слушайте только
|
\item Если вы разрабатываете серверное приложение: слушайте только
|
||||||
адреса 0.0.0.0 и 127.0.0.1. Оба этих псевдо-адреса должны быть
|
адреса 0.0.0.0 и 127.0.0.1. Оба этих псевдо-адреса должны быть
|
||||||
доступны постоянно. Если ваша программа будет слушать только их,
|
доступны постоянно. Если ваша программа будет слушать только их,
|
||||||
@@ -5425,11 +5861,12 @@ service-файл, запускающий любую заданную вами п
|
|||||||
<<\href{http://www.freedesktop.org/wiki/Software/systemd/MyServiceCantGetRealtime}%
|
<<\href{http://www.freedesktop.org/wiki/Software/systemd/MyServiceCantGetRealtime}%
|
||||||
{My Service Can't Get Realtime!}>> с официального сайта проекта, по состоянию на
|
{My Service Can't Get Realtime!}>> с официального сайта проекта, по состоянию на
|
||||||
2013-01-15 16:54:09 (ревизия \No1).}}
|
2013-01-15 16:54:09 (ревизия \No1).}}
|
||||||
|
\label{sec:realtime}
|
||||||
|
|
||||||
\emph{Итак, у вас есть служба, которая требует приоритет реального времени
|
\yousaywtf{Итак, у вас есть служба, которая требует приоритет реального времени
|
||||||
(realtime). Однако, когда вы пытаетесь запустить ее на системе, работающей под
|
(realtime). Однако, когда вы пытаетесь запустить ее на системе, работающей под
|
||||||
управлением systemd, ваша служба не~может получить этот приоритет, хотя обладает
|
управлением systemd, ваша служба не~может получить этот приоритет, хотя обладает
|
||||||
всеми необходимыми для этого привилегиями. Вы хотите понять, почему это
|
всеми необходимыми для этого привилегиями. Вы хотите понять, почему так
|
||||||
происходит, и как это можно исправить.}
|
происходит, и как это можно исправить.}
|
||||||
|
|
||||||
\subsection*{В чем же дело?}
|
\subsection*{В чем же дело?}
|
||||||
@@ -5445,7 +5882,7 @@ service-файл, запускающий любую заданную вами п
|
|||||||
существенный недостаток: она требует явного задания realtime-бюджета времени (RT
|
существенный недостаток: она требует явного задания realtime-бюджета времени (RT
|
||||||
budget) для своих контрольных групп. Если же бюджет группы не~задан, то ее
|
budget) для своих контрольных групп. Если же бюджет группы не~задан, то ее
|
||||||
процессы не~смогут получить приоритет реального времени (соответствующая
|
процессы не~смогут получить приоритет реального времени (соответствующая
|
||||||
операция будет завершаться с ошибкой +EPERM+~--- <<недостаточные полномочия>>).
|
операция будет завершаться с ошибкой +EPERM+~--- <<недостаточно полномочий>>).
|
||||||
systemd не~может присваивать такой бюджет \emph{каждой} группе, просто потому,
|
systemd не~может присваивать такой бюджет \emph{каждой} группе, просто потому,
|
||||||
что не~знает, как его правильно делить между ними. Бюджет выдается в абсолютных
|
что не~знает, как его правильно делить между ними. Бюджет выдается в абсолютных
|
||||||
единицах времени, и их общее количество ограничено. Мы не~можем предложить
|
единицах времени, и их общее количество ограничено. Мы не~можем предложить
|
||||||
@@ -5460,29 +5897,35 @@ systemd не~может присваивать такой бюджет \emph{к
|
|||||||
\item Можно просто отключить использование cpu-контроллера по умолчанию
|
\item Можно просто отключить использование cpu-контроллера по умолчанию
|
||||||
для системных служб. Для этого, задайте в файле
|
для системных служб. Для этого, задайте в файле
|
||||||
+/etc/systemd/system.conf+ параметр +DefaultControllers=+ равным
|
+/etc/systemd/system.conf+ параметр +DefaultControllers=+ равным
|
||||||
пустой строке, после чего перезагрузите систему. (Также вы
|
пустой строке, после чего перезагрузите систему. (Либо вы
|
||||||
можете отключить контроллер +cpu+ на этапе сборки ядра. systemd
|
можете отключить контроллер +cpu+ на этапе сборки ядра. systemd
|
||||||
не~пытается использовать контроллеры, которые не~поддерживаются
|
не~пытается использовать контроллеры, которые не~поддерживаются
|
||||||
ядром.)
|
ядром.)
|
||||||
\item Также вы можете отключить группировку по +cpu+ только для
|
\item Также вы можете отключить группировку по +cpu+ только для
|
||||||
конкретных служб. Для этого отредактируйте конфигурацию службы,
|
конкретных служб. Для этого отредактируйте конфигурацию службы,
|
||||||
добавив параметр +ControlGroup=cpu:/+ в секцию +[Service]+. В
|
добавив параметр
|
||||||
|
\begin{Verbatim}
|
||||||
|
ControlGroup=cpu:/
|
||||||
|
\end{Verbatim}
|
||||||
|
в секцию +[Service]+. В
|
||||||
результате, процессы данной службы будут помещены не~в
|
результате, процессы данной службы будут помещены не~в
|
||||||
собственную контрольную группу (как это делалось по умолчанию),
|
собственную контрольную группу (как это делалось по умолчанию),
|
||||||
а в корневую контрольную группу иерархии +cpu+. Процессы из
|
а в корневую контрольную группу иерархии +cpu+. Процессы из
|
||||||
корневой группы располагают полным realtime-бюджетом.
|
корневой группы располагают полным realtime-бюджетом.
|
||||||
\item И наконец, вы можете явно выделить своей службе некоторый бюджет.
|
\item И наконец, вы можете явно выделить своей службе некоторый бюджет.
|
||||||
Для этого добавьте в секцию +[Service]+ строку наподобие
|
Для этого добавьте в секцию +[Service]+ строку наподобие
|
||||||
+ControlGroupAttribute=cpu.rt_runtime_us 500000+. Подробнее о
|
\begin{Verbatim}
|
||||||
правильном распределении бюджета читайте в
|
ControlGroupAttribute=cpu.rt_runtime_us 500000
|
||||||
\href{http://www.kernel.org/doc/Documentation/scheduler/sched-design-CFS.txt}%
|
\end{Verbatim}
|
||||||
|
Подробнее о правильном распределении бюджета читайте в
|
||||||
|
\href{http://www.kernel.org/doc/Documentation/scheduler/sched-rt-group.txt}%
|
||||||
{документации к ядру}.
|
{документации к ядру}.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
Последние две опции недоступны для SysV-служб. Тем не~менее, вы можете
|
Последние две опции неприменимы к SysV-службам. Тем не~менее, вы можете
|
||||||
подготовить для них соответствующие service-файлы, которые, помимо упомянутых
|
подготовить для таких служб соответствующие service-файлы, которые, помимо
|
||||||
выше параметров, содержат вызов соответствующего init-скрипта с аргументом
|
упомянутых выше параметров, содержат вызов соответствующего init-скрипта с
|
||||||
+start+ в +ExecStart=+, и с аргументом +stop+~--- в +ExecStop=+.
|
аргументом +start+ в +ExecStart=+, и с аргументом +stop+~--- в +ExecStop=+.
|
||||||
(Также имеет смысл задать для них параметры +RemainAfterExit=1+ и
|
(Также имеет смысл задать для них параметры +RemainAfterExit=1+ и
|
||||||
+Type=forking+.)
|
+Type=forking+.)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user