Познай свою ОС

j1m (j1m@list.ru)

Хакер, номер #080, стр. 080-098-1

Процесс загрузки Linux в подробностях

Ты никогда не задумывался над тем, что происходит с твоим любимым пингвином во время загрузки? Какие действия предпринимает система для того, чтобы ты без лишних усилий смог смотреть фильмы, слушать музыку, общаться в IRC и вообще работать с операционной системой? Ответы на эти вопросы ты найдешь в этой статье.

[пролог]

Как известно, процесс загрузки операционной системы начинается с загрузчика (lilo или grub), которому передает управление BIOS материнской платы. Загрузчик в свою очередь подгружает в память образ ядра, находящийся в каталоге /boot, и предоставляет ему все полномочия. Ядро проводит многочисленные тесты и инициализации, активирует драйвера и запускает процесс init (PID = 1). После этого ядро уже не способно контролировать дальнейшую загрузку, и вся ответственность ложится на плечи init.

[init: глава семейства]

Задачa init - запуск стартовых скриптов, которые как раз и отвечают за последующие действия по загрузке ОС, проверку файловых систем, поднятие сетевых интерфейсов, запуск демонов и т.д. Получив абсолютную власть, init первым делом читает свой конфиг /etc/inittab, чтобы узнать о дефолтном уровне запуска и о том, на какие именно скрипты следует возложить бразды управления загрузкой.

Уровни запуска init

0. Выключение.

1. Однопользовательский режим.

2. Многопользовательский режим без сети.

3. Многопользовательский режим.

4. Не используется.

5. Многопользовательский режим, плюс запуск X-Window.

6. Перезагрузка.

Для примера рассмотрим файл /etc/inittab из Slackware 10.1. Строка "id:3:initdefault:" устанавливает третий уровень запуска. Следующая запись "si:S:sysinit:/etc/rc.d/rc.S" означает, что скрипт /etc/rc.d/rc.S должен грузиться первым, вне зависимости от уровня запуска. Далее по тексту можно найти строку "rc:2345:wait:/etc/rc.d/rc.M", говорящую о том, что для уровней со второго по пятый следует запустить скрипт "/etc/rc.d/rc.M".

[SystemV vs BSD]

Различают два типа стартовых скриптов: SystemV и BSD. Первые применялись в оригинальном UNIX, а вторые в системах семейства BSD. Различия между ними довольно существенные. SystemV-скрипты делают процесс инициализации более гибким, поддающимся настройке, зато BSD-скрипты отличаются своей простотой (хотя в современных BSD по гибкости и удобству настройки даже опережают SystemV-скрипты).

Изначально (на заре появления 386BSD) BSD-скрипты представляли собой семь файлов (/etc/rc.0 - rc.6), каждый из которых отвечал за инициализацию на одном из семи уровней запуска. Начальной инициализацией занимался скрипт /etc/rc.sysinit (или просто /etc/sysinit). В настоящее время такую схему загрузки (в несколько потрепанном виде) можно встретить в Linux дистрибутивах Slackware и CRUX. В современных же BSD-системах используются иные скрипты, которые унаследовали от своих предшественников только основную идею. В общем виде эти скрипты выглядят так:

Схема инициализации BSD

/etc/sysinit - скрипт начальной инициализации

/etc/rc - отвечает за инициализацию на уровнях 2-5

/etc/rc.shutdown - отвечает за инициализацию на уровнях 0, 1 и 6

Содержание  Вперед на стр. 080-098-2
ttfb: 3.3650398254395 ms