пятница, 6 июля 2012 г.

systemd для администраторов, часть 5

Пятая статья посвящена остановке и отключению служб в systemd.
Автор оригинала: Леннарт Поттеринг (Lennart Poettering).
Заголовок: systemd for Administrators, Part V. The three levels of "off".
Ссылка: http://0pointer.de/blog/projects/three-levels-of-off.html.
Дата: 02.03.2011.

Три уровня "Off"

В systemd существует три уровня отключения службы (или других юнитов). Давайте посмотрим, что они представляют из себя:
  1. Вы можете остановить службу. Это простое прекращение работы выполняющегося экземпляра службы, и не более того. Если служба будет запрошена каким-либо способом (вручную, через сокет или шину, при запуске системы или же при подключении устройства), то она снова будет запущена.

    Остановка службы - это очень простое и временное действие. Например, остановим службу NTP:
    $ systemctl stop ntpd.service
    Этот способ почти эквивалентен следующей традиционной команде, которая доступна в большинстве систем, использующих SysV:
    $ service ntpd stop
    Стоит отметить, что если вы выполните последнюю команду на Fedora 15, то она будет прозрачно преобразована в первую.

  2. Вы можете отключить сервис. При этом служба будет отвязана от активирующих ее триггеров. При этом служба больше не будет стартовать при загрузке, через сокет или шину, при подключении устройства (или при наступлении любого другого события, ранее приводившего к запуску службы). Однако, если понадобится, вы все еще можете запустить ее вручную. Если вы отключаете (disable) уже запущенный сервис, то это не приведет к его остановке (stop). Вот пример, как отключить службу:
    $ systemctl disable ntpd.service
    Традиционно в Fedora отключение службы делалось так:
    $ chkconfig ntpd off
    В Fedora 15 последняя команда также будет прозрачно преобразована, если необходимо.

    Часто необходимо одновременно отключить и остановить службу, чтобы избавиться от текущего экземпляра и убедиться, что он не будет запущен снова (за исключением ручного запуска):
    $ systemctl disable ntpd.service
    $ systemctl stop ntpd.service
    Такие команды, как эти, например, используются при удалении пакетов служб в Fedora.

    Отключенная служба будет находиться в этом состоянии постоянно (пока вы не включите ее), независимо от количества перезагрузок системы.

  3. Вы можете замаскировать службу. Это как отключение службы, но "на стероидах". При этом служба не будет когда-либо запущена не только автоматически, но и в ручную. Эта возможность скрыта в systemd, т.к. обычно она не нужна и может запутать пользователя. Но вот как можно это сделать:
    $ ln -s /dev/null /etc/systemd/system/ntpd.service
    $ systemctl daemon-reload
    Создав для службы символическую ссылку на "/dev/null", вы сообщите systemd, что запуск службы нежелателен и следует блокировать такие попытки. Юнит файлы, хранящиеся в "/etc/systemd/system" имеют приоритет над расположенными в "/lib/systemd/system" и имеющими такое же имя. Первый каталог - это территория администратора системы, последний же - пакетного менеджера. Установив символическую ссылку в "/etc/systemd/system/ntpd.service", вы можете быть уверены, что systemd никогда не будет читать исходный файл службы "/lib/systemd/system/ntpd.service".

    systemd опознает юниты, ссылающиеся на "/dev/null" и покажет их как "masked". Если вы попробуете запустить службу вручную (например, через "systemctl start"), то это приведет к ошибке.

    Подобного трюка нет в SysV (официально). Однако, есть несколько неофициальных хаков, таких как добавление в начало скрипта инициализации команды "exit 0" или удаление бита исполнения (отображается как "x" в выводе команды "ls -l"). Однако, эти решения имеют различные недостатки, например, они вмешиваются в работу менеджера пакетов.

    Маскировка службы, как и отключение, является изменением постоянным.
Теперь, когда мы научились отключать службы тремя разными способами, остался только один вопрос: как снова их включить? Ответ прост: также, как и отключили. Используйте "systemctl start", чтобы отменить "systemctl stop"; "systemctl enable" для отмены "systemctl disable"; "rm" для удаления созданной командой "ln" символической ссылки.

И это все на сегодня. Спасибо за внимание!

Полезные ссылки

  1. Леннарт Поттеринг в Google+.
  2. Оригинал статьи.