Процедура загрузки ОС Linux

ОС Linux работает в 2-х режимах: однопользовательском (режим пользователя root, в этом режиме настраивается ОС) и многопользовательский (режим работы всех пользователей).

После включения питания компьютера и завершения тестирования аппаратной части BIOS считывает из первого сектора загрузочного диска короткую программу загрузчик. Эта программа запускает основной системный загрузчик (например, LILO), который, в свою очередь, загружает в память ядро системы vmlinuz - x.y.z- a, которое обычно хранится в файле в каталоге /boot. Здесь x.y.z --- это номер версии ядра, а вместо символа "а" часто стоит указание на какие то конкретные модификации ядра.

Сразу после загрузки ядро монтирует корневую файловую систему и запускает процесс init. Процесс init --- это программа, которая ответственна за продолжение процедуры загрузки, и перевод системы от начального состояния, возникающего после загрузки ядра, в стандартное состояние обработки запросов многих пользователей. Процесс init выполняет еще массу различных операций, необходимых для дальнейшей работы системы: проверку и монтирование файловых систем, запуск различных служб (демонов), запуск процедур регистрации, оболочек пользователей на различных терминалах и т. д.

Точный список этих операций зависит от так называемого уровня выполнения (run level). Уровень выполнения определяет перечень действий, выполняемых процессом init, и состояние системы после загрузки, т. е. конфигурацию запущенных процессов. Уровень выполнения идентифицируется одним символом. В ОС Linux существует 8 основных уровней выполнения:

0- остановка системы;

1- однопользовательский режим (для специальных случаев администрирования);

2 - многопользовательский режим без NFS (то же, что и 3, если компьютер не работает с сетью);

3 - полный многопользовательский режим;

4 - использование не регламентировано;

5 - обычно используется для запуска системы в графическом режиме;

6 - перезагрузка системы;

S (или s) --- примерно то же, что и однопользовательский режим, но S и s

используются в основном в скриптах.

Как видите, уровни 0, 1 и 6 зарезервированы для особых случаев. Относительно того, как использовать уровни со 2 по 5, единого мнения не существует.

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

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

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

Далее важная функция, которую выполняет этот процесс (на уровнях со 2 по 5) --- запуск шести виртуальных консолей (процессов getty), чтобы предоставить пользователям возможность регистрироваться в системе с терминалов. Для этого init порождает процессы, именуемые getty процессами, и следит за тем, какой из процессов открывает какой терминал. Каждый getty процесс устанавливает свою группу процессов, используя вызов системной функции setpgrp, открывает отдельную терминальную линию и обычно приостанавливается во время выполнения функции open до тех пор, пока машина не получит аппаратную связь с терминалом. Когда функция open возвращает управление, getty процесс исполняет программу login (регистрации в системе), которая требует от пользователей, чтобы они идентифицировали себя указанием регистрационного имени и пароля. Если пользователь зарегистрировался успешно, программа login, запускает командный процессор shell и пользователь приступает к работе. Этот вызов shell именуется "login shell" (регистрационный shell, регистрационный интерпретатор команд). Процесс, связанный с shell, имеет тот же идентификатор, что и начальный getty процесс, поэтому login shell является процессом, возглавляющим группу процессов.

Если пользователь не смог успешно зарегистрироваться, программа регистрации завершается через определенный промежуток времени, закрывая открытую терминальную линию, а процесс init порождает для этой линии следующий getty – процесс открывающий терминал, вместо прекратившего существование.

После завершения загрузки init продолжает работать в фоновом режиме, отслеживая изменения в состоянии системы.

Таким образом, процесс начальной загрузки init постоянно находится в оперативной памяти и при получении соответствующих сигналов повторно выполняет цикл чтения из файла /etc/inittab о том, что нужно делать, при чем этот набор инструкций различен для разных уровней выполнения.

Когда суперпользователь останавливает систему (командой shutdown), именно init завершает все другие исполняющиеся процессы, размонтирует все файловые системы и останавливает процессор.