Выбрать главу

Первым делом после старта процесс init считывает свой конфигурационный файл /etc/inittab. Этот файл состоит из отдельных строк. Если строка начинается со знака # или пуста, то она игнорируется. Все остальные строки состоят из 4 полей, разделенных двоеточиями:

id:runlevels:action:process

где:

• id - идентификатор строки. Это произвольная комбинация, содержащая от 1 до 4 символов. В файле inittab не может быть двух строк с одинаковыми идентификаторами;

• runlevels - уровни выполнения, на которых эта строка будет задействована. Уровни задаются цифрами или буквами без разделителей, например, 345;

• process - процесс, который должен запускаться на указанных уровнях. Другими словами в этом поле указывается имя программы, вызываемой при переходе на указанные уровни выполнения;

• action - действие.

В поле action стоит ключевое слово, которое определяет дополнительные условия выполнения команды, заданной полем process. Допустимые значения поля action:

• respawn - перезапустить процесс в случае завершения его работы;

• once - выполнить процесс только один раз при переходе на указанный уровень;

• wait - процесс будет запущен один раз при переходе на указанный уровень и init будет ожидать завершения работы этого процесса, прежде, чем продолжать работу;

• sysinit - это ключевое слово обозначает действия, выполняемые в процессе загрузки системы независимо от уровня выполнения (поле runlevels игнорируется). Процессы, помеченные этим словом, запускаются до процессов, помеченных словами boot и bootwait;

• boot - процесс будет запущен на этапе загрузки системы независимо от уровня выполнения;

• bootwait - процесс будет запущен на этапе загрузки системы независимо от уровня выполнения, и init будет дожидаться его завершения;

• initdefault - строка, в которой это слово стоит в поле action, определяет уровень выполнения, на который система переходит по умолчанию. Поле process в этой строке игнорируется. Если уровень выполнения, используемый по умолчанию, не задан, то процесс init будет ждать, пока пользователь, запускающий систему, не введет его с консоли;

• off - игнорировать данный элемент;

• powerwait - позволяет процессу init остановить систему, когда пропало питание. Использование этого слова предполагает, что имеется источник бесперебойного питания (UPS) и программное обеспечение, которое отслеживает состояние UPS и информирует init о том, что питание отключилось;

• ctrlaltdel - разрешает init перезагрузить систему, когда пользователь нажимает комбинацию клавиш ‹Ctrl›+‹Alt›+‹Del› на клавиатуре. Обратите внимание на то, что системный администратор может определить действия по комбинации клавиш ‹Ctrl›+‹Alt›+‹Del›, например игнорировать нажатие этой комбинации (что вполне разумно в системе, где много пользователей).

Этот список не является исчерпывающим. Более подробно о файле inittab можно узнать из man-страниц init (8), inittab (5) и getty (8).

Обработка файла /etc/inittab процессом init начинается в однопользовательском режиме (уровень 1), в котором единственным пользователем является пользователь root, работающий с консоли. Первым делом init находит строку, которая определяет, какой уровень выполнения запускается по умолчанию:

id:3:initdefault:

Это и будет тот уровень, в котором запустится и будет работать система после загрузки, поэтому естественно, что нельзя указывать в строке initdefault уровни 0 и 6.

Далее init выполняет команды, указанные в строке с ключевым словом sysinit. В стандартной конфигурации здесь выполняется скрипт rc.sysinit из каталога /etc/rc.d. После этого процесс init просматривает файл /etc/inittab и выполняет скрипты, соответствующие однопользовательскому уровню (1 во втором поле строки), всем уровням (строки с пустым вторым полем) и уровню, заданному по умолчанию. В строке, соответствующей уровню по умолчанию, вызывается скрипт rc из каталога /etc/rc.d. Этот скрипт один и тот же для всех уровней (т. е. обязательно вызывается, на какой бы уровень выполнения не загружалась система), только в зависимости от уровня выполнения ему передается соответствующее значение параметра вызова, так что, например, для 3-го уровня вызов скрипта осуществляется строкой типа