И переход на заданный уровень исполнения
Нормальный ход загрузки GNU/Linux предусматривает запуск процесса
/sbin/init после завершения загрузки и инициализации ядра. Процесс init имеет PID = 1 и запускает разные системные службы. Процесс init также порождает серверы терминалов getty (или им подобные), которые выводят на терминал приглашение login: и передают управление команде /bin/login при попытке входа в сеанс.
В GNU/Linux-системах имеется конфигурационный файл, задающий поведе- ние процесса init при загрузке системы — это файл /etc/inittab. Для разно- видностей GNU/Linux, следующих спецификации System V, определяется понятие уровней исполнения (runlevels). Уровень исполнения — это вариант работы операционной системы, определяющийся конкретным набором про- грамм, запускающимся на нем.
В Red Hat, Novell SUSE и подобных ОС определены следующие уровни ис- полнения:
r 0 — останов системы (halt);
r 1 — административный однопользовательский режим (single user mode);
r 2 — многопользовательский режим без поддержки файловой системы NFS;
r 3 — стандартный многопользовательский режим (multiuser);
r 4 — не используется;
r 5 — многопользовательский режим с запуском X-сервера;
r 6 — перезагрузка (reboot).
Часто определяется уровень исполнения для однопользовательского режи- ма — S.
В некоторых GNU/Linux-системах используется система инициализации, следующая стилю BSD или подобная ему. Например, в Slackware используется BSD-подобная система инициализации, где определены только останов, пере- загрузка системы, однопользовательский режим и многопользовательский режим, а уровней исполнения в обычном понимании нет. В Gentoo Linux при- меняется оригинальная система инициализации, напоминающая BSD, на которой определены такие режимы работы, как boot и default, а обычных уровней исполнения нет.
Дальнейшее изложение относится лишь к системам GNU/Linux, следующим
System V-спецификации процесса инициализации операционной системы.
Процесс init запускает процессы инициализации системы, основываясь на конфигурационных командах в файле /etc/inittab. Формат записей в файле
/etc/inittab следующий: id:runlevels:action:process, где:
r id — уникальный идентификатор записи в файле /etc/inittab, состоящий из
1—4 символов (для старых систем — не более 2-х);
r runlevels — уровни исполнения, на которых выполняется действие;
r action — действие, которое должно быть выполнено;
r process — процесс, который должен быть запущен.
Далее приводится список распространенных действий в /etc/inittab:
r initdefault — строка определяет уровень исполнения по умолчанию;
r sysinit — процесс должен быть запущен единожды при инициализации операционной системы до запуска любых других процессов (не считая, естественно, самого процесса init);
r wait — процесс должен быть запущен при переходе на данный уровень исполнения, причем процесс init, породивший данный процесс, должен дождаться завершения этого процесса перед переходом к следующим дей- ствиям;
r ctrlaltdel — процесс, который должен быть запущен при нажатии в сис- темной консоли комбинации клавиш <Ctrl>+<Alt>+<Del>;
r powerfail — задает процесс, который должен быть запущен при получе- нии от системы управления питанием сигнала об отсутствии питания;
r powerokwait — задает процесс, запускаемый init при возобновлении пи- тания;
r respawn — процесс должен быть запущен заново, если он остановился. Обсудим важнейшие фрагменты файла /etc/inittab.
Сначала рассмотрим пример 13.1.
Пример 13.1. Уровень исполнения по умолчанию |
id:5:initdefault:
Эта строка определяет уровень выполнения по умолчанию — здесь 5-й, т. е. многопользовательский с запуском X-сервера.
В строке, приведенной в примере 13.2, задается выполнение сценария
/etc/rc.d/rc.sysinit при инициализации системы перед запуском других про- цессов.
Пример 13.2. Скрипт первичной инициализации системы |
si::sysinit:/etc/rc.d/rc.sysinit
Блок настроек, показанных в примере 13.3, определяет поведение системы при переходе на заданный уровень выполнения.
Пример 13.3. Скрипты перехода на заданный уровень исполнения |
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
Идея проста: при переходе на уровень исполнения с заданным номером (0—
6) происходит вызов сценария /etc/rc.d/rc, которому в качестве аргумента подставляется цифра — номер требуемого уровня исполнения. Уровень ис- полнения, на котором работает каждая строка, задается во втором поле запи- сей. Дальнейшая инициализация, выполняемая на данном уровне исполне- ния, производится сценарием /etc/rc.d/rc.
В примере 13.4 показана строка настройки для запуска программы getty, вы- водящей приглашение на вход в сеанс login: и ожидающей попытки входа.
Пример 13.4. Запуск сервера терминала |
1:2345:respawn:/sbin/mingetty tty1
Данная строка распространяется на уровни исполнения со 2-го по 5-й и не действует на однопользовательский режим. Обратите внимание, что метка представлена одной цифрой, совпадающей с номером терминала, на котором запущена программа mingetty. Фактически количество доступных виртуаль- ных консолей в системе определяется количеством этих строк в файле
/etc/inittab.
Если в файле /etc/inittab произведены изменения, то они вступят в силу либо после перезагрузки системы, либо после команды /sbin/init q. Еще один способ сделать это — передать процессу init (PID = 1) сигнал SIGHUP.
Итак, при переходе на требуемый уровень исполнения в Red Hat срабатывает сценарий /etc/rc.d/rc, деятельность которого ограничивается запуском сцена- риев в каталогах с именами вида: /etc/rc.d/rc#.d.
В системах System V каталога /etc/rc.d нет и имена каталогов инициализации имеют вид: /etc/rc#.d, где вместо знака решетки подставляется номер требуе- мого уровня исполнения, например, каталог /etc/rc2.d соответствует 2-му уровню исполнения.
Если выполнить команду ls -l /etc/rc3.d, то можно убедиться, что содер- жащиеся в нем файлы представляют собой символические ссылки на файлы инициализационных сценариев, находящиеся в каталоге /etc/init.d.
Имена файлов — символических ссылок формируются следующим образом:
1. Сначала устанавливается либо буква S для сценариев, запускающих неко- торую службу, или буква K для сценариев, останавливающих какую-либо службу (все имена файлов, начинающихся с чего-либо другого, игнори- руются).
2. Далее следует порядковый номер запуска сценария, предназначенный для упорядочивания процесса запуска и останова служб.
3. Завершается имя ссылки строкой — именем (условным) службы.
Итак, все ссылки, имена которых начинаются с S (start), запускают что-либо, а ссылки, имена которых начинаются с K (kill), — останавливают. Порядко- вые номера предотвращают несвоевременные попытки запуска каких-либо сервисов. Например, служба электронной почты запускается ссылкой S80sendmail после инициализации сети ссылкой S10network.
Например, для инициализации сетевых интерфейсов следует набрать коман- ду, показанную в примере 13.5.
Пример 13.5. Запуск сценария инициализации сетевого интерфейса |
/etc/init.d/network start
Сценарий /etc/rc.d/rc, перебирая файлы символических ссылок в каталогах инициализации, для всех символических ссылок, имена которых начинаются с S, добавляют через пробел к имени ссылки слово start, запуская так служ- бы. А для ссылок с именами, начинающимися с K, — слово stop.
В Red Hat и подобных системах запуск и останов служб удобно выполнять с помощью команды /sbin/service (пример 13.6).
Пример 13.6. Запуск служб в Red Hat |
service network start
Эта команда инициализирует сетевой интерфейс.
Таким образом, для того чтобы некоторая служба автоматически запускалась на заданном уровне исполнения, требуется иметь сценарий инициализации этой службы (желательно поместить его в стандартном каталоге /etc/init.d) и символические ссылки, размещаемые в каталогах /etc/rc#.d, где вместо ре- шетки следует подставить требуемые уровни исполнения.
В Red Hat, SUSE и подобных системах удобно пользоваться командой chkconfig, позволяющей настроить поведение сценариев инициализации на разных уровнях исполнения. Приведенная в примере 13.7 команда отобразит все сценарии запуска служб и уровни выполнения, на которых они запуска- ются.
Пример 13.7. Получение таблицы запуска служб |
chkconfig ––list
Для добавления службы в список автоматического запуска надо вызвать команду chkconfig с опцией ––add, а для удаления службы — с опцией
––del. Для определения уровней исполнения, на которых будет работать тре- буемый сценарий, необходимо использовать опцию ––level. Команда в при- мере 13.8 определяет, что сетевой интерфейс должен работать на 2, 3, 4 и 5-м уровнях исполнения.
Пример 13.8. Настройка запуска службы по уровням исполнения |
chkconfig ––level 2345 network on
В Ubuntu имеется аналогичная chkconfig утилита sysv-rc-conf, обладающая удобными интерактивными возможностями.
Команда runlevel показывает текущий уровень исполнения (пример 13.9).
Пример 13.9. Определение уровня исполнения |
# runlevel N 5
Команда runlevel выводит два значения — предыдущий уровень исполне- ния (в примере он неизвестен — N) и текущий (здесь — 5).
Перейти на другой уровень исполнения можно с помощью команды
/sbin/init (пример 13.10).
Пример 13.10. Переход в однопользовательский режим |
/sbin/init 1
Дата добавления: 2015-06-12; просмотров: 992;