INIT(1M)
НАЗВАНИЕ
init - инициализация управления процессами
СИНТАКСИС
/etc/init [0] [1] [2] [3] [4] [5] [6] [S] [s] [Q] [q] [a] [b] [c]
ОПИСАНИЕ
Процесс init является главным диспетчером процессов.
Его основная задача - создание процессов в соответствии
со схемой, хранящейся в файле /etc/inittab [см.
inittab(4)]. Схема обычно предписывает запуск процессов
getty для всех терминальных линий, посредством которых
пользователи могут войти в систему. Init также контролирует работу автономных процессов, требующихся конкретной системе.
С точки зрения процесса init система в любой момент
времени находится на определенном уровне выполнения.
Уровень_выполнения может рассматриваться как программная конфигурация системы, причем каждая конфигурация допускает существование только определенной группы процессов. Процессы, запускаемые init'ом на каждом уровне
выполнения, описаны в файле inittab. Возможны восемь
уровней выполнения: от 0 до 6, S и s. Уровень выполнения изменяется при запуске init'а привилегированным пользователем. Запущенный пользователем init посылает соответствующие сигналы исходному процессу init, созданному при перезагрузке системы, сообщая, на какой уровень выполнения надо перейти.
Процесс init запускается в рамках системы UNIX в качестве последнего шага процедуры загрузки. Сначала init ищет в файле /etc/inittab строку initdefault [см.
inittab(4)]. Если таковая имеется, то init использует
ее для определения начального значения уровня выполнения. Если такой строки нет, то init запрашивает начальное значение уровня выполнения у пользователя через
виртуальную системную консоль, /dev/syscon. Если в ответ вводится буква S или s, init переходит в однопользовательский режим (SINGLE USER). Это единственный уровень выполнения, который не требует наличия заранее
подготовленного файла /etc/inittab. Иными словами, если
файл inittab не существует, то допускается работа только в однопользовательском режиме. При этом виртуальная
консоль открывается на чтение и запись и сразу же выполняется команда /bin/su -root. Для выхода из однопользовательского режима следует использовать init, так
как при завершении shell'а по концу файла init только
переинициализирует однопользовательский режим.
Если во время загрузки виртуальная системная консоль
(/dev/syscon) связана не с физической системной консолью, подключенной к процессору (/dev/console), то при
запросе нового уровня выполнения процесс init может потерпеть неудачу.
В ответ на вопрос о новом уровне выполнения можно ввести только одну из цифр от 0 до 6 либо буквы S или s.
Любой другой ответ будет отвергнут и вопрос будет задан
вновь.
При вводе S или s init действует как описано выше для
однопользовательского режима и, кроме того, связывает
/dev/syscon с терминалом пользователя, делая его виртуальной системной консолью. На физическую консоль /dev/
console выводится сообщение о переназначении виртуальной консоли.
При первом запуске init'а и при каждом переходе из однопользовательского режима на другой уровень выполнения, init устанавливает характеристики виртуальной консоли, /dev/syscon, с помощью вызова ioctl(2), в соответствии с хранящимися в файле /etc/ioctl.syscon характеристиками. Этот файл записывается процессом init при
переходе в однопользовательский режим.
Если в качестве ответа введена цифра от 0 до 6, то init
устанавливает соответствующий уровень выполнения.
Если init впервые перешел на уровень выполнения, отличный от однопользовательского, то сначала файл inittab
просматривается в поисках строк, где в качестве действия указаны boot или bootwait. Процессы, соответствующие этим строкам, запускаются перед какой-либо другой
обработкой inittab при условии, что введенный уровень
выполнения совпадает с указанным в строке. Таким образом, перед тем, как пользователи получат доступ к системе, могут быть произведены некоторые начальные действия, такие, например, как монтирование файловых систем.
Затем в файле inittab ищутся все строки, которые должны
быть обработаны на данном уровне выполнения.
Уровень выполнения 2 определяется как содержащий все
процессы для терминалов и демоны, которые должны работать в многопользовательском окружении, поэтому данный
режим называют многопользовательским (MULTI-USER).
Уровень выполнения 3 предназначен для работы с системой
разделения удаленных файлов. Он является расширением
многопользовательского режима.
Уровень выполнения 4 можно определить как некий дополнительный многопользовательский режим; он не является
необходимым для работы системы и обычно не используется.
Можно запустить init, указав в качестве аргумента один
из псевдоуровней a, b или c. Реальный уровень выполнения при этом не изменяется, а в смысле порождения процессов псевдоуровни не отличаются от реальных. Обычно
псевдоуровни используют для выполнения группы команд.
Для многопользовательского режима файл inittab подготавливается таким образом, чтобы init создавал процесс для каждого пользовательского терминала.
Каждый процесс shell, запущенный с терминала, в конце
концов будет завершен либо из-за получения символа конца файла, либо из-за освобождения линии. Когда init получает сигнал, о том, что запущенный им процесс завершен, он записывает этот факт и причину завершения в
файлы /etc/utmp и /etc/wtmp, если последний существует
[см. who(1)]. История процессов, запускаемых init'ом,
хранится в файле /etc/wtmp.
Для запуска процессов, упомянутых в файле inittab, init
читает весь файл и для каждой строки, процесс в которой
требует перезапуска, порождается потомок. После запуска
всех процессов, указанных в файле inittab, init ожидает, пока либо один из его потомков завершится, либо будет получен сигнал об ошибке питания, либо порожденный
пользователем init предпишет изменить уровень выполнения. Когда одно из перечисленных условий становится истинным, init вновь просматривает файл inittab. Добавлять строки в файл inittab можно в любое время, однако
init все равно будет ожидать одно из трех вышеуказанных
событий. Чтобы заставить init немедленно обработать
файл inittab, его следует разбудить командами init Q
или init q.
Если init получает сигнал об ошибке питания (SIGPWR),
он просматривает файл inittab в поисках строк с действиями powerfail и powerwait. Соответствующие этим строкам процессы (если позволяет уровень выполнения) будут
выполнены в первую очередь. Таким образом, init может
выполнять различные процедуры при завершении работы
операционной системы. Заметим, что в однопользовательском режиме выполняются только строки powerfail и powerwait.
Если процессом init получен запрос на изменение уровня
выполнения, он посылает сигнал-предупреждение SIGTERM
всем процессам, которые не должны работать на требуемом
уровне выполнения. Затем, выждав 5 секунд, init уничтожает их сигналом SIGKILL.
Для формирования подразумеваемого окружения процессов
init читает файл /etc/TIMEZONE.
ФАЙЛЫ
/etc/inittab
/etc/utmp
/etc/wtmp
/etc/TIMEZONE
/dev/console
/dev/syscon
/etc/ioctl.syscon
СМ. ТАКЖЕ
getty(1M), termio(7).
login(1), sh(1), who(1) в Справочнике пользователя.
kill(2), inittab(4), utmp(4) в Справочнике программиста.
ДИАГНОСТИКА
Если init обнаружит, что действия, связанные с какой
либо строкой из /etc/inittab, были выполнены более 10
раз за 2 минуты, он делает вывод, что в этой строке
имеется ошибка, и выдает сообщение на системную консоль. Затем он игнорирует строку с ошибкой, пока либо
не пройдет пять минут, либо не придет сигнал от запущенного пользователем init'а. Это предохраняет init от
пожирания системных ресурсов, как в случае описки в
файле inittab, так и в случае неосторожного удаления
программы, упомянутой в /etc/inittab.