Введение / Зачем это нужно
GRUB (Grand Unified Bootloader) — это стандартный загрузчик для большинства дистрибутивов Linux. Он отвечает за выбор операционной системы или ядра для загрузки, передачу параметров ядру и отображение меню. Настройка GRUB позволяет:
- Изменить порядок загрузки по умолчанию (например, сделать Windows основной).
- Настроить таймер автоматической загрузки или полностью скрыть меню.
- Добавить параметры ядра (
nomodeset,quiet splash,acpi=off) для решения проблем с оборудованием. - Защитить меню от несанкционированного редактирования паролем.
- Вручную добавить запись для ОС, которую GRUB не обнаружил автоматически.
Этот гайд покрывает основные сценарии настройки GRUB 2 на современных системах.
Требования / Подготовка
- Доступ к системе: Вы должны иметь права суперпользователя (
sudo). - Резервная копия: Перед редактированием конфигурации обязательно сделайте резервную копию ключевых файлов:
sudo cp /etc/default/grub /etc/default/grub.bak sudo cp -r /etc/grub.d/ /etc/grub.d.bak/ - Знание разметки диска: Узнайте, на каком разделе находится ваша корневая (
/) и/bootфайловая система (если она отдельная). Командаlsblkилиsudo fdisk -lпоможет. - Понимание структуры: 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), добавьте запись вручную.
- Создайте или отредактируйте файл
/etc/grub.d/40_custom. Он уже существует и содержит примеры. - Добавьте в конец файла блок для новой ОС. Пример для 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). - Для другой Linux-системы проще использовать
chainloaderилиconfigfile, если у неё свой GRUB.
Шаг 3: Применение изменений и обновление конфигурации
После любого изменения в /etc/default/grub или /etc/grub.d/ обязательно выполните:
sudo update-grub
Эта команда:
- Запускает скрипты из
/etc/grub.d/в алфавитном порядке. - Определяет установленные ядра и ОС (если
GRUB_DISABLE_OS_PROBER=true, то пропускает поиск). - Генерирует новый файл
/boot/grub/grub.cfg. - Выводит список найденных меню-записей.
Типичная ошибка: Забыть выполнить update-grub. Изменения вступят в силу только после перегенерации конфига.
Шаг 4: Паролизация меню GRUB (защита от редактирования)
Это предотвращает случайные или злонамеренные изменения параметров загрузки.
- Сгенерируйте хэш пароля:
Введите и подтвердите пароль. Вы получите строку видаsudo grub-mkpasswd-pbkdf2grub.pbkdf2.sha512..... - Добавьте хэш в конфигурацию. Откройте
/etc/grub.d/40_customи в самый конец (перед### END) добавьте:
Это создаст пользователяset superusers="root" password_pbkdf2 root grub.pbkdf2.sha512.10000.... # вставьте сюда свою длинную строкуrootс паролем. - Ограничьте права редактирования. В том же файле
40_customили в отдельном (например,01_users) оберните всеmenuentryв блокif:
Более простой способ (но менее гибкий): добавитьif [ "${GRUB_MENU_ENTRY}" = "root" ]; then # Все menuentry будут доступны только после ввода пароля set superusers="root" password_pbkdf2 root grub.pbkdf2.sha512.... fiGRUB_DISABLE_RECOVERY="true"в/etc/default/grubдля скрытия пункта "Recovery", и использоватьgrub-setpassword(есть не во всех дистрибутивах). - Обновите конфиг:
sudo update-grub.
При загрузке, чтобы выбрать пункт или войти в командную строку GRUB, нажмите e или c — система запросит имя пользователя (root) и пароль.
Шаг 5: Альтернативные инструменты (с осторожностью)
Для тех, кто не хочет редактировать файлы вручную, существуют графические утилиты:
- Grub Customizer (
sudo apt install grub-customizerв Debian/Ubuntu).- Плюсы: Удобный GUI для изменения порядка, таймера, скрытия записей.
- Минусы: Может "сломать" конфиг при обновлениях GRUB, хранит изменения в своих файлах, что усложняет отладку. Не рекомендуется для серверов и критичных систем.
Вывод: Для надёжности и понимания процесса лучше использовать ручное редактирование через update-grub.
Шаг 6: Работа с загрузкой ядер и параметрами
Изменение параметров ядра для конкретной сессии
- В меню GRUB выберите нужную запись и нажмите
e(edit). - Найдите строку, начинающуюся с
linuxилиlinuxefi. Это параметры ядра. - Добавьте или измените параметры в конце этой строки (например,
nomodeset,noapic,acpi=off). - Нажмите
Ctrl+XилиF10для загрузки с этими параметрами (изменения не сохраняются). - Чтобы сделать параметры постоянными, найдите в
/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 обновит меню.
Проверка результата
- Перезагрузите компьютер.
- Убедитесь, что:
- Меню GRUB появляется (или нет, если настроено скрытое).
- Таймер работает как задано.
- Система по умолчанию загружается автоматически.
- Все необходимые ОС присутствуют в списке.
- Параметры ядра (если добавляли) действуют (проверьте через
cat /proc/cmdlineпосле загрузки).
- Если система не загружается, но вы видите
grub>илиgrub rescue>— смотрите раздел "Возможные проблемы".
Возможные проблемы
Проблема: После изменений система не загружается, виден grub rescue>.
Причина: GRUB не может найти свои модули или конфиг (например, после переименования раздела /boot).
Решение:
- Определите, где находится ваш раздел
/boot(черезlsв grub rescue). - Вручную задать корень:
set root=(hd0,gpt1)(подставьте свой). - Загрузить нормальный конфиг:
insmod normal; normal. - Если загрузились, немедленно исправьте
/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 и пересгенерировав конфиг.