Сразу к делу: таймаут меню GRUB и скрытие пунктов настраиваются в файле /etc/default/grub переменными GRUB_TIMEOUT, GRUB_TIMEOUT_STYLE и GRUB_DISABLE_RECORDFAIL. После любой правки перегенерируй конфиг командой grub-mkconfig -o /boot/grub/grub.cfg, иначе изменения не подхватятся. Ниже — каждая переменная по отдельности и пара приёмов для систем с несколькими ядрами.
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 скрытие меню делали парой 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: фон».
За обнаружение других операционных систем отвечает 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_TIMEOUT_STYLE=hidden или countdown. Меню в этом случае появляется только по нажатию клавиши. Проверь обе переменные и перегенерируй конфиг.
Если система одна и ядро одно — да. Но при проблемах с загрузкой попасть в меню не получится, придётся загружаться с live-USB. Надёжнее GRUB_TIMEOUT_STYLE=hidden с таймаутом 2–3 секунды.
Поставь GRUB_TIMEOUT=5 и GRUB_TIMEOUT_STYLE=menu, затем grub-mkconfig -o /boot/grub/grub.cfg. Меню вернётся на следующей загрузке.
Проверь, что в /etc/default/grub стоит GRUB_DEFAULT=saved, и что имя пункта указано точно, как в grub.cfg. Ошибка в имени — и GRUB молча загрузит пункт по умолчанию.
Это 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.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии