Назад | Перейти на главную страницу

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

У меня установлен сервер Ubuntu 10.10 на одноплатной машине в полу-встраиваемой среде; нет клавиатуры или экрана, только доступ к нему по 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, продукта, предназначенного для машин, доступ к которым осуществляется с консоли.

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

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

GRUB_RECORDFAIL_TIMEOUT=2

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

Вот инструкции для 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

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

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

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

к

if [ \${recordfail} = 1 ]; then
  set timeout=${GRUB_TIMEOUT}
else
  set timeout=${GRUB_TIMEOUT}
fi
EOF

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

sudo update-grub2

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

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

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

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

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

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

sudo sed -i 's/set timeout=-1/set timeout=30/g' /etc/grub.d/00_header
sudo update-grub

Этот подход немного чище - просто измените /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
}

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