Linux etc rc d init d
Библиотека сайта rus-linux.net
Этап 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
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
[root]# /etc/init.d/network Usage: /etc/init.d/network
#!/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 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.
Назад | Оглавление | Вперед |
What’s the connection between «/etc/init.d» and «/etc/rcX.d» directories in Linux?
I am learning command line from a book called «Linux Command Line and Shell Scripting Bible, Second Edition.» The book states this:
Some Linux implementations contain a table of processes to start automatically on bootup. On Linux systems, this table is usually located in the special file /etc/inittabs. Other systems (such as the popular Ubuntu Linux distribution) utilize the /etc/init.d folder, which contains scripts for starting and stopping individual applications at boot time. The scripts are started via entries under the /etc/rcX.d folders, where X is a run level.
Probably because I am new to linux, I did not understand what the second paragraph quoted meant. Can someone explain the same in a much plainer language?
@bdowning This one’s different. I have a context. The questions I see in the page you linked to are different from this, IMO.
4 Answers 4
Let’s forget init.d or rcx.d and keep things very simple. Imagine you were programming a program whose sole responsibility is to run or kill other scripts one by one.
However your next problem is to make sure they run in order. How would you perform that?
And lets imagine this program looked inside a scripts folder for running the scripts. To order the priority of scripts you would name them in lets say numerical order. This order is what dictates the relation between init.d and rc
In other words init.d contains the scripts to run and the rcX.d contains their order to run.
The X value in rcX.d is the run level. This could be loosely translated to the OS current state.
If you dig inside the rcX.d scripts you will find this formatting:
- X is replaced with K or S , which stands for whether the script should be killed or started in the current run level
- xx is the order number
- abcd is the script name (the name is irrelevant however where it points is the script this will run)
There are several different init systems for Linux. The main ones are SysVinit (the traditional one), Upstart (Ubuntu’s replacement), and SystemD (pushed by Fedora and Gnome). The directories /etc/init.d and /etc/rc?.d are used by SysVinit. The book may be mentioning them with regards to Ubuntu because the information is a bit dated (Ubuntu used to use SysVinit like everyone else) or because those directories still exist for compatibility.
/etc/init.d contains a bunch of scripts, each containing instructions to start and stop a service. Some of these services need to be started at boot time; others need to be started in multiuser mode but not in single-user maintenance mode; and it’s possible to define different modes with different sets of desired services. SysVinit manages this through runlevels. The directory /etc/rc$N.d contain the scripts to run when entering runlevel N ( /etc/rc$N.d/S* ) and the scripts to run when leaving runlevel N ( /etc/rc$N.d/K* ). Because many runlevels have scripts in common, rather than store a copy of the scripts for each runlevel, the scripts are all stored in a single location /etc/init.d , and the runlevel-specific directories /etc/rc?.d contain symbolic links. Furthermore the names of the symbolic links indicate whether the service is to be started ( S* ) or stopped (killed, K* ) in that runlevel, and a numeric prefix is used to control the order in which the scripts are executed.
The script responsible for traversing /etc/rc$N.d is /etc/init.d/rc (on pre-Upstart Ubuntu and on Debian; locations may vary on other Linux distributions).