У меня установлен сервер 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
}
Мне немного любопытно, может ли изучение того, как регистрируются отказы, дать еще лучший ответ.