Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

Таймаут и скрытые пункты меню GRUB

Сразу к делу: таймаут меню GRUB и скрытие пунктов настраиваются в файле /etc/default/grub переменными GRUB_TIMEOUT, GRUB_TIMEOUT_STYLE и GRUB_DISABLE_RECORDFAIL. После любой правки перегенерируй конфиг командой grub-mkconfig -o /boot/grub/grub.cfg, иначе изменения не подхватятся. Ниже — каждая переменная по отдельности и пара приёмов для систем с несколькими ядрами.

Как работает таймаут меню GRUB?

GRUB_TIMEOUT задаёт время ожидания в секундах перед загрузкой пункта по умолчанию. В свежей установке Arch там стоит 5.

GRUB_TIMEOUT=5

Особые значения:

  • 0 — мгновенная загрузка пункта по умолчанию, меню не показывается вообще;
  • -1 — ждать выбора бесконечно, пока не нажмёшь Enter.

При 0 меню не увидишь даже с зажатой клавишей Shift — загрузка стартует сразу. Удобно на однопользовательской машине, но неудобно, когда иногда нужно загрузить другое ядро или live-образ. Для таких случаев лучше не 0, а скрытое меню со счётчиком — об этом ниже.

Во время отсчёта любая нажатая клавиша останавливает таймер и показывает меню. Это работает и при обычном menu, и при скрытых стилях. Клавиша Esc тоже открывает меню, даже если таймер уже запущен. На практике это значит: при hidden или countdown достаточно нажать любую клавишу, чтобы получить доступ к выбору ядра.

Готовый таймаут попадает в grub.cfg строкой set timeout=5. Если хочешь убедиться, что именно сгенерировал grub-mkconfig, открой файл и поищи timeout — рядом увидишь set timeout_style=hidden, если задал скрытый стиль.

Как скрыть меню, но оставить счётчик?

За скрытие отвечает GRUB_TIMEOUT_STYLE. Возможные значения:

  • menu — показывать меню и счётчик, поведение по умолчанию;
  • countdown — показывать только счётчик, меню появляется по нажатию клавиши;
  • hidden — не показывать ничего, меню появляется по нажатию клавиши.
GRUB_TIMEOUT=5
GRUB_TIMEOUT_STYLE=hidden

При hidden экран остаётся пустым, но таймер работает: нажал любую клавишу — выпало меню. При countdown видишь цифры обратного отсчёта. Оба варианта хороши, когда система грузится сама, но доступ к меню нужен. Разница между ними чисто визуальная: в первом случае экран пустой, во втором видно, сколько секунд осталось. Если не хочешь пугаться чёрного экрана при каждой загрузке — бери countdown.

Нюанс: GRUB_TIMEOUT_STYLE=hidden работает только вместе с ненулевым GRUB_TIMEOUT. Если поставить GRUB_TIMEOUT=0, меню не появится ни при каком стиле.

Что такое GRUB_HIDDEN_TIMEOUT и почему он устарел?

В старых версиях GRUB скрытие меню делали парой GRUB_HIDDEN_TIMEOUT и GRUB_HIDDEN_TIMEOUT_QUIET. Первая задавала время скрытого ожидания, вторая отключала счётчик.

GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true

Сейчас эти переменные устарели: их поведение полностью покрывает GRUB_TIMEOUT_STYLE. Устарели они ещё в GRUB 2.02 — начиная с этой версии скрытие меню управляется новым стилем, а старые переменные оставили только для совместимости со старыми конфигами. В свежий grub.cfg они даже не попадают: grub-mkconfig их игнорирует. В новых конфигах их не пишут, но в чужих гайдах и старых конфигах они ещё встречаются. Если увидишь их в /etc/default/grub — замени на GRUB_TIMEOUT_STYLE=hidden и GRUB_TIMEOUT.

Почему меню появляется после неудачной загрузки?

GRUB запоминает, что предыдущая загрузка не удалась, и в следующий раз показывает меню, игнорируя таймаут. За это отвечает механизм recordfail: при старте GRUB пишет в переменную окружения recordfail значение 1, а при успешной загрузке система сбрасывает его в 0. Флаг прописывает в grub.cfg скрипт 10_linux при генерации конфига: в начале загрузки выполняется set recordfail=1, а после успешного старта systemd сбрасывает его через grub-editenv. Поэтому после чистой загрузки флаг обычно равен 0.

