Безголовый сервер Ubuntu иногда зависает в меню GRUB

54

У меня Ubuntu 10.10 Server установлен на одноплатной машине в полузакрытой среде; нет клавиатуры или экрана, просто SSH доступ к нему.

Так что это действительно расстраивает, когда он иногда загружается и застревает в меню GRUB, ожидая нажатия клавиши, чтобы выбрать первый вариант.

Как настроить GRUB, чтобы ни при каких обстоятельствах не ждать нажатия клавиши?

Обновление № 1: нет menu.lst, так как это GRUB 2. Но у меня есть / etc / default / grub, который выглядит примерно так:

GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=2
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""

Обновление № 2: я понял это. На загрузках, которые следуют за неудачными загрузками, GRUB отключает свое собственное время ожидания. Поскольку показ меню делает загрузку неудачной, это неизбежный цикл. Это поведение можно отключить, отредактировав файл /etc/grub.d/00_header и изменив функцию make_timeout:

make_timeout ()
{
    echo "set timeout=0"
}

Теперь выйдите и перезапустите скрипт обновления конфигурации grub:

sudo update-grub2

Для меня не имеет смысла, что такое поведение будет по умолчанию для Ubuntu Server, продукта, предназначенного для компьютеров, к которым обращается консоль.

mikepurvis
источник
1
Как ты /boot/grub/menu.lstвыглядишь?
Шейн Мэдден
7
Вы можете опубликовать свои результаты в качестве ответа на свой вопрос, а не в качестве редактирования. Таким образом, у нас есть возможность подтвердить ваш ответ, если он нам понравится.
Скайхок

Ответы:

41

Для Ubuntu 12.04 LTS есть специальная опция, которую можно установить в /etc/default/grub.

Например, если вы хотите установить тайм-аут на 2 секунды (что позволяет избежать зависаний при автоматической перезагрузке), просто добавьте следующую строку /etc/default/grub:

GRUB_RECORDFAIL_TIMEOUT=2

Не забудьте бежать update-grubпосле этого ...

Андреа Барселона
источник
Это устранило мою изначальную проблему, которая была такой же, как у OP, но теперь я заметил, что в редких случаях, когда я подключаю свой сервер к монитору, я ничего не вижу. Монитор даже не подключается, но SSH по-прежнему работает нормально. Это ожидается?
Даулерс
18

Вот инструкции для Ubuntu 10.10, которые немного отличаются от предыдущих версий. В файле /etc/grub.d/00_header закомментируйте глупую проверку на предыдущий сбой загрузки:

##if [ \${recordfail} = 1 ]; then
##  set timeout=-1
##else
  set timeout=${2}
##fi

Затем обновите:

sudo update-grub

Имейте в виду, что если есть второй диск с подключенным Linux, grub2 найдет его и спросит вас при загрузке, какой вы хотите. Удалите все лишние диски перед запуском "update-grub".

Смотрите также https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/797544

Брайс
источник
6

Я столкнулся с этим крайне неприятным упущением при разработке Ubuntu Server 9.10. Ваше исправление очень помогло мне. Я просто хотел отметить, что исправление, необходимое для 9.10, отличается, поскольку в том же файле нет функции make_timeout ().

Для Ubuntu 9.10 перейдите в конец того же файла (00_header) и измените следующее:

if [\ $ {recordfail} = 1]; тогда
  установить время ожидания = -1
еще
  установить время ожидания = $ {GRUB_TIMEOUT}
фи
EOF

в

if [\ $ {recordfail} = 1]; тогда
  установить время ожидания = $ {GRUB_TIMEOUT}
еще
  установить время ожидания = $ {GRUB_TIMEOUT}
фи
EOF

Как и раньше, затем запустите:

sudo update-grub2
ГНТК
источник
Блестящее решение, было интересно, как это сделать, работает отлично! Примечание. При обновлении grub вам нужно только запустить: «sudo update grub» независимо от того, какую версию grub вы используете.
Это только что спасло мой бекон - мой сервер сидел в меню grub при каждой перезагрузке в течение недели - понятия не имел, что случилось, и перепробовал все. Это и подсказка в вопросе сделали это. Спасибо.
Даррен Гривз
1

Сконфигурируйте GRUB для последовательного доступа (и вашего загрузчика, пока вы на нем) и оставьте для этих случаев открытый последовательный порт, нуль-модемный кабель и конвертер USB-RS232. Я запускаю безголовый сервер и Guruplug, и у меня не было бы другого пути.

LawrenceC
источник
1

Я просто установил длинный тайм-аут для recordfail:

if [ "\${recordfail}" = 1 ]; then
  set timeout=30
else
  set timeout=${2}

Это означает, что при загрузке вы получаете 30-секундный таймаут, если предыдущая загрузка не удалась. (В отличие от того, как это делает другая ОС ...)

Это может (и IMHO должно) быть настройкой прямо в / etc / default / grub.

Гот Лунд
источник
1

Я действительно не знаю, почему это действие по умолчанию, особенно для сервера, но это то, что я реализовал в своих скриптах установки сервера.

sudo sed -i 's/set timeout=-1/set timeout=30/g' /etc/grub.d/00_header
sudo update-grub
Тони Морган
источник
1

Этот подход немного чище - просто измените, /etc/default/grubчтобы добавить строку:

GRUB_RECORDFAIL_TIMEOUT=2

... что можно сделать автоматически с помощью чего-то подобного в подготовке:

if grep '^GRUB_RECORDFAIL_TIMEOUT=' /etc/default/grub ; then
   echo GOOD: /etc/default/grub
else
   echo FIXING: /etc/default/grub
   perl -pi.bak -e \
      's/^(GRUB_TIMEOUT=.*\n)/${1}GRUB_RECORDFAIL_TIMEOUT=2\n/' \
      /etc/default/grub
   update-grub
fi

Это должно быть жизнеспособным, если переменная GRUB_RECORDFAIL_TIMEOUT упоминается в /etc/grub.d/00_header(как я вижу в 12.04 LTS) в:

make_timeout ()
{
    cat << EOF
if [ "\${recordfail}" = 1 ]; then
  set timeout=${GRUB_RECORDFAIL_TIMEOUT:--1}
else
  set timeout=${2}
fi
EOF
}

Мне немного любопытно, может ли изучение вопроса о том, как регистрируются сбои, дать еще лучший ответ.

Алекс Норт-Киз
источник
Параметр GRUB_RECORDFAIL_TIMEOUT был добавлен с момента первоначального обсуждения этого вопроса. В настоящее время да, это лучший метод.
Микепурвис