Linux

Настройка GRUB 2: полное руководство по конфигурации загрузчика Linux

Этот гайд подробно объясняет, как настроить загрузчик GRUB 2 в Linux. Вы научитесь редактировать конфигурационные файлы, изменять порядок и внешний вид меню загрузки, добавлять параметры ядра и защищать меню паролем.

15-30 мин
Средняя
Применимо к:GRUB 2 (все основные дистрибутивы: Ubuntu 20.04+, Fedora 35+, Debian 11+, Arch Linux)systemd-boot (как альтернатива, упоминается)LVM, Btrfs, ZFS (поддержка в модулях)

Введение / Зачем это нужно

GRUB (Grand Unified Bootloader) — это стандартный загрузчик для большинства дистрибутивов Linux. Он отвечает за выбор операционной системы или ядра для загрузки, передачу параметров ядру и отображение меню. Настройка GRUB позволяет:

  • Изменить порядок загрузки по умолчанию (например, сделать Windows основной).
  • Настроить таймер автоматической загрузки или полностью скрыть меню.
  • Добавить параметры ядра (nomodeset, quiet splash, acpi=off) для решения проблем с оборудованием.
  • Защитить меню от несанкционированного редактирования паролем.
  • Вручную добавить запись для ОС, которую GRUB не обнаружил автоматически.

Этот гайд покрывает основные сценарии настройки GRUB 2 на современных системах.

Требования / Подготовка

  1. Доступ к системе: Вы должны иметь права суперпользователя (sudo).
  2. Резервная копия: Перед редактированием конфигурации обязательно сделайте резервную копию ключевых файлов:
    sudo cp /etc/default/grub /etc/default/grub.bak
    sudo cp -r /etc/grub.d/ /etc/grub.d.bak/
    
  3. Знание разметки диска: Узнайте, на каком разделе находится ваша корневая (/) и /boot файловая система (если она отдельная). Команда lsblk или sudo fdisk -l поможет.
  4. Понимание структуры: GRUB 2 использует два типа файлов:
    • Конфигурация по умолчанию: /etc/default/grub (основные переменные).
    • Скрипты генерации: /etc/grub.d/ (исполняемые скрипты, которые генерируют меню).
    • Итоговый конфиг: /boot/grub/grub.cfg (НЕ редактируйте вручную! Он перезаписывается).

Шаг 1: Базовые настройки через /etc/default/grub

Откройте главный конфигурационный файл в текстовом редакторе (например, sudo nano /etc/default/grub). Вот ключевые параметры:

# Задержка перед автоматической загрузкой выбранного пункта (в секундах)
GRUB_TIMEOUT=5

# Скрыть меню, если есть только одна ОС? (hidden - скрыть, menu - показать)
GRUB_TIMEOUT_STYLE=menu

# Имя ОС по умолчанию (обычно соответствует названию в меню)
GRUB_DEFAULT=0  # 0 - первая запись, "saved" - последняя выбранная

# Параметры ядра, добавляемые ко всем записям Linux
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

# Включить/отключить восстановление после сбоев (например, при обновлении ядра)
GRUB_DISABLE_OS_PROBER=false

# Цветовая схема (необязательно)
GRUB_COLOR_NORMAL="light-gray/black"
GRUB_COLOR_HIGHLIGHTED="white/blue"

Что изменить:

  • Чтобы ускорить загрузку, установите GRUB_TIMEOUT=2 или 0.
  • Чтобы полностью убрать меню (автозагрузка), установите GRUB_TIMEOUT_STYLE=hidden и GRUB_TIMEOUT=0. Для вызова меню удерживайте Shift во время загрузки.
  • Чтобы изменить ОС по умолчанию, найдите её точное название в будущем grub.cfg или установите GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 6.5.0-27-generic" (используйте кавычки и вложенность через >).
  • Для отладки удалите quiet splash из GRUB_CMDLINE_LINUX_DEFAULT, чтобы видеть сообщения ядра.

Шаг 2: Добавление кастомной записи (ручной способ)

Если GRUB не нашёл нужную ОС (например, другую Linux-систему на отдельном диске или старый Windows), добавьте запись вручную.

  1. Создайте или отредактируйте файл /etc/grub.d/40_custom. Он уже существует и содержит примеры.
  2. Добавьте в конец файла блок для новой ОС. Пример для Windows на другом диске:
    ### BEGIN /etc/grub.d/40_custom
    menuentry "Windows 10 (on /dev/sdb1)" {
        insmod ntfs
        set root='hd1,msdos1'  # или 'hd0,gpt1' для GPT. Уточните через `ls` в grub rescue
        chainloader +1
    }
    
    Как определить set root? Загрузитесь с Live-USB, откройте grub-консоль (нажав c в меню), и выполните ls. Диски будут hd0, hd1 и т.д., разделы (hd0,msdos1) или (hd0,gpt1).
  3. Для другой Linux-системы проще использовать chainloader или configfile, если у неё свой GRUB.

Шаг 3: Применение изменений и обновление конфигурации

После любого изменения в /etc/default/grub или /etc/grub.d/ обязательно выполните:

sudo update-grub

Эта команда:

  1. Запускает скрипты из /etc/grub.d/ в алфавитном порядке.
  2. Определяет установленные ядра и ОС (если GRUB_DISABLE_OS_PROBER=true, то пропускает поиск).
  3. Генерирует новый файл /boot/grub/grub.cfg.
  4. Выводит список найденных меню-записей.

Типичная ошибка: Забыть выполнить update-grub. Изменения вступят в силу только после перегенерации конфига.

Шаг 4: Паролизация меню GRUB (защита от редактирования)

