Заочная Школа Программистов
Студия "Unix изнутри"
http://iunix.narod.ru

Предыдущий выпуск рассылки здесь:
http://iunix.narod.ru/material/_N3_bootstrap.html

Выпуск 4. Скрипты, управляющие загрузкой пользовательских процессов.

Работа процесса init. Файл /etc/inittab. Уровни выполнения Linux.
Скрипты, управляющие загрузкой пользовательских процессов.


Итак, ядро Linux загрузилось и завершило инициализацию. Запущен процесс init. Дальнейшее развитие событий очень сильно зависит от настроек системы. Тем не менее, попытаюсь рассказать общие идеи.
Следует отметить такую деталь. Что произойдет, если система не сможет найти файл с процессом init в стандартных местах (/bin/init, /sbin/init, /etc/init)? Это означает, что возникла аварийная ситуация. В этом случае ядро попытается запустить файл /bin/sh, в надежде, что пользователь сможет исправить сложившееся положение вещей. Если же ядро не сможет найти даже командный процессор, то ему остается только вызвать функцию panic.

Работа процесса init
Работа процесса init управляется файлом /etc/inittab. Он содержит инструкции процессу init, какие процессы необходимо запустить. Пример файла inittab, взятый с работающей Linux-машины, можно посмотреть в приложении.
Вообще говоря, администратор может написать свой собственный файл inittab, не следуя никаким канонам. Однако, так делать не рекомендуются, поскольку поддерживать работу такой системы кому-либо, кроме автора будет практически невозможно. Далее будет рассказано о типичной для Linux схемы загрузки.

Уровни выполнения Linux
Знакомство с файлом etc/inittab сразу же сталкивает нас с термином "уровни выполения Linux". Уровни выполнения - это режимы работы init, которые определяют набор системных процессов. Это может быть однопользовательский режим, работа в текстовой консоли без запуска графической оболочки или запуск X-Windows.
Обычно используются следущие уровни выполнения Linux:
Уровень 0 - Выключение системы
Уровень 1 - Однопользовательский режим
Уровни 2-4 - Нормальная работа (настраивается администратором)
Уровень 5 - Нормальная работа + запуск графической оболочки
Уровень 6 - Перезагрузка

Уровни выполнения настраиваются в /etc/inittab строками вида:
ID : уровень : действие : процесс.
Поле ID - это имя элемента файла inittab
Поле уровень указывает на каком уровне выполнения исполняется данная команда. Может быть указано более одного уровня, (например 12345).
Поле действие указывает, что должен делать процесс init: ожидать завершения процесса (wait), выполнить процесс только один раз (once), перезапустить процесс в случае его "смерти" (respawn) или игнорировать данный элемент (off). Есть и другие категории действий, они зависят от версии ядра. В частности, может определяться реакция в случае, если пользователь нажал комбинацию клавиш ctrl+alt+del, действия системы в случае сбоев в электрической сети и т.п. Список всех возможных действий на конкретной системе можно получить командой man inittab.

Выбрать уровень выполнения можно на этапе загрузке ядра, передав ему в командной строке загрузчика соответствующий параметр (1-5 для выбора уровня выполнения или -s для загрузки системы в однопользовательском режиме).

Скрипты, управляющие загрузкой пользовательских процессов
Несколько слов о том, как обычно организована загрузка в Linux (повторюсь, что хотя, системный администратор может изменить эту часть, но рекомендуется оставлять все как есть, чтобы не порождать дополнительную путаницу). В /etc/inittab содержится инструкция выполнить файлы rc.sysinit, rc, и rc.local.
Файл /etc/rc.d/rc выполняет скрипты из каталогов /etc/rc.d/rc0.d /etc/rc.d/rc1.d : /etc/rc.d/rc5.d - в зависимости от уровня выполнения.

Итак, схема выполнения инициализационных скриптов:
/etc/inittab
Из него выполняются:
/etc/rc.d/rc.sysinit
/etc/rd.d/rc [runlevel]
/etc/rc.d/rc.local

Инициализация консоли
После выполнения командных файлов система практически полностью готова к работе. Однако, пока управлять системой еще нельзя. Следующая задача - проинициализировать консоли, чтобы дать возможность пользователям входить в систему.
В современном Linux'е консоли обычно используется виртуальные консоли. Это позволяет войти под несколькими именами в одно время или выполнять разные действия, используя одну клавитуру и один монитор. Переключение между виртуальными консолями осуществляется специальной комбинаций клавиш (обычно это ALT+F1, ALT+F2 и т.д.).
В принципе можно подключить и "физический" терминал (сделав соотвествующие записи в /etc/inittab) - например через COM-порт, как это делалось раньше.
Для каждой консоли, виртуальной или физической, используется отдельный процесс getty. Для виртуальных консолей обычно используется программа /sbin/mingetty. Приглашение login: печатается именно этой программой.
После того, как программы getty запущены, система полностью готова к работе. Пользователь может войти в систему. Впрочем, процесс входа пользователя в систему (login) - это тема для отдельного разговора.

Приложение 1. Пример файла /etc/inittab

#
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Author: Miquel van Smoorenburg,
# Modified for RHS Linux by Marc Ewing and Donnie Barnes
#

# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

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

# Things to run in every runlevel.
ud::once:/sbin/update

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# Run xdm in runlevel 5
# xdm is now a separate service
x:5:respawn:/etc/X11/prefdm -nodaemon

Hosted by uCoz