Библиотека сайта rus-linux.net
Исследуем процесс загрузки Linux
(C) В.А.Костромин, 2007
(версия файла от 5.10.2007 г.)
Назад | Оглавление | Вперед |
Этап 7: Скрипт rc и запуск системных сервисов
Как мы видели в предыдущем разделе, скрипт rc.sysinit выполняет те задачи по начальной настройке системы, которые не зависят от уровня выполнения. Скрипт /etc/rc.d/rc, который запускается следующим, должен уже произвести перевод системы на тот уровень выполнения, который задан в файле inittab (или в командной строке). Напомню, что в файле inittab присутствует отдельная строка для каждого уровня выполнения. В этих строках вызывается один и тот же скрипт, и строки отличаются только аргументом вызова этого скрипта. Этот аргумент (или параметр) и задает уровень выполнения. Но, прежде чем рассматривать функции, выполняемые скриптом rc, надо сказать несколько слов о каталоге /etc/rc.d.
7.1. Структура каталога /etc/rc.d/
Этот каталог играет важную роль в процессе загрузки, поскольку он содержит основные скрипты (программы на языке командного процессора shell), служащие для организации процесса загрузки.
Каталог rc.d содержит следующий набор подкаталогов:
- rc0.d
- rc1.d
- rc2.d
- rc3.d
- rc4.d
- rc5.d
- rc6.d
- init.d
Если вы просмотрите (например, с помощью команды ls -l) содержимое подкаталогов rcZ.d, то увидите, что в этих подкаталогах содержатся не файлы, а только ссылки на файлы скриптов, находящиеся в других каталогах, а именно (за редким исключением), в каталоге /etc/rc.d/init.d. Для примера в листинге 13 приведен перечень файлов каталога rc3.d из системы ASPLinux 11.
Листинг 13. Файл /etc/rc.d/rc системы ASP Linux 11. Часть 1.
K01yum -> ../init.d/yum K05saslauthd -> ../init.d/saslauthd K10lirc -> ../init.d/lirc K35winbind -> ../init.d/winbind K38freshclam -> ../init.d/freshclam K39clamd -> ../init.d/clamd K50snmpd -> ../init.d/snmpd K50snmptrapd -> ../init.d/snmptrapd K66mDNSResponder -> ../init.d/mDNSResponder K67nifd -> ../init.d/nifd K68rpcidmapd -> ../init.d/rpcidmapd K69rpcgssd -> ../init.d/rpcgssd K74ntpd -> ../init.d/ntpd K87named -> ../init.d/named K89netplugd -> ../init.d/netplugd K89rdisc -> ../init.d/rdisc S05kudzu -> ../init.d/kudzu S08iptables -> ../init.d/iptables S10network -> ../init.d/network S12syslog -> ../init.d/syslog S13portmap -> ../init.d/portmap S14nfslock -> ../init.d/nfslock S25netfs -> ../init.d/netfs S26lm_sensors -> ../init.d/lm_sensors S50hplip -> ../init.d/hplip S55cups -> ../init.d/cups S56xinetd -> ../init.d/xinetd S60nfs -> ../init.d/nfs S85gpm -> ../init.d/gpm S85httpd -> ../init.d/httpd S90xfs -> ../init.d/xfs S91smb -> ../init.d/smb S97messagebus -> ../init.d/messagebus S98haldaemon -> ../init.d/haldaemon S99local -> ../rc.local S99webmin -> /etc/init.d/webmin |
Подкаталог init.d содержит уже не ссылки, а скрипты, управляющие работой для тех служб, которые обычно запускаются в системе (NFS, sendmail, cron, syslog, httpd и т. п.).
Рассмотрим, для примера, один из этих скриптов,
/etc/init.d/network
, который
(надеюсь, вы не будете удивлены) управляет запуском сетевых служб.
Если вы запустите его с опцией stop -
/etc/init.d/network stop
, работа с сетью будет остановлена.
Если же выполнить его в следующей форме
/etc/init.d/network start
сеть будет снова запущена.
Различные скрипты из каталога init.d воспринимают различное число опций (или параметров запуска), но все они понимают опции stop, start и restart. Полный список допустимых опций запуска скрипта можно получить, запустив его на выполнение без аргументов:
Листинг 14. Вывод списка допустимых параметров вызова скрипта.
[root]# /etc/init.d/network Usage: /etc/init.d/network {start|stop|restart|reload|status} [root]# /etc/init.d/httpd Usage: /etc/init.d/httpd {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest} |
А можно просто заглянуть в текст скрипта и просмотреть, какие варианты заданы в команде case. В листинге 15 приведен для примера полный текст скрипта /etc/rc.d/init.d/webmin из системы ASP Linux 11. Выбор именно этого скрипта обусловлен только тем, что он имеет относительно маленький объем. Но общие принципы построения таких скриптов он позволяет проиллюстрировать.
Листинг 15. Текст скрипта запуска-останова службы webmin
#!/bin/sh # chkconfig: 235 99 10 # description: Start or stop the Webmin server # ### BEGIN INIT INFO # Provides: webmin # Required-Start: $network $syslog # Required-Stop: $network # Default-Start: 2 3 5 # Default-Stop: 0 1 6 # Description: Start or stop the Webmin server ### END INIT INFO start=/etc/webmin/start stop=/etc/webmin/stop lockfile=/var/lock/subsys/webmin confFile=/etc/webmin/miniserv.conf pidFile=/var/webmin/miniserv.pid name='Webmin' case "$1" in 'start') $start >/dev/null 2>&1 <dev/null RETVAL=$? if [ "$RETVAL" = "0" ]; then touch $lockfile >/dev/null 2>&1 fi ;; 'stop') $stop RETVAL=$? if [ "$RETVAL" = "0" ]; then rm -f $lockfile fi ;; 'status') pidfile=`grep "^pidfile=" $confFile | sed -e 's/pidfile=//g'` if [ "$pidfile" = "" ]; then pidfile=$pidFile fi if [ -s $pidfile ]; then pid=`cat $pidfile` kill -0 $pid >/dev/null 2>&1 if [ "$?" = "0" ]; then echo "$name (pid $pid) is running" RETVAL=0 else echo "$name is stopped" RETVAL=1 fi else echo "$name is stopped" RETVAL=1 fi ;; 'restart') $stop && $start RETVAL=$? ;; *) echo "Usage: $0 { start | stop | restart }" RETVAL=1 ;; esac exit $RETVAL |
7.2. Скрипт /etc/rc.d/rc
Теперь, когда вы знаете, как организована структура объектов, используемых скриптом /etc/rc.d/rc, можно перейти к рассмотрению самого этого скрипта. В качестве примера ниже будет использоваться скрипт /etc/rc.d/rc из системы Mandriva Free 2007.1, приведенный в приложении 3При рассмотрении этого скрипта надо иметь в виду, что в общем случае он предназначен для перевода системы с одного уровня выполнения на другой. В процессе начальной загрузки этот скрипт переводит систему из однопользовательского режима на уровень, задаваемый по умолчанию. Поэтому общий прицип работы этого скрипта заключается в следующем. Вначале он останавливает те службы, которые не нужны на новом уровне выполнения, для чего последовательно (в порядке присвоенных номеров NN) вызывает программы, на которые указывают ссылки с именами вида KNNname из каталога /etc/rc.d/rcZ.d, где Z — номер уровня выполнения (смотри пример из листинга 13). При этом программы вызываются с аргументом stop, т. е. соответствующие службы останавливаются. Затем так же последовательно перебираются ссылки с именами SNNname и соответствующие программы вызываются с параметром start. Из сказанного ясно, что буквы (символы) S и K, с которых начинаются имена ссылок в подкаталогах rcX.d, происходят от start и kill, соответственно. Отметим еще раз, что двузначные номера NN в именах ссылок определяют порядок запуска скриптов в каталоге, а name обычно является именем соответствующей программы (это имя приводится, скорее всего, просто для удобства администрирования, его отсутствие ничего бы не изменило).
Если вы хотите остановить или наоборот запустить какую-то из стандартных
системных служб, вы можете сделать это, вызвав соответствющий скрипт, например,
[root]# /etc/rc.d/rc5.d/S10network startили
[root]# /etc/rc.d/init.d/network start
service
, которая позволяет
сделать то же самое, не набирая в командной строке полный путь в соответствующему
скрипту:
[root]# service network startОднако, очевидно, что эта утилита будет корректно работать только в том случае, если скрипт вызова службы находится в стандартном каталоге. Впрочем, сама утилита /sbin/service представляет собой скрипт оболочки, в одной из начальных строк которого этот каталог и задается.
Если вы сами установили в систему какую-то программу и хотите, чтобы она всегда запускалась при старте системы, не требуя от вас каких-то дополнительных телодвижений, вы можете создать соответствующий управляющий скрипт (а, может быть, он включен разработчиком в дистрибутив программы), который разместить в стандартном каталоге /etc/rc.d/init.d (в некоторых дистрибутивах это будет /etc/init.d/, хотя в большинстве случаев один из этих каталогов является просто ссылкой на другой). После этого нужно просто создать ссылку вида SNNnewprogram в каталогах /etc/rc.d/rcZ.d для тех уровней выполнения, на которых вы желаете запускать вашу программу. Все это нетрудно проделать "вручную", хотя существуют специальные утилиты, с помощью которых можно легко скорректировать состав служб, запускаемых на разных уровнях. В Red Hat такая утилита называется redhat-config-services, в Debian - rcconf. Существуют и графические варианты таких утилит, например, system-config-services (я пользовался ею в ASP Linux 11). Но, если вы желаете проделать все эти операции вручную, то теперь вы знаете, как это сделать.
Одна из последних ссылок вида SXXname (обычно это
S99local
), используемых скриптом
rc на уровнях 2–5, является ссылка на скрипт /etc/rc.d/rc.local.
Как сказано в самом этом файле, этот скрипт выполняется после всех других
скриптов в процессе инициализации системы, поэтому если вы хотите,
чтобы в процессе загрузки были выполнены какие-то дополнительные
команды или ваши персональные настройки, то их целесообразно
поместить именно сюда.
В последних версиях дистрибутивов скрипт /etc/rc.d/rc.local либо вообще пуст (хотя еще и сохраняется), либо выполняет очень ограниченные задачи. И некоторые авторы вообще не рекомендуют им пользоваться.
7.3. Системные сервисы (демоны)
Как вы могли видеть из приведенного описания работы скрипта rc, большое значение для результирующей конфигурации системы имеют программы, вызываемые из этого скрипта, размещенные по большей части в каталоге /etc/rc.d/init.d. Я буду называть программы этого класса системными сервисами, поскольку они выполняют в системе служебные функции и во многом определяют функциональность системы.
Можно было бы здесь рассмотреть полный список системных служб, их назначение и вопрос о том, как оптимизировать набор этих служб для вашей системы. Однако это будет уже отклонением от генерального направления данных заметок. Поэтому я ограничусь упоминанием двух статей, в который вы можете найти сооответствющий материал. Одна из них - это моя попытка подступиться в рассмотрению списка системных демонов (см. [44]), в вторая - сделанный мной перевод [45] статьи Len DiMaggio, в котором дано описание большинства системных служб и даны очень полезные ссылки, по которым можно найти дополнительные материалы.
Возможно, я со временем и дополню настоящий раздел, включив в него тексты из упомянутых источников и дополнив, по-возможности, собственными наблюдениями, а пока вернемся на главное направление, где мы подошли к запуску процессов getty.
Назад | Оглавление | Вперед |