@ Карта сайта News Автора!

Bog BOS: Загрузка Linux

Последние изменения:
2024.03.28: sysadmin: Файловая система zfs под Linux для архива (обновление от 0.6 до 2.2)

Последнее изменение файла: 2023.12.12
Скопировано с www.bog.pp.ru: 2024.04.26

Bog BOS: Загрузка Linux

В статье описывается процесс загрузки Linux (x86, GRUB, SysV init): последовательность выполнения, настройка загрузчиков и /etc/inittab, systemctl.

Последовательность загрузки (x86 и x86_64) в режиме BIOS (полный PnP)

  1. инициализация контроллера RAM
  2. декомпрессия BIOS из флеш в RAM
  3. защита от записи захваченного куска и передача туда управления
  4. POST (Power On Self Test) - процедура идентификации, тестирования и конфигурации оборудования
  5. процедура IPL - Initial Program Load (по мотивам BBS, PnP BIOS, PCI Local Bus, PXE Specification)
  6. первоначальный загрузчик находит и загружает программу загрузки 2 этапа (stage 2) и передаёт ей управление (GRUB, LILO, SYSLINUX); используется BIOS API; обычное место загрузчика 2 этапа - /boot/
  7. загрузчик 2 этапа выбирает, находит и загружает ядро и RAM диск (initrd) в память; GRUB читает конфигурацию из /boot/grub/grub.conf; конфигурация для LILO хранится в MBR; GRUB и LILO позволяют вывести список возможных загружаемых систем на экран и выбрать нужную с помощью клавиатуры; GRUB позволяет изменить параметры загрузки (корневая файловая система, ядро, RAM диск, параметры ядра) с помощью текстового редактора; используется BIOS API; RAM диск содержит образ файловой системы с модулями (драйверами) устройств, необходимыми для монтирования корневой файловой системы; в случае со встроенным Linux RAM диск содержит всю систему
  8. ядро повторно обходит и инициализирует периферийные устройства, для которых есть встроенные драйвера
  9. ядро монтирует RAM диск (предварительно разжав) и загружает с него необходимые модули, инициализирует соответствующие устройства
  10. если необходимо, то ядро инициализирует LVM и программный RAID
  11. ядро размонтирует RAM диск и освобождает занимаемую им память
  12. ядро монтирует корневую файловую систему в режиме "только чтение"; в процессе дальнейшей работы ядро загружает дополнительные модули с корневой файловой системы
  13. запускается процесс /sbin/init (далее описывается загрузка в стиле System V)
  14. init разбирает конфигурационный файл /etc/inittab для определения дальнейших действий; если при загрузке указан уровень s (или S), то inittab не читается, а система переходит в однопользовательский режим (shell на /dev/console с правами root); строка с действием initdefault определяет "уровень выполнения" (run level) по умолчанию, т.е. режим работы системы (однопользовательская, многопользовательская, с доступом в сеть, с графическим окружением и т.д.); строка с действием sysinit (/etc/rc.d/rc.sysinit) определяет скрипт инициализации;
  15. init выполняет скрипт /etc/rc.d/rc.sysinit (проверка и монтирование остальных файловых систем, swap и т.д.)
  16. в "нормальном" /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; реальность несколько сложнее

Последовательность загрузки (x86 и x86_64) в режиме UEFI и systemd

  1. инициализация платформы UEFI
  2. менеджер загрузки UEFI выбирает драйверы и приложения из списка
  3. загрузка ядра и RAM диска; RAM диск содержит образ файловой системы с модулями (драйверами) устройств, необходимыми для монтирования корневой файловой системы; в случае со встроенным Linux RAM диск содержит всю систему
  4. ядро повторно обходит и инициализирует периферийные устройства, для которых есть встроенные драйвера
  5. ядро монтирует RAM диск (предварительно разжав) и загружает с него необходимые модули, инициализирует соответствующие устройства - dracut
  6. ядро размонтирует RAM диск и освобождает занимаемую им память
  7. ядро монтирует корневую файловую систему в режиме "только чтение"; в процессе дальнейшей работы ядро загружает дополнительные модули с корневой файловой системы
  8. запускается процесс /usr/lib/systemd/systemd
  9. тут будет длинный рассказ после того как systemd устоится

systemd

