Процедура загрузки ОС 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 завершает все другие исполняющиеся процессы, размонтирует все файловые системы и останавливает процессор.