ОПИСАНИЕ
Процесс запуска (или «последовательность запуска») варьируется в отдельных местах на разных системах, но в целом её можно разделить на несколько основных шагов, управляемых следующими компонентами:
- 1.
- оборудование
- 2.
- загрузчик операционной системы
- 3.
- ядро
- 4.
- начальный процесс пользовательского пространства (init и inittab)
- 5.
- загрузочные сценарии
Далее следует их более подробное описание.
Оборудование
После подачи питания или аппаратной перезагрузки управление передаётся программе, хранящейся в памяти, доступной только на чтение (обычно это PROM). По историческим причинам, связанным с персональными компьютерами, эту программу часто называют BIOS.Эта программа, обычно, выполняет простейшие тесты компьютера и читает дополнительные из энергонезависимой памяти. Эта память в ПК реализована на базе памяти CMOS с питанием от батареи, и для краткости называется просто CMOS, хотя её официальное название вне мира ПК — NVRAM (nonvolatile RAM).
Параметры, хранящиеся в NVRAM, отличаются в разных системах, но как минимум, в ней хранится информация об устройстве с загрузчиком ОС или о порядке просмотра устройств; такое устройство называют загрузочным устройством. На аппаратной загрузочной стадии из постоянного места загрузочного устройства загружается загрузчик ОС, а затем ему передаётся управление.
- Примечание:
- Устройство, с которого может быть прочитан загрузчик ОС, может находиться в сети; в этом случае детали загрузки определяются протоколами типа DHCP, TFTP, PXE, Etherboot и т. п.
Загрузчик ОС
Основной задачей загрузчика ОС является поиск ядра на некоем устройстве, загрузка его в память и запуск. Большинство загрузчиков ОС имеют интерактивный режим, позволяют указывать альтернативное ядро (резервное, если не заработает последнее собранное) и передавать ядру необязательные параметры.В обычных ПК загрузчик ОС расположен в начальном 512-байтовом блоке загрузочного устройства — в так называемой главной загрузочной записи MBR (Master Boot Record).
В большинстве систем загрузчик ОС в силу разных обстоятельств крайне ограничен. Даже на не ПК существуют некоторые ограничения на размер и сложность загрузчика, ну а ограничение MBR до 512 байт на ПК (включая таблицу разделов) делает почти невозможным сделать его многофункциональным.
Поэтому, в большинстве систем действие по загрузке ОС разделено между первичным загрузчиком ОС и вторичным загрузчиком ОС; вторичный загрузчик ОС может находиться внутри большего постоянного хранилища, например в определённом дисковом разделе.
В Linux системным загрузчиком ОС часто является программа lilo(8) или grub(8).
Ядро
После загрузки ядро инициализирует различные компоненты компьютера и ОС; каждая часть ПО, ответственного за эту задачу, обычно, считается драйвером какого-то компонента. Ядро запускает процесс создания виртуальной памяти (это процесс ядра, в современных ядрах Linux называется «kswapd») и монтирует одну из файловых систем в качестве корневой (/).Некоторые из параметров, которые могли быть переданы ядру, влияют на эти действия (например, можно переопределить корневую файловую систему по умолчанию). Для получения более подробной информации о параметрах ядра Linux читайте bootparam(7).
Только после этого ядро создаёт первый пользовательский процесс PID (идентификатор процесса) которого равен 1. Обычно, этот процесс исполняет программу /sbin/init, передавая ей все оставшиеся параметры загрузки, не обработанные ядром.
Корневой процесс пользовательского пространства
- Примечание:
- Дальнейшее описание применимо к ОС на основе UNIX System V Release 4. Однако, в некоторых широко используемых системах используется похожий, но существенно отличающийся подход, называемый systemd(1), процесс загрузки которого подробно описан в bootup(7).
При запуске /sbin/init считывается файл /etc/inittab для получения дальнейших инструкций. Этот файл определяет, что должно быть запущено, когда программа /sbin/init получит команду перейти на определённый уровень выполнения (run-level). Это позволяет администратору легко настроить окружение под какую-то задачу; для каждого уровня выполнения определён свой набор служб (например, S это однопользовательский (single-user) режим, на уровне 2 запускаются почти все сетевые службы).
Администратор может изменить текущий уровень выполнения с помощью init(1) и определить текущий уровень, используя runlevel(8).
Однако, было бы неудобно управлять отдельными службами в одном файле, поэтому в /etc/inittab указывается набор сценариев, в действительности только запускающих/останавливающих отдельные службы.
Загрузочные сценарии
- Примечание:
- Следующее описание применимо к системам, основанным на UNIX System V Release 4. Однако в некоторых широко используемых системах (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.
Через управление этими ссылками осуществляется управление порядком загрузки и уровнями выполнения; во многих системах существуют инструменты, помогающие в решении этой задачи (например, chkconfig(8)).
Настройки загрузки
Программу, предоставляющую службу, часто называют демоном (daemon). Обычно, демоны могут воспринимать разные параметры командной строки и параметры. Для изменения таких параметров системным администраторам без редактирования текста сценария загрузки можно использовать отдельные файлы настроек. Они расположены в особом каталоге (обычно, /etc/sysconfig в старых системах Red Hat) и используются загрузочными сценариями.В старых системах UNIX эти файлы содержали именно параметры командной строки демона, но в современных системах Linux (а также в HP-UX) эти файлы просто содержат разные переменные оболочки. Загрузочные сценарии в /etc/init.d читают и включают эти файлы настроек (то есть, выполняют команду sources для своего файла настройки) и после этого используют значения переменных.
ФАЙЛЫ
/etc/init.d/, /etc/rc[S0-6].d/, /etc/sysconfig/