Version v3.0 (2011-03-22 17:42) [AUTO]
This commit is contained in:
158
s4a.tex
158
s4a.tex
@@ -836,7 +836,7 @@ systemd запустит процесс abrtd, который уже не~буд
|
|||||||
падения. Или, например, добавив +OOMScoreAdjust=-500+, мы попросим ядро сберечь
|
падения. Или, например, добавив +OOMScoreAdjust=-500+, мы попросим ядро сберечь
|
||||||
эту службу, даже если OOM Killer выйдет на тропу войны. А если мы добавим
|
эту службу, даже если OOM Killer выйдет на тропу войны. А если мы добавим
|
||||||
строчку +CPUSchedulingPolicy=idle+, процесс abrtd будет работать только в те
|
строчку +CPUSchedulingPolicy=idle+, процесс abrtd будет работать только в те
|
||||||
моменты, когда система больше ничем не~занята, что позволит не создавать помех
|
моменты, когда система больше ничем не~занята, что позволит не~создавать помех
|
||||||
для процессов, активно использующих CPU.
|
для процессов, активно использующих CPU.
|
||||||
|
|
||||||
За более подробным описанием всех опций настройки, вы можете обратиться к
|
За более подробным описанием всех опций настройки, вы можете обратиться к
|
||||||
@@ -859,7 +859,7 @@ service-файлы. Но, к счастью, <<проблемных>> скрип
|
|||||||
Впрочем, этот метод не~вполне корректен, так как он действует не~только на
|
Впрочем, этот метод не~вполне корректен, так как он действует не~только на
|
||||||
самого демона, но и на другие процессы с тем же именем. Иногда подобное
|
самого демона, но и на другие процессы с тем же именем. Иногда подобное
|
||||||
поведение может привести к неприятным последствиям. Более правильным будет
|
поведение может привести к неприятным последствиям. Более правильным будет
|
||||||
использование pid-файла: +kill $(cat /var/run/syslogd.pid)+. Вот, вроде
|
использование pid-файла: +kill $(cat /var/run/syslogd.pid)$+. Вот, вроде
|
||||||
бы, и все, что вам нужно\ldots{} Или мы упускаем еще что-то?
|
бы, и все, что вам нужно\ldots{} Или мы упускаем еще что-то?
|
||||||
|
|
||||||
Действительно, мы забываем одну простую вещь: существуют службы, такие, как
|
Действительно, мы забываем одну простую вещь: существуют службы, такие, как
|
||||||
@@ -946,4 +946,158 @@ systemd и на этот случай есть простое решение, и
|
|||||||
инструментов, позволяющих корректно отправить сигнал службе в целом, а
|
инструментов, позволяющих корректно отправить сигнал службе в целом, а
|
||||||
не~отдельному процессу.
|
не~отдельному процессу.
|
||||||
|
|
||||||
|
\section{Три уровня выключения}
|
||||||
|
|
||||||
|
В \href{http://www.freedesktop.org/wiki/Software/systemd}{systemd} существует
|
||||||
|
три уровня (разновидности) действий, направленных на прекращение работы службы
|
||||||
|
(или любого другого юнита):
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\fvset{gobble=3}
|
||||||
|
\item Вы можете \emph{остановить} службу, то есть прекратить
|
||||||
|
выполнение уже запущенных процессов службы. При этом
|
||||||
|
сохраняется возможность ее последующего запуска, как ручного
|
||||||
|
(через команду +systemctl start+), так и автоматического (при
|
||||||
|
загрузке системы, при поступлении запроса через сокет или
|
||||||
|
системную шину, при срабатывании таймера, при подключении
|
||||||
|
соответствующего оборудования и т.д.). Таким образом,
|
||||||
|
остановка службы является временной мерой, не~дающей никаких
|
||||||
|
гарантий на будущее.
|
||||||
|
|
||||||
|
В качестве примера рассмотрим остановку службы NTPd
|
||||||
|
(отвечающей за синхронизацию времени по сети):
|
||||||
|
\begin{Verbatim}
|
||||||
|
systemctl stop ntpd.service
|
||||||
|
\end{Verbatim}
|
||||||
|
|
||||||
|
Аналогом этой команды в классическом SysV init является
|
||||||
|
\begin{Verbatim}
|
||||||
|
service ntpd stop
|
||||||
|
\end{Verbatim}
|
||||||
|
|
||||||
|
Заметим, что в Fedora~15, использующей в качестве системы
|
||||||
|
инициализации systemd, в целях обеспечения обратной
|
||||||
|
совместимости допускается использование классических
|
||||||
|
SysV-команд, и systemd будет корректно воспринимать их.
|
||||||
|
В~частности, вторая приведенная здесь команда будет эквивалентна
|
||||||
|
первой.
|
||||||
|
|
||||||
|
\item Вы можете \emph{отключить} службу, то есть отсоединить ее от всех
|
||||||
|
триггеров активации. В результате служба уже не~будет
|
||||||
|
автоматически запускаться ни~при загрузке системы, ни~при
|
||||||
|
обращении к сокету или адресу на шине, ни~при подключении
|
||||||
|
оборудования, и т.д. Но при этом сохраняется возможность
|
||||||
|
<<ручного>> запуска службы (командой +systemctl start+).
|
||||||
|
Обратите внимание, что при отключении уже запущенной службы, ее
|
||||||
|
выполнение в текущем сеансе не~останавливается~--- это нужно
|
||||||
|
сделать отдельно, иначе процессы службы будут работать до
|
||||||
|
момента выключения системы (но при следующем включении,
|
||||||
|
разумеется, уже не~запустятся).
|
||||||
|
|
||||||
|
Рассмотрим отключение службы на примере все того же NTPd:
|
||||||
|
\begin{Verbatim}
|
||||||
|
systemctl disable ntpd.service
|
||||||
|
\end{Verbatim}
|
||||||
|
|
||||||
|
В классических SysV-системах аналогичная команда будет иметь
|
||||||
|
вид
|
||||||
|
\begin{Verbatim}
|
||||||
|
chkconfig ntpd off
|
||||||
|
\end{Verbatim}
|
||||||
|
|
||||||
|
Как и в предыдущем случае, в Fedora~15 вторая из этих команд
|
||||||
|
будет действовать аналогично первой.
|
||||||
|
|
||||||
|
Довольно часто приходится сочетать действия отключения и
|
||||||
|
остановки службы~--- такая комбинированная операция
|
||||||
|
гарантирует, что уже исполняющиеся процессы службы будут
|
||||||
|
прекращены, и служба больше не~будет запускаться автоматически
|
||||||
|
(но может быть запущена вручную):
|
||||||
|
\begin{Verbatim}
|
||||||
|
systemctl disable ntpd.service
|
||||||
|
systemctl stop ntpd.service
|
||||||
|
\end{Verbatim}
|
||||||
|
Подобное сочетание команд используется,
|
||||||
|
например, при деинсталляции пакетов в Fedora.
|
||||||
|
|
||||||
|
Обратите внимание, что отключение службы является перманентной
|
||||||
|
мерой, и действует вплоть до явной отмены соответствующей
|
||||||
|
командой. Перезагрузка системы не~отменяет отключения службы.
|
||||||
|
|
||||||
|
\item Вы можете \emph{заблокировать} (замаскировать) службу. Действие
|
||||||
|
этой операции аналогично отключению, но дает более сильный
|
||||||
|
эффект. Если при отключении отменяется только возможность
|
||||||
|
автоматического запуска службы, но сохраняется возможность
|
||||||
|
ручного запуска, то при блокировке исключаются обе эти
|
||||||
|
возможности. Отметим, что использование данной опции при
|
||||||
|
непонимании принципов ее работы может привести к трудно
|
||||||
|
диагностируемым ошибкам.
|
||||||
|
|
||||||
|
Тем не~менее, рассмотрим пример блокировки все той же службы NTPd:
|
||||||
|
\begin{Verbatim}
|
||||||
|
ln -s /dev/null /etc/systemd/system/ntpd.service
|
||||||
|
systemctl daemon-reload
|
||||||
|
\end{Verbatim}
|
||||||
|
|
||||||
|
Итак, блокировка сводится к созданию символьной ссылки
|
||||||
|
с именем соответствующей службы, указывающей на +/dev/null+.
|
||||||
|
После такой операции служба не~может быть запущена ни~вручную,
|
||||||
|
ни~автоматически. Символьная ссылка создается в каталоге
|
||||||
|
+/etc/systemd/system/+, а ее имя должно соответствовать имени
|
||||||
|
файла описания службы из каталога +/lib/systemd/system/+ (в
|
||||||
|
нашем случае +ntpd.service+).
|
||||||
|
|
||||||
|
Заметим, что systemd читает файлы конфигурации из обоих этих
|
||||||
|
каталогов, но файлы из +/etc+ (управляемые системным
|
||||||
|
администратором) имеют приоритет над файлами из +/lib+ (которые
|
||||||
|
управляются пакетным менеджером). Таким образом, созание
|
||||||
|
символьной ссылки (или обычного файла)
|
||||||
|
+/etc/systemd/system/ntpd.service+ предотвращает чтение
|
||||||
|
штатного файла конфигурации +/lib/systemd/system/ntpd.service+.
|
||||||
|
|
||||||
|
В выводе +systemctl status+ заблокированные службы отмечаются
|
||||||
|
словом +masked+. Попытка запустить такие службы командой
|
||||||
|
+systemctl start+ завершится ошибкой.
|
||||||
|
|
||||||
|
В рамках классического SysV init, штатная реализация такой
|
||||||
|
возможности отсутствует. Похожий эффект может быть
|
||||||
|
достигнут с помощью <<костылей>>, например, путем добавления
|
||||||
|
команды +exit 0+ в начало init-скрипта. Однако, подобные решения
|
||||||
|
имеют ряд недостатков, например, потенциальная возможность
|
||||||
|
конфликтов с пакетным менеджером (при очередном обновлении
|
||||||
|
исправленный скрипт может быть просто затерт соответствующим
|
||||||
|
файлом из пакета).
|
||||||
|
|
||||||
|
Стоит отметить, что блокировка службы, как и ее отключение,
|
||||||
|
является перманентной мерой\footnote{Прим. перев.: подробно
|
||||||
|
описав принцип работы блокировки службы (юнита), автор забывает
|
||||||
|
привести практические примеры ситуаций, когда эта возможность
|
||||||
|
оказывается полезной.
|
||||||
|
|
||||||
|
В частности, иногда бывает необходимо
|
||||||
|
полностью предотвратить запуск службы в любой ситуации. При этом
|
||||||
|
не~стоит забывать, что в post-install скриптах пакетного
|
||||||
|
менеджера или, скажем, в~заданиях cron, вместо
|
||||||
|
+systemctl try-restart+ (+service condrestart+) может быть
|
||||||
|
ошибочно указано +systemctl restart+ (+service restart+), что
|
||||||
|
является прямым указанием на запуск службы, если она еще
|
||||||
|
не~запущена. Вследствие таких ошибок, отключенная служба может
|
||||||
|
<<ожить>> в самый неподходящий момент.
|
||||||
|
|
||||||
|
Другой пример~---
|
||||||
|
ограничение возможностей непривилегированного пользователя при
|
||||||
|
управлении системой. Даже если такому пользователю делегировано
|
||||||
|
(через механизмы sudo или PolicyKit) право на использование
|
||||||
|
+systemctl+, это еще не~означает, что он сможет запустить
|
||||||
|
заблокированную службу~--- права на выполнение +rm+ (удаление
|
||||||
|
блокирующей символьной ссылки) выдаются отдельно}.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
После прочтения изложенного выше, у читателя может возникнуть вопрос: как
|
||||||
|
отменить произведенные изменения? Что ж, ничего сложного тут нет:
|
||||||
|
+systemctl start+ отменяет действия +systemctl stop+, +systemctl enable+
|
||||||
|
отменяет действие +systemctl disable+, а +rm+ отменяет действие +ln+.
|
||||||
|
|
||||||
\end{document}
|
\end{document}
|
||||||
|
|
||||||
|
vim:ft=tex:tw=80:spell:spelllang=ru
|
||||||
|
|||||||
Reference in New Issue
Block a user