Автозапуск служб (демонов)

Аватар пользователя userok


Автозапуск служб (демонов) в системе GNU/Linux

Попытаемся разобраться как устроен автозапуск системных служб в системе GNU/Linux.
Для примера использована система Alt Linux 6.0 Desktop.
Чаще всего для запуска какой-либо службы используется следующая команда:
# service [имя_службы] start
Для остановки службы:
# service [имя_службы] stop
Для просмотра текущего состояния службы:
# service [имя_службы] status

Рассмотрим работу со службами из консоли на примере сервиса Samba:

На скриншоте выше можно увидеть, что когда даешь команду на запуск/остановку службы smb, выводится сообщение о том что запущена/остановлена служба smbd.

Так какое-же правильное имя у сервиса samba? Почему мы запускаем smb а стартует smbd?
На самом деле команда service запускает скрипт smb, расположенный в каталоге /etc/init.d/ с параметрами start, stop, status.

Посмотрите вывод команды $ ls /etc/init.d, Вы увидите список скриптов, отвечающих за запуск соответствующих служб. Следовательно команда service не запускает службы непосредственно, а запускает скрипт, передавая ему параметр, указывающий что надо сделать. Исходя из этого можно взаимодействовать со службой напрямую, например:

# /etc/init.d/smb status

Однако внимательно присмотревшись к каталогу /etc/init.d можно убедиться, что это не каталог, а символическая ссылка на папку /etc/rc.d/init.d. А вот это уже реальный каталог, где лежат скрипты! А это значит, что службу также можно запустить следующим образом:

# /etc/rc.d/init.d/smb start
Попробуем поработать со службой тремя разными командами:


Теперь стоит посмотреть внутрь файла /etc/rc.d/init.d/smb.

Не будем рассматривать работу скрипта подробно, заметим лишь, что выполняя команду:
# service smb start
мы передаем скрипту параметр start через переменную $1, получая которую оператор case передаёт управление в соответствующую функцию с именем start, в которой и запускается требуемая служба smbd.
Ещё, в начале файла имеется очень интересная строчка:
# chkconfig: - 91 35, к ней мы вернёмся чуть позже.

Мы разобрались как стартовать и останавливать сервисы вручную. Теперь следует изучить каким образом сделать так, чтобы сервис стартовал при запуске системы автоматически.
Того что скрипт службы расположен в каталоге /etc/rc.d/init.d/ ещё не достаточно, чтобы данная служба запускалась автоматически. Что же надо для этого сделать? Давайте ещё раз заглянем в каталог /etc/rc.d/: наряду с папкой init.d, здесь так-же имеются семь каталогов с именами rc0.d, rc1.d … rc6.d.

Чтобы обеспечить выполнене скрипта на запуск службы, необходимо создать символическую ссылку на него и поместить в эти каталоги. В какие именно?
Цифра в названии каталога указывает на уровень выполнения(run level) системы. Кратко рассмотрим эти уровни.

В различных дистрибутивах GNU/Linux уровни выполнения используются для различных целей. Современная версия программы init может использовать десять уровней выполнения, но обычно используются только семь.

Информация из Википедии:
0 — выполняются действия по выключению системы.
1 — однопользовательский режим (single user mode). Предназначен для различных административных действий по восстановлению системы. По своему смыслу аналогичен Safe Mode Windows, но полностью его не повторяет. На этом уровне выполнения система полностью сконфигурирована, но не запущен ни один сервис, а из пользователей может работать только один root.
2 — не используется, но сконфигурирован как уровень выполнения 3. В RedHat и SuSE Linux сконфигурирован как уровень выполнения 3, но без поддержки сетевых файловых систем. В Debian используется как многопользовательский режим.
3 — многопользовательский режим (multiuser mode). Нормальный режим работы сервера.
4 — В Slackware Linux используется для графического входа в систему. В RedHat и SuSE Linux не сконфигурирован.
5 — В RedHat и SuSE Linux используется для графического входа в систему. В Slackware Linux не сконфигурирован.
6 — выполняются действия по перезагрузке системы.

Выполните в своей системе команду:
$ /sbin/runlevel, чтобы узнать какой уровень используется Вашей системой. Если Вы работаете с использованием GUI, то это будет несомненно пятый уровень, если иксы не запущены, тогда — третий.

Посмотрим как выглядит символическая ссылка для сервиса smbd:

Мы видим, что на уровнях №№ 2,3,4 и 5 ссылка именуется S91smb, а на уровнях 0,1, и 6 — K35smb. Буква S в начале имени ссылки говорит о том, что это ссылка для запуска службы (от англ. Start), буква K сигнализирует, что для остановки(Kill). Собственно служба будет стартовать когда система переходит на 2,3,4,5 уровень, а останавливаться на уровнях 0,1, и 6.

Примечание: Если служба уже была запущена на предыдущем уровне, то при переходе на следующий уровень загрузки и наличия «стартовой» символической ссылки она не перезапускается, а продолжает работать, запустится она только в том случае, если была остановлена на предыдущем уровне. Точно также не происходит остановка службы при наличии «останавливающей» ссылки, если она уже была остановлена на предыдущем уровне.

А что означают числа 35 и 91? Вспоминаем строчку # chkconfig: - 91 35 в файле скрипта
/etc/rc.d/init.d/smb. Первая цифра указыает очередь загрузки скрипта, а вторая - очередь остановки. Это значит что демон smbd будет запущен 91-м при переходе на соответствующий уровень, а остановлен 35-м.

В установленной на моём компьютере системе, служба smbd уже была добавлена в автозагрузку. Теперь мы удалим её оттуда и добавим заново. Это можно сделать двумя способами. Можно вручную удалить файлы(вернее ссылки) K35smb и S91smb из всех каталогов rc0.d, rc1.d … rc6.d, а потом вручную создать их заново, однако этот процесс довольно утомителен, поэтому мы воспользуемся специальной утилитой chkconfig, которая значительно ускоряет этот процесс!
Команда chkconfig --del smb моментально удалит сразу все файлы из каталогов rc0.d, rc1.d … rc6.d, ссылающиеся на smb. После каждого нашего действия будем выполнять команду chkconfig --list smb, которая покажет нам текущее состояние автозагрузки скрипта smb.
И командой chkconfig --level с параметрами мы создадим новые символические ссылки, см картинку ниже.


Выполнив первую команду мы удалили файлы, ссылающиеся на smb, соответственно выполнив chkconfig --list smb, получаем сообщение, что сервис smb поддерживается chkconfig, однако на него нет ни одной ссылки из /etc/rc.d/. Что же, добавим их.
chkconfig --level 2345 smb on — эта команда создает ссылки на /etc/rc.d/init.d/smb в каталогах rc2.d, rc3.d, rc4.d, rc5.d с именем S91smb, а команда sudo chkconfig --level 016 smb off — файлы с именем K35smb в каталогах rc0.d, rc1.d, rc6.d.

Уровни 91 и 35 утилита chkconfig получает из файла /etc/rc.d/init.d/smb. После выполнения команды на добавление, команда chkconfig --list smb показывает off на нулевом, первом и шестом уровнях однако это потому, что там нет ссылок на запуск службы(естественно их и не должно там быть), но нет пока и ссылок на остановку, поэтому после выполнения chkconfig --level 016 smb off, вывод команды chkconfig --list smb не изменился.

Рассмотрим упрощённый запуск этой команды.
chkconfig smb on создаст ссылки S91smb на 2,3,4 и 5 уровнях. При этом ссылки K35smb на уровнях 0,1,6 не создаются.
chkconfig smb off удалит ссылки S91smb на 2,3,4 и 5 уровнях и вместо них создает на этих же уровнях ссылки K35smb, однако ссылки K35smb на уровнях 0,1,6 не создаются.

В Alt Linux имеется и графический интерфейс, с помощью которого можно запускать/останавливать службы и помещать их в автозагрузку, однако вышеописанный алгоритм справедлив практически для любого дистрибутива, а графические интерфейсы могут отличаться, к тому же всегда полезно знать что на самом деле происходит в системе, когда ставишь/снимаешь какую-нибудь галочку:


Эта статья опубликована под Creative Commons Attribution ShareAlike лицензией.

Добавить комментарий