Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта 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

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

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.


Назад Оглавление Вперед