Linux. Процесс загрузки (часть первая)
Операционная система Линукс довольно сложна, поэтому процесс ее загрузки и остановки некорректно сводить лишь к нажатию кнопки Power. Если вы хотите стать администратором Linux или просто хорошо разбираться в этой ОС, вам нужно представлять себе, что происходит во время загрузки и выгрузки системы.
В то время, когда разработчики операционных систем писали свою Ось под конкретное аппаратное обеспечение, процесс загрузки был достаточно простым. Сегодня же, когда ОС Линукс устанавливается на множество различных конфигураций и аппаратных платформ персональных компьютеров и серверов, процесс инициализации системы должен выполняться по правилам, устанавливаемым компьютером. При этом система должна уметь загружаться на любой конфигурации одинаково хорошо.
Особенности начальной загрузки системы
Начальная загрузка — это период запуска ОС сразу после нажатия кнопки питания. На данном этапе вся власть принадлежит BIOS компьютера, а значит, ОС должна получить «толчок» для того, чтобы загрузить сама себя. В процессе начальной инициализации специальная программа-загрузчик (чаще всего LILO или GRUB) выгружает в оперативную память ядро ОС и активизирует его. Ядро выполняет определенный ряд действий, последним из которых является запуск программы login, результатом чего становится появление диалога авторизации в системе на терминале пользователя. (Под терминалом пользователя мы будем разуметь консоль или графическое приглашение, отображающееся на мониторе).
Период начальной загрузки — это время наибольшей уязвимости вашей ОС. Помехами, делающими невозможным полноценное функционирование системы, могут быть как аппаратные проблемы (отсутствие оборудования, сбои в его работе), так и ошибки в настроечных файлах или ядре. Поэтому настройка процесса загрузки ОС — первая задача, стоящая перед администратором Linux. Ситуация осложняется еще и тем, что для правильной и корректной настройки необходимо хорошо разбираться в принципах функционирования самого Linux.
После включения питания выполняется специальный загрузочный код, хранящийся в постоянном запоминающем устройстве. Этот код запускает ядро системы. Ядро проверяет состояние аппаратных компонентов, после чего запускает демон с идентификатором № 1, носящий название init.
Между запуском init и появлением приглашения к авторизации в системе проходит период, во время которого происходит проверка и монтирование существующих файловых систем и запуск демонов системы. Данные задачи выполняются посредством сценариев интерпретатора команд. Эти сценарии по порядку обрабатываются демоном init. Часто в литературе можно встретить именование сценариев rc-файлами – по имени их префикса. История префикса, являющегося аббревиатурой словосочетания «run command» уходит в далекие шестидесятые годы XX века, к операционной системе CTSS. В настоящее время это название является пережитком и оставлено только по традиции. Содержание и структура сценариев интерактивной загрузки зависит от конкретной системы. В дальнейших статьях мы планируем рассмотреть сценарии загрузки подробнее.
Операционные системы семейства Линукс обладают одним важным свойством, касающимся загрузки — она может выполняться как в автоматическом режиме, так и вручную (пользователем машины).
В автоматическом режиме участия человека не требуется: ядро проводит все процессы загрузки самостоятельно. В ручном режиме инициализация проходит автоматически до определенного этапа, после чего управление передается пользователю. Данный этап носит название «однопользовательского режима» (single user). В данном режиме большая часть демонов (системных процессов) еще не начали работу, и авторизоваться другим пользователям системы нельзя.
В обычном режиме система загружается в полностью автоматическом режиме. Пользователю системы необходимо просто нажать на кнопку питания и ждать, когда Linux пригласит его ввести имя и пароль. Тем не менее, если вы хотите разбираться в системе, вам нужно не только знать, что происходит во время обычной загрузки, но и при необходимости загрузить Linux вручную. Ручная загрузка требуется в том случае, если в системе возникают неполадки, мешающие автоматической инициализации. В таком случае, система передает управление оператору (человеку сидящему за терминалом). Подобное может произойти, например, при нарушении целостности файловой системы или при ошибках в конфигурации сетевого адаптера.
Шаги загрузки
Как правило, процесс загрузки систем на основе Linux состоит из шести основных шагов, среди которых:
- загрузка ядра;
- поиск и настройка устройств компьютера;
- создание ядерных процессов;
- (опционально, при загрузке вручную) действия оператора системы;
- выполнение rc-команд;
- переход в многопользовательский режим.
Процессом загрузки системы можно управлять посредством редактирования сценариев запуска (rc-команд).
Рассмотрим каждый шаг загрузки. Первый из них — загрузка и инициализация ядра.
Ядро ОС Линукс – это программа, и первый шаг загрузки заключается в записи этой программы в оперативную память компьютера для последующего выполнения. Файл ядра (kernel) обычно имеет название /boot/vmlinuz или /vmlinuz.
Следует заметить, что процесс загрузки ядра происходит в два этапа. Первый — в оперативную память с помощью BIOS записывается небольшая программка-загрузчик, которой передаются права. Именно она на втором этапе загружает собственно ядро и передает ему управление.
После получения управления ядро проводит тесты, позволяющие выяснить размер оперативной памяти, имеющийся в системе. Некоторые внутренние модули ядра имеют константную величину, поэтому часть памяти сразу резервируется под их нужды. Данный участок памяти оказывается недоступным пользователю. На терминал ядро выдает информацию о размере памяти, имеющейся в системе и размере, доступном оператору.
Следующий шаг — настройка аппаратных средств компьютера. Если вы приняли решение скомпилировать ядро для конкретного компьютера, вы можете собрать указать ему те устройства, наличие которых требуется проверять. В процессе инициализации ядро находит и проверяет все устройства, о которых оно было проинформировано. Главная информация о каждом найденном устройстве выводится на терминал пользователя. Большинство современных дистрибутивов Linux имеют в своем составе ядро, способное без дополнительной перекомпиляции работать на подавляющем большинстве конфигураций ПК.
Тем не менее, информация, которую производитель дистрибутива заложил в ядро, может оказаться неполной. В таком случае, kernel (ядро) подключается к системной шине и собирает необходимую информацию у драйверов устройств, подключенных к ней. Драйвера устройств, которые не отвечают на сигнал ядра или вообще отсутствуют, выключаются. Если устройство добавляется в аппаратную конфигурацию в ходе работы, администратор системы обладает инструментами для включения драйвера ядра.
Третий шаг загрузки — создание процессов ядра. После того, как ядро опросит все аппаратные составляющие, приходит черед создания процессов. Создание данных процессов происходит независимо от fork (стандартного вызова системы). Подробнее о fork будет рассказано в следующих статьях.
Создание таких процессов, являющихся «самовыполняемыми», характерно для всех систем семейства UNIX, но их количество и функции отличаются. Например, в Linux к таким процессам относится демон init, а также обработчики сигналов kernel. Для того чтобы выяснить, какие процессы относятся к «самовыполняемым», можно в консоли набрать команду ps. Идентификаторы этих процессов будут стоять в самом начале, а их названия должны быть в квадратных скобках. В ряде дистрибутивов квадратные скобки убраны.
Пример.
[ilya@localhost ~]$ ps -e
PID TTY TIME CMD
1 ? 00:00:00 init
2 ? 00:00:00 kthreadd
3 ? 00:00:00 migration/0
4 ? 00:00:16 ksoftirqd/0
5 ? 00:00:01 events/0
6 ? 00:00:00 khelper
47 ? 00:00:00 kintegrityd/0
48 ? 00:00:00 kblockd/0
50 ? 00:00:00 kacpid
51 ? 00:00:00 kacpi_notify
132 ? 00:00:00 kseriod
172 ? 00:00:01 pdflush
174 ? 00:00:05 kswapd0
217 ? 00:00:00 aio/0
371 ? 00:00:00 kpsmoused
384 ? 00:00:00 ksuspend_usbd
385 ? 00:00:00 khubd
Как вы видите, часть процессов получает в конце название символ косой черты (слэш) и цифру. Данная цифра обозначает процессор, на котором работает данный демон, что необходимо при конфигурировании многопроцессорных систем.
Из процессов, появляющихся на данном этапе загрузки, только первый, init, можно назвать полноценным процессом. Другие представляют собой модули ядра, которые организованы как системные процессы по соображениям строения системы.
После того, как ядро создаст данные процессы, оно уступает им управление. На следующем этапе главный процесс такой – демон init займется созданием процессов-потомков, отвечающих за базовые операции.




Добавить комментарий