systemd (LGPL) - управление системой и сервисам. RHEL/CentOS 7.9 - версия 219. Запускается как PID 1 вместо initd (sysvinit). Для совместимости поддерживает скрипты инициализации LSB. Управляет запуском модулей (unit) и отслеживает зависимость между модулями. В будущем заменит собой все системные сервисы Linux. Уже имеется сервис журнализации (systemd-journal вместо syslog), управление сеансами пользователей (systemd-logind вместо ConsoleKit), временем и сетевым временем (timedated и timesyncd вместо ntpd/chronyd), именем хоста (вместо hostbame), именами DNS (systemd-resolved вместо библиотеки resolv), локалью (localed вместо ?), контейнерами и виртуальными машинами (systemd-nspawn, machinectl, systemd-machined.service), учётными записями, настройками, сетевыми интерфейсами (networkd, networkctl, /lib/systemd/network/ вместо network-scripts и nmcli), монтированием (вместо /etc/fstab и mount) и монтированием по требованию (вместо automount), замена chroot и UEFI загрузчику (systemd-boot), systemd-tmpfiles, systemd-udevd. Кстати, Gnome 3.8 и выше не работает без systemd. Использует D-Bus, cgroups и Unix-сокеты для общения между процессами. Контролирует состояние модулей и реагирует на их изменение. Позволяет активировать сервисы по зависимостям, обращению к портам (замена inetd, xinetd.service?), по расписанию (замена cron).

Типы модулей

Основной файл настройки - /etc/systemd/system.conf (/etc/systemd/system/).

systemctl - утилита управления, systemd-analyze - трассировка загрузки.

systemctl

systemctl - основная управляющая утилита systemd. Файл настройки - /etc/systemd/system.conf.

Список сервисов: systemctl [--all] [--state={active|failed}] {list-units|list-unit-files} [режим-работы].

Управление работой сервисов: systemctl {is-active|status|start|stop|reload|restart} имя-сервиса.

Управление запуском сервисов при загрузке: systemctl {disable|enable|preset} имя-сервиса.

Управление режимом работы (аналог уровня в inittab): systemctl set-default {graphical.target|multi-user.target|rescue.target}. Ключ ядра systemd.unit=имя-режима. Сервис debug-shell обеспечивает оболочку во время загрузки (enable).

Перезапуск systemd: systemctl daemon-reload. Необходимо, например, при добавлении сервиса.

Перезагрузка: systemctl reboot [--firmware-setup]. 7 Ctrl-Alt-Del в течении 2 секунд - немедленная перезагрузка.

Привычный /etc/rc.local лежит в /etc/rc.d/rc.local, настройки systemd сервиса rc-local расположены в /usr/lib/systemd/system/rc-local.service, запускается в режиме multi-user.target после network.target, предварительно необходимо дать права на выполнение

chmod u+x /etc/rc.d/rc.local

Пример своего сервиса (/usr/lib/systemd/system/имя-сервиса.service):

[Unit]
Description=Confluence
After=network.target nss-lookup.target

[Service]
Type=forking
WorkingDirectory=/home/confluence/atlassian-confluence-5.9.7
ExecStart=/home/confluence/atlassian-confluence-5.9.7/bin/start-confluence.sh
PIDFile=/home/confluence/atlassian-confluence-5.9.7/work/catalina.pid
ExecStop=/home/confluence/atlassian-confluence-5.9.7/bin/stop-confluence.sh
ExecReload=/home/confluence/atlassian-confluence-5.9.7/bin/stop-confluence.sh | sleep 60 | /home/confluence/atlassian-confluence-5.9.7/bin/start-confluence.sh
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=Confluence
SyslogFacility=daemon
IOSchedulingClass=best-effort
Restart=on-failure

[Install]
WantedBy=multi-user.target

/etc/fstab превращается в модули *.mount на лету (не совсем корректно).

systemd-analyze set-log-level notice

systemd-logind и loginctl

systemd-hostnamed, systemd-resolved

Загрузчики

В различных дистрибутивах и различных ситуациях могут использоваться следующие загрузчики:

LILO и GRUB работают через BIOS, а большинство BIOS позволяют доступ только к первым двум IDE-дискам (считая ATAPI CD-ROM) в пределах первых 1023 цилиндров. Так что каталог (или раздел) /boot, в котором хранятся как файлы самого загрузчика, так и загружаемые файлы (ядро, initrd) должен удовлетворять данным ограничениям.

Уровни выполнения и /etc/inittab

Формат файла /etc/inittab (комментарии начинаются с символа '#'):

идентификатор:перечень-уровней-выполнения:действие:процесс

где

При запуске процесса устанавливаются переменные окружения: PATH, INIT_VERSION, RUNLEVEL, PREVLEVEL, CONSOLE.

Уровни выполнения для Red Hat Linux:

Переход на другой уровень можно сделать с помощью программы telinit или прямо через /dev/initctl. telinit с указанием уровня q (Q) заставляет init перечитать /etc/inittab. Использование SIGPWR и /etc/powerstatus признано устаревшим.

Загрузчик может передать процессу init параметры

Ссылки

@ Карта сайта News Автора!

Bog BOS: Загрузка Linux

Последние изменения:
2024.03.28: sysadmin: Файловая система zfs под Linux для архива (обновление от 0.6 до 2.2)



Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru