Scroll to navigation

BOOT(7) Руководство программиста Linux BOOT(7)

ИМЯ

boot-scripts - общее описание последовательности загрузки системы

ОПИСАНИЕ

Последовательность загрузки варьируется в отдельных местах на разных системах, но в целом все равно разбивается на несколько основных шагов: (i) включение оборудования, (ii) загрузчик ОС, (iii) запуск ядра, (iv) работа init и inittab, (v) загрузочные сценарии. Теперь опишем каждый из этих шагов более подробно.

Включение оборудования

После включения компьютера или аппаратной перезагрузки управление передаётся программе, хранящейся в памяти, доступной только на чтение (обычно это PROM). В мире ПК эта программа называется BIOS.

Эта программа обычно осуществляет простейшие тесты компьютера и читает дополнительные из энергонезависимой памяти. Эта память в ПК реализована на памяти CMOS с питанием от батареи, и для краткости называется просто CMOS, хотя официальное её название вне мира ПК — nvram (non-volatile ram).

Параметры, хранящиеся в nvram, отличаются в разных системах, но как минимум там хранится информация о загрузочном устройстве или о порядке поиска загрузочного устройства.

Затем аппаратный загрузчик обращается к загрузочному устройству, загружает загрузчик операционной системы, расположенный в определённом месте устройства, и передаёт ему управление дальнейшей загрузкой.

Примечание:
Здесь не рассматривается загрузка по сети. Те, кто хочет исследовать эту область, должны искать и изучать документацию по DHCP, TFTP, PXE, Etherboot.

Загрузчик ОС

На ПК загрузчик операционной системы расположен в первом секторе загрузочного устройства — в так называемой главной загрузочной записи MBR (Master Boot Record).

В большинстве систем этот начальный загрузчик в силу разных обстоятельств крайне ограничен. Даже на не ПК существуют некоторые ограничения на размер и сложность загрузчика, ну а ограничение MBR до 512 байт на ПК (включая таблицу разделов) делает совершенно невозможным полностью разместить там полноценный загрузчик ОС.

Поэтому, в большинстве операционных систем начальный загрузчик вызывает вторичный загрузчик ОС, расположенный в определённом дисковом разделе.

В Linux системным загрузчиком ОС обычно является программа lilo(8) или grub(8). Оби они могут устанавливаться как вторичные загрузчики (то есть раздел DOS с установленным MBR указывает на них), либо как загрузчик из двух частей, где первая часть кода в MBR запускает вторую, расположенную в корневом разделе.

Основной задачей загрузчика ОС является определение ядра на диске, затем его загрузка в память и запуск. Большинство системных загрузчиков имеют интерактивный режим, позволяют указывать альтернативное ядро (резервное, если не заработает последнее собранное) и передавать ядру необязательные параметры при загрузке.

Запуск ядра

Когда ядро загружено, то оно: инициализирует устройства (через их драйвера), запускает процесс создания виртуальной памяти на диске (этот «процесс ядра» в последних ядрах Linux теперь называется kswapd), и монтирует корневую файловую систему (/).

Некоторые из параметров, передаваемые ядру, уже могут влиять на эти действия (например, вы можете переопределить корневую файловую систему по умолчанию). Для получения более подробной информации о параметрах ядра Linux читайте bootparam(7).

Только после этого ядро создаёт первый процесс (пользовательский) с номером 1. Этот процесс исполняет программу /sbin/init, передавая ей все оставшиеся параметры загрузки, не обработанные ядром.

Работа init и inittab

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

Это позволяет системному администратору легко управлять схемой загрузки, так как с каждым уровнем выполнения определён свой набор служб (например, S это однопользовательский (single-user) режим, на уровне 2 запускаются почти все сетевые службы). Администратор может изменить текущий уровень выполнения с помощью init(8) и определить текущий уровень, используя runlevel(8).

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

Загрузочные сценарии

Примечание:
Следующее описание применимо к системам, основанным на System V release 4, к которым на текущий момент относится большинство коммерческих UNIX-систем (Solaris, HP-UX, Irix, Tru64), а также основные дистрибутивы Linux (Red Hat, Debian, Mandriva, SUSE, Ubuntu). Некоторые системы (Slackware Linux, FreeBSD, OpenBSD) имеют немного другую схему работы загрузочных сценариев.

Для каждой управляемой службы (почтовой, сервера nfs, cron и т.п.) существует отдельный сценарий запуска в особом каталоге (/etc/init.d в большинстве версий Linux). Каждый из этих сценариев воспринимает в качестве отдельного аргумента слово «start» (вызывает запуск сценария) или слово «stop» (остановка службы). Сценарий может (необязательно) воспринимать и другие параметры (например, «restart» для остановки и запуска, «status» для отображения состояния службы). Запуск сценария без параметров обычно покажет все возможные аргументы.

Последовательность каталогов запуска

Для того, чтобы разные сценарии запускались/останавливались на разных уровнях выполнения в некотором, чётко определённом порядке, существует так называемая последовательность каталогов запуска. Это список каталогов, обычно в /etc/rc[0-6S].d. В каждом из этих каталогов есть ссылки (обычно символьные) на сценарии в каталоге /etc/init.d.

Первичный сценарий (обычно /etc/rc) вызывается из inittab(5) и запускает остальные сценарии служб через ссылки в подкаталогах. Все ссылки с именами, начинающимися на 'S' вызываются с аргументом «start» (т.е. запускают службы). Все ссылки с именами, начинающимися на 'K' запускаются с аргументом «stop» (тем самым останавливая службу).

Для придания порядка запуску или остановки сценариев в одном уровне выполнения имена ссылок содержат порядковые номера. Также для понимания смысла имён они обычно заканчиваются на имя службы, которую они обслуживают. Например: ссылка /etc/rc2.d/S80sendmail запускает службу sendmail на уровне выполнения 2. Это случится после запуска /etc/rc2.d/S12syslog, но перед запуском /etc/rc2.d/S90xfs.

Для управления порядком загрузки и уровнями выполнения нужно просто привести эти файлы в нужный вам вид. Однако, во многих версиях Linux существуют инструменты, помогающие в решении задач по управлению службами (например: chkconfig(8)).

Настройки загрузки

Обычно запускаемые службы могут дополнительно воспринимать разные параметры командной строки. Для изменения таких параметров системным администраторам без редактирования текста сценария загрузки можно использовать файлы настроек. Они расположены в особом каталоге (обычно /etc/sysconfig в системах Red Hat) и используются загрузочными сценариями.

В старых системах UNIX эти файлы содержали именно параметры командной строки для запуска служб, но в современных системах Linux (а также в HP-UX) эти файлы просто содержат разные переменные оболочки. Загрузочные сценарии в /etc/init.d просматривают сначала эти файлы настроек и лишь потом используют значения переменных.

ФАЙЛЫ

/etc/init.d/, /etc/rc[S0-6].d/, /etc/sysconfig/

СМОТРИТЕ ТАКЖЕ

inittab(5), bootparam(7), init(8), runlevel(8), shutdown(8)

2010-09-19 Linux