Если загрузка упала, recordfail остаётся 1, и grub-mkconfig генерирует конфиг, где таймаут заменяется на GRUB_RECORDFAIL_TIMEOUT (по умолчанию 30 секунд). Отсюда внезапные «зависшие» меню после сбоя.

Текущее состояние можно посмотреть командой:

grub-editenv list

Если в выводе есть recordfail=1 — предыдущая загрузка не прошла. Сбросить флаг вручную можно так:

grub-editenv unset recordfail

Это пригодится, если система загрузилась нормально, но флаг по какой-то причине не сбросился сам.

Лечится двумя способами. Первый — задать свой таймаут для сбойного случая:

GRUB_RECORDFAIL_TIMEOUT=5

Второй — отключить механизм совсем:

GRUB_DISABLE_RECORDFAIL=true

После этого меню ведёт себя одинаково и после сбоя, и после чистой загрузки. Если GRUB после обновления начал вести себя странно — смотри статью «Откат обновления GRUB».

Как сделать нужное ядро пунктом по умолчанию без правки файлов?

Когда ядер несколько, пункт по умолчанию меняется на лету, без редактирования конфига. Для этого нужны GRUB_DEFAULT=saved и утилиты grub-set-default и grub-reboot.

Сначала пропиши в /etc/default/grub:

GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true

GRUB_SAVEDEFAULT=true запоминает последний выбранный в меню пункт как новый пункт по умолчанию. Выбрал один раз linux-zen — в следующий раз он загрузится сам. Между GRUB_SAVEDEFAULT и grub-set-default есть разница: первая запоминает твой выбор в меню, вторая задаёт пункт программно. Обе пишут результат в файл /boot/grub/grubenv, который хранит переменные окружения GRUB между загрузками.

Вместо имени можно использовать номер пункта, начиная с нуля: GRUB_DEFAULT=2 возьмёт третий пункт меню. Но номера хрупкие — добавил новое ядро, и порядок сдвинулся. Имя надёжнее.

grub-set-default задаёт пункт по умолчанию без загрузки:

grub-set-default "Advanced options for Arch Linux>Arch Linux, with Linux linux-lts"

grub-reboot загружает указанный пункт один раз, а на следующей загрузке возвращается прежний порядок:

grub-reboot "Advanced options for Arch Linux>Arch Linux, with Linux linux-zen"

Удобно, когда нужно один раз загрузиться в другое ядро, например для теста. После grub-reboot выбор действует только на одну загрузку: перезагрузился — и снова старый пункт по умолчанию. Это удобно для теста ядра или загрузки в recovery-режим без постоянной смены настроек. Обе утилиты принимают и номер, и имя пункта: номер удобен для скриптов, имя — для людей. Подробнее про выбор ядра — в статье «Какое ядро выбрать: linux, linux-lts, linux-zen, linux-hardened». А если пунктов в меню слишком много — поможет статья «Несколько ядер в меню: linux, linux-lts, linux-hardened».

Имена пунктов смотри в выводе grub-mkconfig или через grep menuentry /boot/grub/grub.cfg. Вложенные пункты подменю разделяются символом >. После изменения GRUB_DEFAULT не забудь перегенерировать конфиг.

Как убрать подменю и включить тему?

По умолчанию GRUB прячет дополнительные ядра в подменю «Advanced options for Arch Linux». Если оно мешает, отключи его:

GRUB_DISABLE_SUBMENU=y

Все пункты появятся в основном меню. Учти: имена пунктов для grub-set-default и grub-reboot станут короче — без префикса подменю. Отключение подменю удобно ещё и тем, что все ядра видны сразу — не нужно помнить, что нужный пункт спрятан внутри «Advanced options». Минус один: меню становится длиннее, и при большом числе ядер в нём легко промахнуться.

Внешний вид меню меняется темой. Переменная GRUB_THEME указывает на файл темы:

GRUB_THEME="/boot/grub/themes/arch/theme.txt"

