Version v3.0 (2011-03-22 17:42) [AUTO]

This commit is contained in:
nnz1024
2011-03-22 17:42:00 +03:00
parent 71b6656ebb
commit 01f2aafc02

158
s4a.tex
View File

@@ -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