Bezgłowy serwer z serwerem Ubuntu czasami blokuje się w menu GRUB

54

Mam Ubuntu 10.10 Server zainstalowany na maszynie jednopłytkowej w środowisku częściowo osadzonym; bez klawiatury i ekranu, tylko dostęp do SSH.

To naprawdę frustrujące, gdy czasami uruchamia się i utknie w menu GRUB, czekając na naciśnięcie klawisza, aby wybrać pierwszą opcję.

Jak skonfigurować GRUB, aby w żadnym wypadku nie czekał na naciśnięcie klawisza?

Aktualizacja nr 1: Nie ma menu.lst, ponieważ jest to GRUB 2. Mam jednak plik / etc / default / grub, który wygląda tak:

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=""

Aktualizacja nr 2: Zrozumiałem. W butach, które następują po nieudanych butach, GRUB wyłącza swój własny limit czasu. Ponieważ wyświetlenie menu powoduje, że rozruch nie powiedzie się, jest to nieunikniona pętla. To zachowanie można wyłączyć, edytując plik /etc/grub.d/00_header i zmieniając funkcję make_timeout:

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

Teraz zamknij i uruchom ponownie skrypt aktualizujący konfigurację grub:

sudo update-grub2

Nie ma dla mnie sensu, że takie zachowanie byłoby domyślne dla Ubuntu Server, produktu przeznaczonego dla komputerów obsługiwanych przez konsolę.

mikepurvis
źródło
1
Jak /boot/grub/menu.lstwyglądasz
Shane Madden
7
Możesz opublikować swoje odkrycia jako odpowiedź na własne pytanie, a nie jako edycję. W ten sposób mamy możliwość głosowania za odpowiedzią, jeśli nam się podoba.
Skyhawk,

Odpowiedzi:

41

W Ubuntu 12.04 LTS istnieje specjalna opcja, którą można ustawić /etc/default/grub.

Na przykład, jeśli chcesz mieć 2-sekundowy limit czasu (unikając w ten sposób zawieszeń w przypadku nienadzorowanych restartów), po prostu dodaj następujący wiersz /etc/default/grub:

GRUB_RECORDFAIL_TIMEOUT=2

Pamiętaj, aby pobiec update-grubpo tym ...

Andrea Barcellona
źródło
To naprawiło mój początkowy problem, który był taki sam jak OP, ale teraz zauważyłem, że przy rzadkiej okazji, kiedy podłączam mój serwer do monitora, nic nie widzę. Monitor nawet nie uzyskuje połączenia, ale SSH nadal działa dobrze. Czy jest to oczekiwane?
Dowlers
18

Oto instrukcje dla Ubuntu 10.10, które nieco różnią się od poprzednich wersji. W pliku /etc/grub.d/00_header skomentuj głupie sprawdzenie poprzedniej awarii rozruchu:

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

Następnie zaktualizuj:

sudo update-grub

Pamiętaj, że jeśli jest drugi dysk z podłączonym Linuksem, grub2 go znajdzie i zapyta cię przy starcie, który z nich chcesz. Usuń wszystkie dodatkowe dyski przed uruchomieniem „update-grub”.

Zobacz także https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/797544

Bryce
źródło
6

Z tym głęboko nieprzyjemnym nadzorem projektowym natknąłem się na Ubuntu Server 9.10. Twoja poprawka bardzo mi pomogła. Chciałem tylko zauważyć, że poprawka wymagana dla wersji 9.10 jest inna, ponieważ w tym samym pliku nie ma funkcji „make_timeout ()”.

W przypadku Ubuntu 9.10 przejdź na koniec tego samego pliku (00_header) i zmień następujące ustawienia:

if [\ $ {recordfail} = 1]; następnie
  ustaw limit czasu = -1
jeszcze
  ustaw limit czasu = $ {GRUB_TIMEOUT}
fi
EOF

do

if [\ $ {recordfail} = 1]; następnie
  ustaw limit czasu = $ {GRUB_TIMEOUT}
jeszcze
  ustaw limit czasu = $ {GRUB_TIMEOUT}
fi
EOF

Tak jak poprzednio, uruchom:

aktualizacja sudo-grub2
GNTC
źródło
Świetne rozwiązanie, zastanawiałem się, jak to zrobić, działa idealnie! Uwaga: Kiedy aktualizujesz grub, musisz tylko uruchomić: „sudo update grub” bez względu na wersję uruchomionego gruba.
To właśnie uratowało mi bekon - mój serwer siedział w menu grub przy każdym ponownym uruchomieniu komputera przez tydzień - nie miał pojęcia, co jest nie tak i próbował wszystkiego. Zrobiło to to i wskazówka w pytaniu. Dzięki wielkie.
Darren Greaves
1

Skonfiguruj GRUB dla dostępu szeregowego (i bootloadera, gdy jesteś przy nim) i trzymaj otwarty port szeregowy, kabel null-modem i konwerter USB-na-RS232 w takich przypadkach. Prowadzę bezgłowy serwer i Guruplug i nie chciałbym tego inaczej.

LawrenceC
źródło
1

Właśnie ustawiłem długi limit czasu dla rekordowej awarii:

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

Oznacza to, że otrzymujesz 30 sekund limitu czasu podczas uruchamiania, jeśli poprzednie uruchomienie nie powiodło się. (Podobnie jak ten inny system operacyjny ...)

To może (i IMHO powinno) być nawet ustawieniem w / etc / default / grub.

Gaute Lund
źródło
1

Naprawdę nie wiem, dlaczego jest to akcja domyślna, szczególnie dla serwera, ale właśnie to zaimplementowałem w moich skryptach konfiguracji serwera.

sudo sed -i 's/set timeout=-1/set timeout=30/g' /etc/grub.d/00_header
sudo update-grub
Tony Morgan
źródło
1

To podejście jest nieco czystsze - wystarczy zmodyfikować, /etc/default/grubaby dodać linię:

GRUB_RECORDFAIL_TIMEOUT=2

... co można zrobić automatycznie z czymś takim podczas udostępniania:

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

Powinno to być wykonalne, jeśli zmienna GRUB_RECORDFAIL_TIMEOUT jest wymieniona w /etc/grub.d/00_header(jak widzę w 12.04 LTS) w:

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

Jestem trochę ciekawy, czy zagłębianie się w sposób rejestrowania awarii może dać jeszcze lepszą odpowiedź.

Alex North-Keys
źródło
Parametr GRUB_RECORDFAIL_TIMEOUT został dodany, ponieważ to pytanie zostało pierwotnie omówione. W dzisiejszych czasach jest to lepsza metoda.
mikepurvis