 | Запуск системы и процессы загрузки
Что происходит, когда включается компьютер с ОС Linux?
Давайте разделим процесс загрузки ОС Linux на девять этапов, которые имеют место практически для любой конфигурации ОС Linux:
- Первый этап загрузки -- это считывание BOIS'ом компьютера или другими программно-аппаратными средствами MBR жесткого диска или другого загрузочного устройства (например, компакт-диска, гибкого диска или сетевого загрузочного устройства, etc.).
- Начинается работа загрузчика. Linux на архитектуре x86 обычно использует LILO или GRUB. Некоторые старые системы могут использовать loadlin чтобы загрузиться через вспомогательный DOS-раздел. В системах Power PC® это может быть BootX или yaboot. Вообще, загрузчик -- это простая программа, которая, тем не менее, знает, где искать ядро Linux, может выбрать, какую загружать из нескольких версий ядра или даже выбрать другую операционную систему на той же машине.
- Загрузка ядра Linux.
- Монтируется корневая файловая система. В некоторых случаях, временно монтируется начальная корневая файловая система из содержимого, например, RAM-диска, инициализируемого загрузчиком, чтобы дать возможность загружаться специальным драйверам и модулям, которые могут понадобиться для работы настоящей корневой файловой системы.
Теперь у нас есть корневая файловая система, и мы можем начать собственно инициализацию.
- Запускается процесс
init, прародитель всех остальных процессов в ОС Linux.
- Считывается содержание файла /etc/inittab, чтобы определиться с дальнейшим ходом загрузки. Особенно важно что прописано в файле /etc/inittab в строке, определяющей уровень запуска системы (и, следовательно, последующие этапы загрузки).
Действительно, все происходящее после этого момента полностью определяется содержимым файла /etc/inittab. Фактически, скрипты и другие инструменты, которые работают, подчиняются соответствующим настройкам, но, в принципе, вы могли бы полностью изменить /etc/inittab, чтобы управлять работой различных инструментов по вашему желанию.
Одна из установок в файле /etc/inittab особенно важна. Это строка, похожая на:
id:5:initdefault:
Обычно она находится ближе к началу файла и устанавливает уровень запуска системы. Уровень запуска определяет, какие действия будут предприняты в оставшихся предписаниях файла /etc/inittab.
Что происходит, когда сценарий /etc/inittab отработан? И особенно, какие именно файлы и директории принимают участие в процессе?
- Инициализация, независимая от уровня запуска. Существуют ряд действий, которые будут выполняться независимо от установленного уровня запуска. Эти шаги обозначены в /etc/inittab строками, похожими на:
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
В некоторых системах Linux (в основном в системах на основе Debian), вы скорее увидите строчки, более похожие на следующие:
si::sysinit:/etc/init.d/rcS
В последнем случае файл /etc/init.d/rcS -- это просто скрипт, который по очереди запускает скрипты /etc/rcS.d/[Ss]??*. С другой стороны, если в вашей системе используется /etc/rc.d/rc.sysinit, для выполнения инициализации достаточно одного длинного скрипта, содержащегося в этом файле.
- Инициализация, зависимая от уровня запуска. Фактически, вы можете определить столько действий, связанных с уровнем запуска, сколько захотите, и при этом каждое действие может относиться к одному или нескольким уровням запуска. Как правило, /etc/inittab будет содержать строки типа:
l0:0:wait:/etc/rc.d/rc 0
# ...
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
В свою очередь, скрипт /etc/rc.d/rc будет управлять всеми файлами, названными /etc/rc$1.d/[KkSs]??*. В следующем примере можно увидеть, что в данной системе, стартующей с уровнем запуска 5, будут выполняться (по порядку):
/etc/rc5.d/K15postgresql
/etc/rc5.d/S01switchprofile
/etc/rc5.d/S05harddrake
...
/etc/rc5.d/S55sshd
...
/etc/rc5.d/S99linuxconf
/etc/rc5.d/S99local
Файлы, начинающиеся с "K" или "k" являются убивающими (kill) скриптами, они завершают процессы или упорядочивают их действия (последствия).
Файлы, которые начинаются с "S" или "s" -- это запускающие (startup) скрипты, они начинают новые процессы или подготавливают систему к работе с этим уровнем запуска. Большинство из них являются скриптами shell, и большая часть их будет ссылками (часто на /etc/init.d/).
В то время когда система Linux стартует с определенным уровнем запуска, вы хотите зарегистрироваться в системе как пользователь. Чтобы авторизация прошла успешно, используется программа getty. Множество разновидностей программ на основе getty используется создателями дистрибутивов, типа agetty, mgetty, и mingetty. Но все они делают примерно и то же.
- Войдите в систему в приглашении. Уже знакомый нам /etc/inittab
обычно запускает getty на одном или нескольких виртуальных экранах и делает это для нескольких уровней запуска. Уровни определены в строках типа:
# 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
Цифра в начале показывает, в каком виртуальном терминале будет работать программа getty; следующие несколько цифр -- это те уровни запуска, при которых это случится (например, запуск mingetty при каждом из уровней 2, 3, 4 и 5).
Следующие шаги инициируют запуск дополнительных служб, вход в графическое окружение, восстановление настроек пользовательского интерфейса или других более персонифицированных деталей, которые находятся вне рамок этого учебного пособия.
Понятие уровня запуска
Понятие уровня запуска несколько произвольно, по крайней мере, оно не прописано в ядро Linux. Действительные уровни запуска сопоставлены набору номеров, чтобы можно было установить (или изменить имеющийся) по умолчанию уровень запуска выбором номера от 0 до 6. В соответствии с соглашением, следующий смысл присваивается каждому номеру уровня запуска:
Листинг 1. Уровни запуска
# Default runlevel. The runlevels used by Mandrake Linux are:
# 0 - Halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you don't have networking)
# 3 - Full multiuser mode
# 4 - Unused
# 5 - X11
# 6 - Reboot (Do NOT set initdefault to this)
|
Это соглашение, как можно видеть, используется в дистрибутиве Mandrake Linux, но большинство дистрибутивов используют то же самое соглашение. Может так оказаться, что текстовые или встроенные дистрибутивы не используют некоторые из уровней запуска, но все равно ими будут зарезервированы эти же номера.
Конфигурационные строки в /etc/inittab
Вы видели множество строчек из файла /etc/inittab в примерах, но что же конкретно они означают? Каждая строка имеет формат:
id:runlevels:action:process
Поле id это короткое сокращение, обозначающее конфигурационную строчку. (1 - 4 буквы в свежих версиях init; 1 - 2 в более старых). Поле runlevels уже обсуждалось. Следующее поле action обозначает действие, предпринимаемое строкой. Некоторые действия могут быть "специальными," такие как:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
Эта строка устанавливает действие для последовательности клавиш Ctrl-Alt-Delete (независимо от уровня запуска). Но большинство действий просто запускает соответствующие процессы. Частичный список действий включает:
-
respawn: Процесс будет перезапущен всякий раз, когда завершится (как в случае с getty).
-
wait:Процесс будет начат однажды, когда будет введен указанный уровень запуска, и init будет ждать его завершения.
-
once: Процесс будет выполнен однажды, когда будет введен указанный уровень запуска.
-
boot: Процесс будет выполнен во время загрузки системы (но после sysinit). Уровень запуска не имеет значения.
|  |