мета-данные страницы
Глава 5: Загрузка ядра Linux
Упрощенно процесс загрузки выглядит следующим образом:
- BIOS или загрузочная программа компьютера загружается и запускает загрузчик.
- Загрузчик находит образ ядра на диске, загружает его в память и запускает.
- Ядро инициализирует устройства и их драйверы.
- Ядро монтирует корневую файловую систему.
- Ядро запускает программу под названием init с идентификатором процесса 1. Эта точка является началом пользовательского пространства.
- Программа init приводит в действие остальные системные процессы.
- В какой-то момент запускается процесс, позволяющий пользователю войти в систему, обычно в конце или ближе к концу процесса загрузки.
5.1 Сообщения при загрузке
При запуске journalctl -k отображаются сообщения текущей загрузки, а при journalctl -b - можно просмотреть предыдущие загрузки.
Если у вас нет системы systemd, можете поискать файл журнала /var/log/kern.log или выполнить команду dmesg для просмотра сообщений в кольцевом буфере ядра.
5.2 Параметры инициализации и загрузки ядра
При запуске ядро Linux инициализируется в таком порядке:
- Проверка процессора.
- Проверка памяти.
- Обнаружение шины устройства.
- Обнаружение устройств.
- Настройка вспомогательной подсистемы ядра (сеть и т.п.).
- Монтирование корневой файловой системы.
- Запуск пользовательского пространства.
5.3 Параметры ядра
Вы можете изучить параметры, переданные в активное ядро вашей системы, просмотрев файл /proc/cmdline.
Обзор основных параметров загрузки ядра приведен на странице руководства bootparam(7).
Обнаружив незнакомый параметр, ядро Linux сохраняет его. Позже оно передает параметр программе init при запуске пользовательского пространства. Например, если вы добавляете параметр -s к параметрам ядра, оно передает init указание, что та должна запускаться в однопользовательском режиме.
5.4 Загрузчики
В начале загрузки, до загрузки ядра и команды init, программа загрузчика запускает ядро. Задача загрузчика проста: ему нужно загрузить ядро в память с диска, а затем запустить его с набором определенных параметров.
Ядро находится в сжатом виде в корневом разделе (как правило) или в своем собственном разделе на диске. Таким образом загрузчику нужно получить доступ к диску не имея загруженного ядра и его драйверов диска. Для этого 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 | Параметр ядра | Корневая ФС системы (после загрузки) |
Пример конфигурации:
set root=(hd0,msdos1)- GRUB root по устройствуsearch –set=root –fs-uuid UUID- GRUB root по UUIDlinux /boot/vmlinuz-… root=UUID- параметр ядра (kernel root)initrd /boot/initrd.img-…- начальная ФС ОП
5.5.1 Изучение устройств и разделов с помощью командной строки GRUB
Схема адресации GRUB
| Обозначение | Описание |
|---|---|
(hd0) | Первый найденный жесткий диск |
(hd0,msdos1) | Первый раздел MBR |
(hd0,gpt1) | Первый раздел GPT (UEFI) |
Основные команды
Список устройств:
grub> ls (hd0) (hd0,msdos1) grub> ls -l # Выводит UUID, тип ФС, размер разделов
Навигация по файлам:
grub> echo $root hd0,msdos1 grub> ls ($root)/ # Список файлов в корне раздела grub> ls ($root)/boot # Содержимое /boot grub> set # Все переменные GRUB
Важные переменные:
$prefix- путь для конфигурации GRUB (обычно/boot/grub)$root- текущий корень GRUB
Завершение:
- Esc - вернуться в меню
- boot - загрузить систему с текущей конфигурацией
История команд: ↑ / ↓ (навигация), ← / → (редактирование), Ctrl+N/P
5.5.2 Конфигурация GRUB
Каталог конфигурации GRUB обычно /boot/grub или /boot/grub2. Содержит:
grub.cfg- главный файл конфигурацииi386-pc/,x86_64-efi/- модули архитектуры (.mod)- Шрифты, информация о локализации
Не редактируйте grub.cfg напрямую - используйте grub-mkconfig.
Структура grub.cfg
Файл состоит из:
| Раздел | Содержимое |
|---|---|
| Инициализация | Определения функций, переменные ($font), настройки видео |
| Меню загрузки | Команды menuentry и submenu |
Пример menuentry:
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class os { recordfail load_video insmod part_msdos insmod ext2 set root='hd0,msdos1' search --no-floppy --fs-uuid --set=root UUID linux /boot/vmlinuz-... root=UUID=... ro quiet splash initrd /boot/initrd.img-... }
Регенерация конфигурации
grub.cfg создается автоматически из скриптов /etc/grub.d/. Каждый файл генерирует часть конфигурации:
# Просмотр (не сохраняет) grub-mkconfig # Сохранение новой конфигурации grub-mkconfig -o /boot/grub/grub.cfg
Порядок обработки: числа в названиях влияют на последовательность (00_header, 10_linux, 40_custom и т.д.).
Пользовательская конфигурация
Два варианта добавления собственных пунктов меню:
| Файл | Способ | Стабильность |
|---|---|---|
/etc/grub.d/40_custom | Редактируемый сценарий | Низкая (обновления перепишут) |
/boot/grub/custom.cfg | Загружается через 41_custom | Высокая (видна при загрузке) |
Рекомендуемый способ:
# Отредактировать nano /boot/grub/custom.cfg # Регенерировать grub-mkconfig -o /boot/grub/grub.cfg # Сделайте резервную копию старой конфигурации! cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak
Дополнительные скрипты в /etc/grub.d (напр., Ubuntu добавляет memtest86+).
5.5.3 Установка GRUB
Установка GRUB требует указания целевого каталога, текущего устройства диска и (для UEFI) точки монтирования раздела EFI. GRUB - модульная система, поэтому нужно создать версию, способную читать файловую систему для загрузки конфигурации (grub.cfg) и модулей.
Установка GRUB в систему
Требуемые параметры:
| Параметр | Описание |
|---|---|
| Целевой каталог GRUB | Обычно /boot/grub (может отличаться при установке на другой диск) |
| Текущее устройство диска | Необходимо определить целевой диск |
| Точка монтирования EFI | Для UEFI: обычно /boot/efi (требуется указать текущую точку) |
Утилита grub-install автоматизирует установку. Например, для установки GRUB на MBR диска /dev/sda:
# grub-install /dev/sda
ВНИМАНИЕ: Неправильная установка нарушит загрузку системы. Создайте резервную копию MBR и подготовьте план аварийной загрузки.
Установка GRUB на внешнее устройство (MBR)
Для установки на внешний диск вне текущей системы укажите каталог GRUB вручную. Если целевое устройство /dev/sdc смонтировано на /mnt:
# grub-install --boot-directory=/mnt/boot /dev/sdc
Установка GRUB с помощью UEFI
Установка UEFI требует сохранения конфигурации в NVRAM через efibootmgr. Команда grub-install выполняет это автоматически:
# grub-install --efi-directory=efi_dir --bootloader-id=name
Где:
- efi_dir - каталог UEFI в текущей системе (обычно /boot/efi/EFI)
- name - идентификатор загрузчика
При установке UEFI могут возникнуть проблемы при переносе на другую систему и различия в процедуре для съемных носителей. Одной из главных проблем является функция безопасной загрузки UEFI.
5.6 Проблемы безопасной загрузки UEFI
Безопасная загрузка UEFI требует цифровую подпись поставщика для запуска любого загрузчика. Microsoft обязал производителей оборудования использовать эту функцию для систем с Windows 8 и новее. Неподписанный загрузчик будет отклонен встроенным ПО и система не загрузится.
Основные дистрибутивы Linux используют уже подписанные загрузчики (обычно GRUB для UEFI). Между UEFI и GRUB проходит небольшая подписанная часть данных, которую UEFI запускает в первую очередь.
Безопасная загрузка защищает от несанкционированного ПО в ненадежной среде и требуемых системах безопасности. Некоторые дистрибутивы требуют подпись всей последовательности загрузки, включая ядро.
Недостатки: особенно актуальны для экспериментов с собственными загрузчиками. Можно отключить в настройках UEFI, но это не сработает для двойной загрузки (например, с Windows).
5.7 Метод цепной загрузки других операционных систем
UEFI поддерживает несколько загрузчиков в разделе EFI, но устаревший MBR этого не предусматривает. Цепная загрузка (chainloading) - это метод, при котором GRUB загружает и запускает другой загрузчик из определенного раздела вместо загрузки ядра Linux.
Создайте новый пункт в конфигурации GRUB:
menuentry "Windows" { insmod chain insmod ntfs set root=(hd0,3) chainloader +1 }
Параметр +1 загружает содержимое первого сектора раздела. Для прямой загрузки файла используйте:
menuentry "DOS" { insmod chain insmod fat set root=(hd0,3) chainloader /io.sys }
5.8 Детали работы загрузчика
Загрузчики имеют два основных варианта: MBR и UEFI, разработанные для устранения недостатков традиционных механизмов загрузки ПК.
5.8.1 Загрузчик MBR
MBR (Master Boot Record) содержит 441 байт кода, который BIOS загружает после самотестирования при включении (POST). Этого недостаточно для полного загрузчика, поэтому используется многоэтапная загрузка: небольшой код в MBR загружает остальную часть кода загрузчика, размещённую между MBR и первым разделом.
Проблема с GPT: эта схема не работает с GPT диском при использовании традиционного BIOS, поскольку информация GPT находится после MBR. Решение: создать специальный загрузочный раздел BIOS с UUID `21686148-6449-E6F-744E-656564454649` для размещения полного кода загрузчика. Это встречается редко — обычно только на старых системах с дисками > 2 ТБ.
5.8.2 Загрузчик UEFI
UEFI (Unified EFI) — замена традиционному BIOS, разработанная как расширяемый интерфейс прошивки. Сегодня это наиболее распространённый интерфейс. Включает встроенную оболочку, чтение таблиц разделов GPT и навигацию по файловым системам.
| Аспект | MBR | UEFI |
|---|---|---|
| Расположение кода | Вне файловой системы (между MBR и разделом) | Специальная файловая система VFAT |
| Структура | Небольшой фрагмент в MBR загружает остаток | Системный раздел EFI (ESP) с каталогом /EFI |
| Монтирование в Linux | — | Обычно /boot/efi |
| Подкаталоги | — | /boot/efi/EFI/{microsoft,apple,ubuntu,grub} и т.д. |
| Файлы загрузчика | — | Расширение .efi (например, grubx64.efi, shimx64.efi) |
Примечание: ESP отличается от загрузочного раздела BIOS — в системе будет только один из них.
Важно: для UEFI необходимо установить версию загрузчика, написанную для UEFI (не BIOS). Требуется уведомить прошивку о новых загрузчиках и решить проблемы безопасной загрузки (см. раздел 5.6).
5.8.3 Как работает GRUB
Процесс загрузки GRUB:
- PC BIOS или прошивка инициализирует оборудование и ищет загрузочный код
- BIOS загружает и выполняет найденный код (GRUB)
- Загружается ядро GRUB
- Ядро инициализируется, получает доступ к дискам и файловым системам
- GRUB идентифицирует загрузочный раздел и загружает конфигурацию
- GRUB предоставляет пользователю возможность изменить конфигурацию
- После тайм-аута или действий пользователя выполняется конфигурация (grub.cfg)
- При необходимости загружаются дополнительные модули
- Выполняется команда boot для загрузки ядра (параметр linux в конфигурации)
Расположение ядра GRUB имеет три варианта:
- Между MBR и началом первого раздела
- В обычном разделе
- В специальном загрузочном разделе (BIOS boot partition, ESP или другой)
При использовании BIOS/MBR: BIOS загружает 512 байт из MBR (boot.img), которые содержат начальное местоположение ядра GRUB и загружают его.
При использовании UEFI/ESP: ядро GRUB хранится как файл в ESP. Прошивка перемещается по ESP и напрямую запускает весь загрузчик GRUB (возможна прослойка для обработки безопасной загрузки).
Дополнительный шаг: перед загрузкой ядра может потребоваться загрузить начальный образ файловой системы оперативной памяти (параметр initrd).