Для корректного отображения темы обычно нужен и GRUB_GFXMODE с подходящим разрешением, например 1920x1080, а GRUB_GFXPAYLOAD_LINUX=keep сохранит это разрешение при загрузке ядра. Если не знаешь, какое разрешение поддерживает твой экран, поставь GRUB_GFXMODE=auto — GRUB сам выберет подходящее. Настройка фона и темы разобрана в статье «Тема оформления GRUB: фон».

Почему в меню нет Windows или второй системы?

За обнаружение других операционных систем отвечает os-prober. Если он отключён переменной GRUB_DISABLE_OS_PROBER=true, GRUB не ищет Windows и другие Linux-установки, и их пункты не появляются в меню. Проверь:

GRUB_DISABLE_OS_PROBER=false

После включения перегенерируй конфиг. Убедись, что пакет os-prober установлен — без него переменная не даст эффекта. Подробности — в статье «Windows пропала из меню GRUB».

Почему таймаут не применяется?

Самая частая причина — правка не того файла. GRUB читает готовый /boot/grub/grub.cfg, а не /etc/default/grub. Если ты менял переменные, но не запускал grub-mkconfig -o /boot/grub/grub.cfg, ничего не изменится.

Вторая причина — recordfail. После неудачной загрузки таймаут из GRUB_TIMEOUT заменяется на GRUB_RECORDFAIL_TIMEOUT, и меню висит дольше обычного. Проверь grub-editenv list и при необходимости сбрось флаг.

Третья — конфликт старых переменных. Если в конфиге остались GRUB_HIDDEN_TIMEOUT и GRUB_HIDDEN_TIMEOUT_QUIET, они могут перекрывать GRUB_TIMEOUT_STYLE. Удали их и оставь один способ настройки.

Четвёртая — ошибка при генерации. После grub-mkconfig посмотри вывод команды: он должен закончиться строкой done. Если скрипт упал на полпути, конфиг мог не перезаписаться.

Что делать после любых правок?

Любое изменение /etc/default/grub вступает в силу только после перегенерации конфига:

grub-mkconfig -o /boot/grub/grub.cfg

Без этой команды правки молча игнорируются — GRUB читает готовый grub.cfg, а не исходник. grub-mkconfig собирает конфиг из скриптов в /etc/grub.d и переменных из /etc/default/grub, поэтому правки в обоих местах требуют перегенерации. Проверить результат можно так:

grep -E "timeout|recordfail" /boot/grub/grub.cfg

В выводе увидишь set timeout=5 и set timeout_style=hidden — значит, всё применилось.

Частые вопросы

Почему меню GRUB не появляется, хотя GRUB_TIMEOUT=5?

Скорее всего, в конфиге стоит GRUB_TIMEOUT_STYLE=hidden или countdown. Меню в этом случае появляется только по нажатию клавиши. Проверь обе переменные и перегенерируй конфиг.

GRUB_TIMEOUT=0 — это безопасно?

Если система одна и ядро одно — да. Но при проблемах с загрузкой попасть в меню не получится, придётся загружаться с live-USB. Надёжнее GRUB_TIMEOUT_STYLE=hidden с таймаутом 2–3 секунды.

Как вернуть меню, если оно пропало?

Поставь GRUB_TIMEOUT=5 и GRUB_TIMEOUT_STYLE=menu, затем grub-mkconfig -o /boot/grub/grub.cfg. Меню вернётся на следующей загрузке.

grub-reboot не сработал — почему?

Проверь, что в /etc/default/grub стоит GRUB_DEFAULT=saved, и что имя пункта указано точно, как в grub.cfg. Ошибка в имени — и GRUB молча загрузит пункт по умолчанию.

Почему после сбоя меню висит 30 секунд?

Это GRUB_RECORDFAIL_TIMEOUT — таймаут для случая, когда recordfail равен 1. Поставь своё значение, например 5, или отключи механизм через GRUB_DISABLE_RECORDFAIL=true.

Полезные ресурсы

Заключение

Таймаут и видимость меню GRUB управляются тремя переменными: GRUB_TIMEOUT, GRUB_TIMEOUT_STYLE и GRUB_DISABLE_RECORDFAIL. Скрытое меню со счётчиком — золотая середина между мгновенной загрузкой и доступом к выбору ядра. Пункт по умолчанию меняется на лету через grub-set-default и grub-reboot, а после любой правки не забывай grub-mkconfig -o /boot/grub/grub.cfg.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Читайте также

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max