мета-данные страницы
Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| notes:howlinuxworks:vol5 [2026/05/13 17:56] – создано radi0dev | notes:howlinuxworks:vol5 [2026/05/14 14:36] (текущий) – radi0dev | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====== Глава 5: Загрузка ядра Linux ====== | ====== Глава 5: Загрузка ядра Linux ====== | ||
| + | Упрощенно процесс загрузки выглядит следующим образом: | ||
| + | - BIOS или загрузочная программа компьютера загружается и запускает загрузчик. | ||
| + | - Загрузчик находит образ ядра на диске, загружает его в память и запускает. | ||
| + | - Ядро инициализирует устройства и их драйверы. | ||
| + | - Ядро монтирует корневую файловую систему. | ||
| + | - Ядро запускает программу под названием init с идентификатором процесса 1. Эта точка является началом пользовательского пространства. | ||
| + | - Программа init приводит в действие остальные системные процессы. | ||
| + | - В какой-то момент запускается процесс, | ||
| + | |||
| + | ===== 5.1 Сообщения при загрузке ===== | ||
| + | |||
| + | При запуске '' | ||
| + | |||
| + | Если у вас нет системы systemd, можете поискать файл журнала ''/ | ||
| + | |||
| + | ===== 5.2 Параметры инициализации и загрузки ядра ===== | ||
| + | |||
| + | При запуске ядро Linux инициализируется в таком порядке: | ||
| + | - Проверка процессора. | ||
| + | - Проверка памяти. | ||
| + | - Обнаружение шины устройства. | ||
| + | - Обнаружение устройств. | ||
| + | - Настройка вспомогательной подсистемы ядра (сеть и т.п.). | ||
| + | - Монтирование корневой файловой системы. | ||
| + | - Запуск пользовательского пространства. | ||
| + | |||
| + | ===== 5.3 Параметры ядра ===== | ||
| + | |||
| + | Вы можете изучить параметры, | ||
| + | |||
| + | Обзор основных параметров загрузки ядра приведен | ||
| + | |||
| + | Обнаружив незнакомый параметр, | ||
| + | |||
| + | ===== 5.4 Загрузчики ===== | ||
| + | |||
| + | В начале загрузки, | ||
| + | |||
| + | Ядро находится в сжатом виде в корневом разделе (как правило) или в своем собственном разделе на диске. Таким образом загрузчику нужно получить доступ к диску не имея загруженного ядра и его драйверов диска. Для этого BIOS / UEFI использует LBA - универсальный простой способ доступа к данным с любого диска, но его производительность довольно низка. Это не проблема, | ||
| + | |||
| + | ===== 5.5 Введение в загрузчик GRUB ===== | ||
| + | |||
| + | **GRUB** (Grand Unified Boot Loader) - главный унифицированный загрузчик. Рассматриваем GRUB 2. | ||
| + | |||
| + | Основная возможность: | ||
| + | |||
| + | ^ Система ^ Клавиша ^ | ||
| + | | BIOS | Shift (удерживать при загрузке) | | ||
| + | | UEFI | Esc | | ||
| + | |||
| + | В меню: | ||
| + | * **e** - редактировать конфигурацию загрузки | ||
| + | * **c** - открыть командную строку GRUB | ||
| + | |||
| + | Путаница возникает из-за двух разных понятий **root**: | ||
| + | |||
| + | ^ Значение root ^ Область ^ Назначение ^ | ||
| + | | GRUB root | Только GRUB | ФС, где GRUB ищет ядро и initrd | | ||
| + | | Kernel root | Параметр ядра | Корневая ФС системы (после загрузки) | | ||
| + | |||
| + | **Пример конфигурации: | ||
| + | - '' | ||
| + | - '' | ||
| + | - '' | ||
| + | - '' | ||
| + | |||
| + | ==== 5.5.1 Изучение устройств и разделов с помощью командной строки GRUB ==== | ||
| + | |||
| + | === Схема адресации GRUB === | ||
| + | |||
| + | ^ Обозначение ^ Описание ^ | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | |||
| + | === Основные команды === | ||
| + | |||
| + | **Список устройств: | ||
| + | |||
| + | <code bash> | ||
| + | grub> ls | ||
| + | (hd0) (hd0, | ||
| + | |||
| + | grub> ls -l | ||
| + | # Выводит UUID, тип ФС, размер разделов | ||
| + | </ | ||
| + | |||
| + | **Навигация по файлам: | ||
| + | |||
| + | <code bash> | ||
| + | grub> echo $root | ||
| + | hd0,msdos1 | ||
| + | |||
| + | grub> ls ($root)/ | ||
| + | # Список файлов в корне раздела | ||
| + | |||
| + | grub> ls ($root)/ | ||
| + | # Содержимое /boot | ||
| + | |||
| + | grub> set | ||
| + | # Все переменные GRUB | ||
| + | </ | ||
| + | |||
| + | **Важные переменные: | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | **Завершение: | ||
| + | * **Esc** - вернуться в меню | ||
| + | * **boot** - загрузить систему с текущей конфигурацией | ||
| + | |||
| + | **История команд: | ||
| + | |||
| + | ==== 5.5.2 Конфигурация GRUB ==== | ||
| + | |||
| + | Каталог конфигурации GRUB обычно ''/ | ||
| + | * '' | ||
| + | * '' | ||
| + | * Шрифты, | ||
| + | |||
| + | **Не редактируйте grub.cfg напрямую** - используйте '' | ||
| + | |||
| + | === Структура grub.cfg === | ||
| + | |||
| + | Файл состоит из: | ||
| + | |||
| + | ^ Раздел ^ Содержимое ^ | ||
| + | | Инициализация | Определения функций, | ||
| + | | Меню загрузки | Команды '' | ||
| + | |||
| + | **Пример menuentry: | ||
| + | |||
| + | <code bash> | ||
| + | menuentry ' | ||
| + | recordfail | ||
| + | load_video | ||
| + | insmod part_msdos | ||
| + | insmod ext2 | ||
| + | set root=' | ||
| + | search --no-floppy --fs-uuid --set=root UUID | ||
| + | linux / | ||
| + | initrd / | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | === Регенерация конфигурации === | ||
| + | |||
| + | grub.cfg создается автоматически из скриптов ''/ | ||
| + | |||
| + | <code bash> | ||
| + | # Просмотр (не сохраняет) | ||
| + | grub-mkconfig | ||
| + | |||
| + | # Сохранение новой конфигурации | ||
| + | grub-mkconfig -o / | ||
| + | </ | ||
| + | |||
| + | **Порядок обработки: | ||
| + | |||
| + | === Пользовательская конфигурация === | ||
| + | |||
| + | Два варианта добавления собственных пунктов меню: | ||
| + | |||
| + | ^ Файл ^ Способ ^ Стабильность ^ | ||
| + | | ''/ | ||
| + | | ''/ | ||
| + | |||
| + | **Рекомендуемый способ: | ||
| + | |||
| + | <code bash> | ||
| + | # Отредактировать | ||
| + | nano / | ||
| + | |||
| + | # Регенерировать | ||
| + | grub-mkconfig -o / | ||
| + | |||
| + | # Сделайте резервную копию старой конфигурации! | ||
| + | cp / | ||
| + | </ | ||
| + | |||
| + | Дополнительные скрипты в ''/ | ||
| + | |||
| + | ==== 5.5.3 Установка GRUB ==== | ||
| + | |||
| + | Установка GRUB требует указания целевого каталога, | ||
| + | |||
| + | === Установка GRUB в систему === | ||
| + | |||
| + | Требуемые параметры: | ||
| + | |||
| + | ^ Параметр ^ Описание ^ | ||
| + | | Целевой каталог GRUB | Обычно /boot/grub (может отличаться при установке на другой диск) | | ||
| + | | Текущее устройство диска | Необходимо определить целевой диск | | ||
| + | | Точка монтирования EFI | Для UEFI: обычно /boot/efi (требуется указать текущую точку) | | ||
| + | |||
| + | Утилита **grub-install** автоматизирует установку. Например, | ||
| + | |||
| + | <code bash> | ||
| + | # grub-install /dev/sda | ||
| + | </ | ||
| + | |||
| + | **ВНИМАНИЕ: | ||
| + | |||
| + | === Установка GRUB на внешнее устройство (MBR) === | ||
| + | |||
| + | Для установки на внешний диск вне текущей системы укажите каталог GRUB вручную. Если целевое устройство /dev/sdc смонтировано на /mnt: | ||
| + | |||
| + | <code bash> | ||
| + | # grub-install --boot-directory=/ | ||
| + | </ | ||
| + | |||
| + | === Установка GRUB с помощью UEFI === | ||
| + | |||
| + | Установка UEFI требует сохранения конфигурации в NVRAM через **efibootmgr**. Команда grub-install выполняет это автоматически: | ||
| + | |||
| + | <code bash> | ||
| + | # grub-install --efi-directory=efi_dir --bootloader-id=name | ||
| + | </ | ||
| + | |||
| + | Где: | ||
| + | * **efi_dir** - каталог UEFI в текущей системе (обычно / | ||
| + | * **name** - идентификатор загрузчика | ||
| + | |||
| + | При установке UEFI могут возникнуть проблемы при переносе на другую систему и различия в процедуре для съемных носителей. Одной из главных проблем является функция безопасной загрузки UEFI. | ||
| + | |||
| + | ===== 5.6 Проблемы безопасной загрузки UEFI ===== | ||
| + | |||
| + | Безопасная загрузка UEFI требует цифровую подпись поставщика для запуска любого загрузчика. Microsoft обязал производителей оборудования использовать эту функцию для систем с Windows 8 и новее. Неподписанный загрузчик будет отклонен встроенным ПО и система не загрузится. | ||
| + | |||
| + | Основные дистрибутивы Linux используют уже подписанные загрузчики (обычно GRUB для UEFI). Между UEFI и GRUB проходит небольшая подписанная часть данных, | ||
| + | |||
| + | Безопасная загрузка защищает от несанкционированного ПО в ненадежной среде и требуемых системах безопасности. Некоторые дистрибутивы требуют подпись всей последовательности загрузки, | ||
| + | |||
| + | **Недостатки: | ||
| + | |||
| + | ===== 5.7 Метод цепной загрузки других операционных систем ===== | ||
| + | |||
| + | UEFI поддерживает несколько загрузчиков в разделе EFI, но устаревший MBR этого не предусматривает. **Цепная загрузка (chainloading)** - это метод, при котором GRUB загружает и запускает другой загрузчик из определенного раздела вместо загрузки ядра Linux. | ||
| + | |||
| + | Создайте новый пункт в конфигурации GRUB: | ||
| + | |||
| + | <code bash> | ||
| + | menuentry " | ||
| + | insmod chain | ||
| + | insmod ntfs | ||
| + | set root=(hd0, | ||
| + | chainloader +1 | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Параметр **+1** загружает содержимое первого сектора раздела. Для прямой загрузки файла используйте: | ||
| + | |||
| + | <code bash> | ||
| + | menuentry " | ||
| + | insmod chain | ||
| + | insmod fat | ||
| + | set root=(hd0, | ||
| + | chainloader /io.sys | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== 5.8 Детали работы загрузчика ===== | ||
| + | |||
| + | Загрузчики имеют два основных варианта: | ||
| + | |||
| + | ==== 5.8.1 Загрузчик MBR ==== | ||
| + | |||
| + | MBR (Master Boot Record) содержит 441 байт кода, который BIOS загружает после самотестирования при включении (POST). Этого недостаточно для полного загрузчика, | ||
| + | |||
| + | **Проблема с GPT:** эта схема не работает с GPT диском при использовании традиционного BIOS, поскольку информация GPT находится после MBR. **Решение: | ||
| + | |||
| + | ==== 5.8.2 Загрузчик UEFI ==== | ||
| + | |||
| + | **UEFI (Unified EFI)** — замена традиционному BIOS, разработанная как расширяемый интерфейс прошивки. Сегодня это наиболее распространённый интерфейс. Включает встроенную оболочку, | ||
| + | |||
| + | ^ Аспект ^ MBR ^ UEFI ^ | ||
| + | | Расположение кода | Вне файловой системы (между MBR и разделом) | Специальная файловая система VFAT | | ||
| + | | Структура | Небольшой фрагмент в MBR загружает остаток | Системный раздел EFI (ESP) с каталогом /EFI | | ||
| + | | Монтирование в Linux | — | Обычно /boot/efi | | ||
| + | | Подкаталоги | — | / | ||
| + | | Файлы загрузчика | — | Расширение .efi (например, | ||
| + | |||
| + | **Примечание: | ||
| + | |||
| + | **Важно: | ||
| + | |||
| + | ==== 5.8.3 Как работает GRUB ==== | ||
| + | |||
| + | Процесс загрузки GRUB: | ||
| + | |||
| + | - PC BIOS или прошивка инициализирует оборудование и ищет загрузочный код | ||
| + | - BIOS загружает и выполняет найденный код (GRUB) | ||
| + | - Загружается ядро GRUB | ||
| + | - Ядро инициализируется, | ||
| + | - GRUB идентифицирует загрузочный раздел и загружает конфигурацию | ||
| + | - GRUB предоставляет пользователю возможность изменить конфигурацию | ||
| + | - После тайм-аута или действий пользователя выполняется конфигурация (grub.cfg) | ||
| + | - При необходимости загружаются дополнительные модули | ||
| + | - Выполняется команда boot для загрузки ядра (параметр linux в конфигурации) | ||
| + | |||
| + | **Расположение ядра GRUB** имеет три варианта: | ||
| + | |||
| + | * Между MBR и началом первого раздела | ||
| + | * В обычном разделе | ||
| + | * В специальном загрузочном разделе (BIOS boot partition, ESP или другой) | ||
| + | |||
| + | При использовании **BIOS/ | ||
| + | |||
| + | При использовании **UEFI/ | ||
| + | |||
| + | **Дополнительный шаг:** перед загрузкой ядра может потребоваться загрузить начальный образ файловой системы оперативной памяти (параметр **initrd**). | ||