Автозапуск служб (демонов) в системе 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, Вы увидите список скриптов, отвечающих за запуск соответствующих служб. Для реализации автозапуска в Linux написано уже немало и на разных языках, но приходится искать, потому постарался свести большую часть тут. Здесь не рассказывается полностью весь процесс с нуля. Добавить в автозагрузку в линуксе нужный скрипт можно с помощью. Автозагрузка linux. ![]() Следовательно команда service не запускает службы непосредственно, а запускает скрипт, передавая ему параметр, указывающий что надо сделать. Исходя из этого можно взаимодействовать со службой напрямую, например: # /etc/init.d/smb status Однако внимательно присмотревшись к каталогу /etc/init.d можно убедиться, что это не каталог, а символическая ссылка на папку /etc/rc.d/init.d. А вот это уже реальный каталог, где лежат скрипты! В целях оптимизации времени загрузки системы в Xubuntu есть замечательная опция “Автозапуск приложений”, которая находится в Диспетчере настроек, в разделе. А это значит, что службу также можно запустить следующим образом: # /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 имеется и графический интерфейс, с помощью которого можно запускать/останавливать службы и помещать их в автозагрузку, однако вышеописанный алгоритм справедлив практически для любого дистрибутива, а графические интерфейсы могут отличаться, к тому же всегда полезно знать что на самом деле происходит в системе, когда ставишь/снимаешь какую-нибудь галочку: Эта статья опубликована под лицензией. Для реализации автозапуска в Linux написано уже немало и на разных языках, но приходится искать, потому постарался свести большую часть тут. Здесь не рассказывается полностью весь процесс с нуля, но предоставлено достаточно информации и ссылок, чтобы сделать атоматический запуск программ в Linux реальностью. Стоит сразу заметить — чтобы программа была полноценным сервисом/демоном, она должна быть соответствующе написана (, ). Впрочем такое делают не всегда, хотя возможно это и не совсем правильно. Существуют несколько способов сделать автозапуск программ в Linux: • записать вызов программы/скрипта запуска в /etc/rc.local в фоновом режиме (&) (в разных дистрибутивах может лежать в разных местах, например, /etc/rc.d/rc.local) с перенаправленными потоками ввода/вывода в /dev/null. Например, '/home/user/my_prog 1 > /dev/null 2 > /dev/null &'. Также, дополнительно, можно воспользоваться командой; • внести вызов в /etc/inittab, согласно правилам его оформления. В отличие от первого способа тут можно указать для программы; • написать скрипт, позволяющий запускать/останавливать/перезапускать программу как демона, а также получать информацию о её состоянии. Первый способ самый лёгкий, но и самый проблемный. Файл rc.local есть не во всех дистрибутивах. В нём нельзя задать уровень запуска. Если там записано несколько программ, то сложно ими управлять как сервисами (разве что запустить или остановить все одновременно). И, под конец, запуск из него подрывает устойчивость системы от взлома (примеры можно легко найти в поисковике). Второй метод довольно экзотичный, сам узнал о нём совсем недавно, хотя пишут, что им пользуются многие администраторы. Тем не менее, используя его, нельзя оперировать запущенными таким способом программами как демонами, что довольно неудобно. Да и загромождать inittab некрасиво. Последний метод на текущий момент самый «кошерный», но немного сложнее предыдущих (возможно, на первый взгляд). Именно им представлены все системные демоны, что говорит само за себя. Потому его и рассмотрю ниже. Также есть способ автозапуска графических программ, но его опишу в конце, отдельно от остальных, т.к. Он имеет недемоническую сущность. Сразу обмолвлюсь, что у меня стоит Debian 6 и в других дистрибутивах пути могут несколько различаться. Автозапуск программы как демона Обычно в системе уже есть много подсказок как это сделать, но всё-таки приходится лазить по разным файлам и искать в интеренете дополнительную информацию. Это не значит, что я опишу тут каждую букву, но искать придётся меньше, надеюсь. Для начала стоит заглянуть в каталог /etc/init.d. Здесь содержатся запускные скрипты всех сервисов, а также два файла для желающих написать себе такой же: README и skeleton skeleton содержит в себе болванку скрипта запуска с довольно подробными комментариями, а README его неплохо дополняет, не смотря на его небольшой размер. Также можно посмотреть и другие файлы и попытаться найти там что-то, что прояснит непонятную ситуацию. В 6-ом debian`е для запускных скриптов демонов используется LSB (Linux Script Base) Init Standart. Почитать о нём подробнее можно. Для систем, где LSB не используется стоит взглянуть. Рассмотрим поближе файл skeleton. Первое с чего он должен начинаться, конечно же '#!/bin/sh', т.к. Init-скрипт — запускной файл. Далее идёт комментированный заголовок: ### BEGIN INIT INFO # Provides: skeleton # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Example initscript # Description: This file should be used to construct scripts to be # placed in /etc/init.d. ### END INIT INFO Может показаться, что это просто лишняя информация от автора, но это не так. То, что указано здесь используется при прописывании скрипта в систему. Тут как раз пригодится файл README, который показывает, что в заголовке skeleton перечислены не все возможные параметры. Как минимум есть ещё следующие: # Should-Start: $portmap # Should-Stop: $portmap # X-Start-Before: nis # X-Stop-After: nis # X-Interactive: true Все параметры и их полное описание (на английском) можно увидеть, а на русском. К русскому варианту добавлю, что в Required-Start: можно прописать $all, тогда текущий скрипт будет запускаться после всех остальных (иногда это бывает нужно). Также X-Interactive: true показывает, что этот скрипт может взаимодействовать с пользователем, запросом на ввод чего-нибудь, например пароля. Далее в skeleton идёт инициализация переменных, используемых в самом скрипте. Часть из них нужно будет настроить под свои нужды. Потом проверки на то, что сам демон существует и попытка прочитать конфигурационный файл (их имена должны быть указаны в переменных выше), далее загрузка переменных rcS, а потом идёт одна из самых интересных частей init-файла:. /lib/lsb/init-functions это определение LSB функций работы с логами, LSB-статусом сервиса, работы с процессом. В некоторых дистрибутивах этот файл может находиться в каталоге /etc/init.d. Названия и часть подробностей можно узнать непосредственно из комментариев к функциям в этом файле, а также. Следующая часть — непосредственно тело скрипта. Тело состоит из условных частей, которые являются командами для демона: start, stop, restart/reload/force-reload, status. Кто-то выделяет их в отдельные функции, кто-то нет. На мой взгляд, функциями они выглядят эстетичнее и код более понятен. Все эти команды объединяет оператор выбора case, который и выбирает для исполнения нужный кусок кода, в зависимости от команды (параметра) с которой был запущен init-скрипт. Таким образом для создания обычного скрипта достаточно подставить в переменные в начале файла нужные значения и, возможно, немного добавить кода в функции start/stop (например загрузку/выгрузку драйвера). После того как файл будет готов его нужно скопировать в /etc/init.d и добавить в автозагрузку: update-rc.d defaults (или insserv для debian 6 stable и выше) Удалить из автозагрузки можно так: update-rc.d -f remove (или insserv -r для debian 6 stable и выше) Далее также можно использовать команды sysv-rc-conf в debian или service в fedora core, чтобы включить/выключить автозагрузку сервиса. Автозапуск графического ПО без ввода паролей Сама по себе реализация такой возможности понижает уровень защищённости ОС, т.к. Войти может любой. Но бывают ситуации, когда это необходимо. Рассмотрю тут варианты только для двух основных графических менеджеров, т.к. Других установленных под рукой нет. KDE: Убрать запрос пароля на вход можно в центре управления (kcontrol) -> системное администрирование -> менеджер входа в систему -> удобства. Там выбрать пользователя, под которым входить (кроме рута) и поставить нужные галочки (разрешить автовход и вход без ввода пароля). Чтобы сделать автозапуск программы нужно в каталог /home//.kde/Autostart добавить ссылку на запускной файл/скрипт нужного ПО. Gnome: Тут убрать запрос пароля на вход можно также в центре управления (gnome-control-center) -> Login Screen. Там, под рутом (ткнуть на замок, ввести пароль) выбрать пользователя, под которым входить (кроме суперпользователя). Для автозапуска программы опять же в центре управления выбрать Startup Applications -> Add и заполнить маленькую форму. Для обоих графических менеджеров: Если нужно запустить под обычным пользователем, но от рута, то ещё надо настроить правила в /etc/sudoers на запуск конкретной программы/набора программ от имени суперпользователя (манами рекомендуется для безопасности делать это с помощью visudo). Как это делать рассказывать не буду, т.к. В man sudoers всё хорошо расписано. Метки: • • • Добавить метки Пометьте публикацию своими метками Метки лучше разделять запятой. Например: программирование, алгоритмы.
0 Comments
Leave a Reply. |
Details
AuthorWrite something about yourself. No need to be fancy, just an overview. Archives
September 2018
Categories |