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+, мы попросим ядро сберечь
|
||||
эту службу, даже если OOM Killer выйдет на тропу войны. А если мы добавим
|
||||
строчку +CPUSchedulingPolicy=idle+, процесс abrtd будет работать только в те
|
||||
моменты, когда система больше ничем не~занята, что позволит не создавать помех
|
||||
моменты, когда система больше ничем не~занята, что позволит не~создавать помех
|
||||
для процессов, активно использующих CPU.
|
||||
|
||||
За более подробным описанием всех опций настройки, вы можете обратиться к
|
||||
@@ -859,7 +859,7 @@ service-файлы. Но, к счастью, <<проблемных>> скрип
|
||||
Впрочем, этот метод не~вполне корректен, так как он действует не~только на
|
||||
самого демона, но и на другие процессы с тем же именем. Иногда подобное
|
||||
поведение может привести к неприятным последствиям. Более правильным будет
|
||||
использование pid-файла: +kill $(cat /var/run/syslogd.pid)+. Вот, вроде
|
||||
использование pid-файла: +kill $(cat /var/run/syslogd.pid)$+. Вот, вроде
|
||||
бы, и все, что вам нужно\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}
|
||||
|
||||
vim:ft=tex:tw=80:spell:spelllang=ru
|
||||
|
||||
Reference in New Issue
Block a user