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ę.


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 ...


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


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

Ś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.


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.


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

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ź.


Parametr GRUB_RECORDFAIL_TIMEOUT został dodany, ponieważ to pytanie zostało pierwotnie omówione. W dzisiejszych czasach jest to lepsza metoda.
mikepurvis
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.