Это предотвращает случайные или злонамеренные изменения параметров загрузки.

  1. Сгенерируйте хэш пароля:
    sudo grub-mkpasswd-pbkdf2
    
    Введите и подтвердите пароль. Вы получите строку вида grub.pbkdf2.sha512.....
  2. Добавьте хэш в конфигурацию. Откройте /etc/grub.d/40_custom и в самый конец (перед ### END) добавьте:
    set superusers="root"
    password_pbkdf2 root grub.pbkdf2.sha512.10000....  # вставьте сюда свою длинную строку
    
    Это создаст пользователя root с паролем.
  3. Ограничьте права редактирования. В том же файле 40_custom или в отдельном (например, 01_users) оберните все menuentry в блок if:
    if [ "${GRUB_MENU_ENTRY}" = "root" ]; then
        # Все menuentry будут доступны только после ввода пароля
        set superusers="root"
        password_pbkdf2 root grub.pbkdf2.sha512....
    fi
    
    Более простой способ (но менее гибкий): добавить GRUB_DISABLE_RECOVERY="true" в /etc/default/grub для скрытия пункта "Recovery", и использовать grub-setpassword (есть не во всех дистрибутивах).
  4. Обновите конфиг: sudo update-grub.

При загрузке, чтобы выбрать пункт или войти в командную строку GRUB, нажмите e или c — система запросит имя пользователя (root) и пароль.

Шаг 5: Альтернативные инструменты (с осторожностью)

Для тех, кто не хочет редактировать файлы вручную, существуют графические утилиты:

  • Grub Customizer (sudo apt install grub-customizer в Debian/Ubuntu).
    • Плюсы: Удобный GUI для изменения порядка, таймера, скрытия записей.
    • Минусы: Может "сломать" конфиг при обновлениях GRUB, хранит изменения в своих файлах, что усложняет отладку. Не рекомендуется для серверов и критичных систем.

Вывод: Для надёжности и понимания процесса лучше использовать ручное редактирование через update-grub.

Шаг 6: Работа с загрузкой ядер и параметрами

Изменение параметров ядра для конкретной сессии

  1. В меню GRUB выберите нужную запись и нажмите e (edit).
  2. Найдите строку, начинающуюся с linux или linuxefi. Это параметры ядра.
  3. Добавьте или измените параметры в конце этой строки (например, nomodeset, noapic, acpi=off).
  4. Нажмите Ctrl+X или F10 для загрузки с этими параметрами (изменения не сохраняются).
  5. Чтобы сделать параметры постоянными, найдите в /etc/default/grub переменную GRUB_CMDLINE_LINUX_DEFAULT и добавьте туда нужные флаги, затем sudo update-grub.

Удаление старых ядер

Старые ядра накапливаются в /boot/ и могут занимать место. GRUB автоматически показывает все найденные. Чтобы почистить:

# Ubuntu/Debian
sudo apt autoremove --purge
# Fedora
sudo dnf remove $(package-cleanup --oldkernels --count=2)

После очистки sudo update-grub обновит меню.

Проверка результата

  1. Перезагрузите компьютер.
  2. Убедитесь, что:
    • Меню GRUB появляется (или нет, если настроено скрытое).
    • Таймер работает как задано.
    • Система по умолчанию загружается автоматически.
    • Все необходимые ОС присутствуют в списке.
    • Параметры ядра (если добавляли) действуют (проверьте через cat /proc/cmdline после загрузки).
  3. Если система не загружается, но вы видите grub> или grub rescue> — смотрите раздел "Возможные проблемы".

Возможные проблемы

Проблема: После изменений система не загружается, виден grub rescue>.

Причина: GRUB не может найти свои модули или конфиг (например, после переименования раздела /boot). Решение:

  1. Определите, где находится ваш раздел /boot (через ls в grub rescue).
  2. Вручную задать корень: set root=(hd0,gpt1) (подставьте свой).
  3. Загрузить нормальный конфиг: insmod normal; normal.
  4. Если загрузились, немедленно исправьте /etc/default/grub (возможно, GRUB_DISABLE_OS_PROBER или путь к /boot), затем update-grub.

Проблема: update-grub не находит Windows.

Причина: Windows загружается в режиме UEFI, а Linux — в Legacy (CSM), или наоборот. Или отключён os-prober. Решение:

  • Убедитесь, что обе ОС используют один и тот же режим BIOS/UEFI.
  • Установите os-prober (sudo apt install os-prober), раскомментируйте GRUB_DISABLE_OS_PROBER=false в /etc/default/grub и снова sudo update-grub.

Проблема: Изменения в /etc/default/grub не применяются.

Причина: Вы отредактировали не тот файл (например, в chroot-окружении с другого диска) или забыли update-grub. Решение: Проверьте, правильный ли файл изменён (cat /etc/default/grub из вашей загруженной системы). Всегда выполняйте sudo update-grub после правки.

Проблема: После паролизации GRUB запрашивает пароль даже для загрузки.

Решение: Это ожидаемое поведение, если вы настроили superusers глобально. Чтобы пароль запрашивался только при попытке редактирования, нужно более тонко настроить if-условия в скриптах /etc/grub.d/. Чаще проще снять пароль, отредактировав 40_custom и пересгенерировав конфиг.

Часто задаваемые вопросы

Как восстановить GRUB после установки Windows?
Можно ли убрать меню GRUB и загружаться в одну систему автоматически?
Как добавить в меню GRUB запись для другого диска или ОС, которую он не нашёл?
Безопасно ли использовать Grub Customizer?

Полезное

Понимание структуры GRUB
Базовые настройки в /etc/default/grub
Использование скриптов в /etc/grub.d/
Применение изменений
Проверка и тестирование
Продвинутые настройки и паролизация