защита от записи захваченного куска и передача туда управления
обход периферии и установка дополнительных модулей BIOS в ROM (VGA, SCSI)
POST и инициализация поддерживаемых BIOS устройств
проверка устройств, указанных как пригодных для загрузки, на наличие
"магического" слова (про загрузку с CD-ROM см. описание спецификации
El Torito)
загрузка загрузочного сектора (< 512 байт) в память и передача ему
управления; если загрузка с жёсткого диска, то загрузочный сектор
лежит в MBR (первом секторе, Master Boot Record) главного (master)
жёсткого диска на первой шине ATA
первоначальный загрузчик находит и загружает программу загрузки 2 этапа
(stage 2) и передаёт ей управление (GRUB, LILO, SYSLINUX);
используется BIOS API; обычное место загрузчика 2 этапа - /boot/
загрузчик 2 этапа выбирает, находит и загружает ядро и RAM диск (initrd)
в память;
GRUB читает конфигурацию из /boot/grub/grub.conf;
конфигурация для LILO хранится в MBR;
GRUB и LILO позволяют вывести список возможных загружаемых систем
на экран и выбрать нужную с помощью клавиатуры;
GRUB позволяет изменить параметры загрузки (корневая файловая система,
ядро, RAM диск, параметры ядра) с помощью текстового редактора;
используется BIOS API;
RAM диск содержит образ файловой системы с модулями (драйверами)
устройств, необходимыми для монтирования корневой файловой системы;
в случае со встроенным Linux RAM диск содержит всю систему
ядро повторно обходит и инициализирует периферийные устройства,
для которых есть встроенные драйвера
ядро монтирует RAM диск (предварительно разжав) и загружает
с него необходимые модули,
инициализирует соответствующие устройства
если необходимо, то ядро инициализирует LVM и программный RAID
ядро размонтирует RAM диск и освобождает занимаемую им память
ядро монтирует корневую файловую систему в режиме "только чтение";
в процессе дальнейшей работы ядро загружает дополнительные модули
с корневой файловой системы
запускается процесс /sbin/init (далее описывается загрузка в стиле
System V)
init разбирает конфигурационный файл /etc/inittab
для определения дальнейших действий;
если при загрузке указан уровень s (или S), то inittab не читается,
а система переходит в однопользовательский режим (shell на
/dev/console с правами root);
строка с действием initdefault определяет
"уровень выполнения" (run level) по умолчанию, т.е. режим работы системы
(однопользовательская, многопользовательская, с доступом в сеть,
с графическим окружением и т.д.);
строка с действием sysinit (/etc/rc.d/rc.sysinit) определяет
скрипт инициализации;
init выполняет скрипт /etc/rc.d/rc.sysinit (проверка и монтирование
остальных файловых систем, swap и т.д.)
в "нормальном" /etc/inittab при переходе на любой уровень запускается
скрипт /etc/rc.d/rc с указанием уровня в качестве параметра;
данный скрипт запускает скрипты /etc/rcуровень.d/K*
(в алфавитном порядке) с параметром stop и скрипты
/etc/rcуровень.d/S* с параметром start;
в конце запускается /etc/rc.d/rc.local;
по традиции скрипты являются символьными ссылками
на скрипты в директории /etc/init.d/;
вместо /etc/init.d/ может использоваться /etc/rc.d/init.d/;
вместо /etc/rcуровень.d/ может использоваться /etc/rc.d/rcуровень.d;
реальность несколько сложнее
LILO и GRUB работают через BIOS,
а большинство BIOS позволяют доступ только
к первым двум IDE-дискам (считая ATAPI CD-ROM) в пределах первых 1023 цилиндров.
Так что каталог (или раздел) /boot, в котором хранятся как файлы самого
загрузчика, так и загружаемые файлы (ядро, initrd) должен удовлетворять
данным ограничениям.
идентификатор - уникальная последовательность от 1 до 4 символов
(в старых версиях до 2); для getty и ему подобных идентификатор
д.б. номером линии tty
перечень-уровней-выполнения - перечисление (без пробела) уровней
выполнения, для которых выполняется указанное действие
(от 0 до 6 и от A до C, s, S); для sysinit, boot и bootwait
игнорируется; при смене уровня всем процессам, не специфицированным
для этого уровня, посылается сигнал SIGTERM, а через 5 секунд (интервал
задаётся при вызове telinit -t) сигнал SIGKILL
(init предполагает, что процесс не сменил группу процессов, в которой
он его запустил);
пустой список означает "для всех"
действие (по-моему, тут перемешанны условия и действия)
respawn (процесс по завершении запускается вновь и вновь;
после 10 перезапусков за 2 минуты делается пауза 5 минут)
wait (процесс запускается один раз при переходе на уровень,
init ждёт его завершения)
once (процесс запускается один раз при переходе на уровень)
boot (процесс запускается при загрузке системы)
bootwait (процесс запускается при загрузке системы,
init ждёт его завершения)
off (ничего не делать)
ondemand (процесс запускается при вызове данного уровня
выполнения (от A до C), но смены уровня не происходит)
initdefault (на какой уровень выполнения переходить после загрузки;
если не указан, то будет спрашивать на консоли)
sysinit (процесс запускается при загрузке до boot и bootwait)
powerwait (вызывается при пропадании питания, например, программой
слежения за UPS,
SIGPWR (подробности в /etc/powerstatus: FAIL),
init ждёт его завершения)
powerfail (вызывается при пропадании питания, например, программой
слежения за UPS,
SIGPWR (подробности в /etc/powerstatus: FAIL),
init не ждёт его завершения)
powerokwait (вызывается при возобновлении питания,
SIGPWR (подробности в /etc/powerstatus: OK),
init ждёт его завершения)
powerfailnow (вызывается непосредственно перед исчерпанием
аккумуляторов UPS, SIGPWR (подробности в /etc/powerstatus: LOW))
ctrlaltdel (вызывается при получении сигнала SIGINT от ядра)
kbrequest (ядро посылает SIGWINCH при нажатии определённой
комбинации клавиш)
процесс - имя файла ('+' перед символом отменяет запись utmp и wtmp),
программа или скрипт
При запуске процесса устанавливаются переменные окружения:
PATH, INIT_VERSION, RUNLEVEL, PREVLEVEL, CONSOLE.
Уровни выполнения для Red Hat Linux:
0: halt (неинтереактивный уровень)
1: single user (одна виртуальная консоль)
2: multiuser (6 виртуальных консолей)
3: multiuser + NFS (6 виртуальных консолей)
4: не используется
5: X11 (6 виртуальных консолей и xdm, gdm или kdm
в зависимости от /etc/X11/prefdm)
6: reboot (неинтереактивный уровень)
Переход на другой уровень можно сделать с помощью
программы telinit или прямо через /dev/initctl.
telinit с указанием уровня q (Q) заставляет init
перечитать /etc/inittab. Использование SIGPWR и /etc/powerstatus признано
устаревшим.
Загрузчик может передать процессу init параметры
-s, S, single (загрузка в однопользовательском режиме)
от 1 до 5 (явное задание уровня выполнения)
-b, emergency (однопользовательский режим без выполнения sysinit)