Headless Ubuntu-Server stecken manchmal im GRUB-Menü

54

Ich habe Ubuntu 10.10 Server auf einem Einplatinencomputer in einer semi-eingebetteten Umgebung installiert. Keine Tastatur oder Bildschirm, nur SSH-Zugriff darauf.

Es ist also sehr frustrierend, wenn es gelegentlich hochfährt und im GRUB-Menü hängen bleibt und auf einen Tastendruck wartet, um die erste Option auszuwählen.

Wie konfiguriere ich GRUB so, dass es unter keinen Umständen auf einen Tastendruck wartet?

Update # 1: Es gibt keine menu.lst, da dies GRUB 2 ist. Aber ich habe eine / etc / default / grub, die so aussieht:

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

Update Nr. 2: Ich habe es herausgefunden. Bei Starts, die auf nicht erfolgreiche Starts folgen, deaktiviert GRUB das eigene Timeout. Da das Anzeigen des Menüs einen Start nicht erfolgreich macht, handelt es sich um eine unausweichliche Schleife. Dieses Verhalten kann durch Bearbeiten der Datei /etc/grub.d/00_header und Ändern der Funktion make_timeout deaktiviert werden:

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

Beenden Sie nun das Grub-Konfigurationsaktualisierungsskript und führen Sie es erneut aus:

sudo update-grub2

Es macht für mich keinen Sinn, dass dieses Verhalten der Standard für Ubuntu Server ist, ein Produkt, das für Computer gedacht ist, auf die über die Konsole zugegriffen wird.

mikepurvis
quelle
1
Wie /boot/grub/menu.lstsiehst du aus?
Shane Madden
7
Sie können Ihre Ergebnisse auch als Antwort auf Ihre eigene Frage anstelle einer Bearbeitung veröffentlichen. Auf diese Weise haben wir die Möglichkeit, Ihre Antwort zu bewerten, wenn es uns gefällt.
Skyhawk

Antworten:

41

Für Ubuntu 12.04 LTS gibt es eine spezielle Option, die eingestellt werden kann /etc/default/grub.

Wenn Sie zum Beispiel eine Zeitüberschreitung von 2 Sekunden wünschen (um ein Hängenbleiben bei unbeaufsichtigten Neustarts zu vermeiden), fügen Sie einfach die folgende Zeile hinzu /etc/default/grub:

GRUB_RECORDFAIL_TIMEOUT=2

Denken Sie daran, update-grubdanach zu rennen ...

Andrea Barcellona
quelle
Dies hat mein anfängliches Problem behoben, das mit dem der OPs identisch war, aber jetzt habe ich festgestellt, dass ich in den seltenen Fällen, in denen ich meinen Server an einen Monitor anschließe, nichts sehe. Der Monitor bekommt nicht einmal eine Verbindung, aber SSH funktioniert immer noch einwandfrei. Wird das erwartet?
Dowlers
18

Hier finden Sie Anweisungen für Ubuntu 10.10, die sich geringfügig von früheren Versionen unterscheiden. Kommentieren Sie in der Datei /etc/grub.d/00_header die dumme Prüfung auf einen vorherigen Startfehler aus:

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

Dann aktualisiere:

sudo update-grub

Beachten Sie, dass grub2 ein zweites Laufwerk mit angeschlossenem Linux findet, und fragen Sie beim Booten, welches Sie möchten. Entfernen Sie alle zusätzlichen Laufwerke, bevor Sie "update-grub" ausführen.

Siehe auch https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/797544

Bryce
quelle
6

Ich bin mit Ubuntu Server 9.10 auf diese zutiefst unangenehme Designübersicht gestoßen. Ihr Fix hat mir enorm geholfen. Ich wollte nur darauf hinweisen, dass das für 9.10 benötigte Update anders ist, da es keine "make_timeout ()" - Funktion in derselben Datei gibt.

Gehen Sie für Ubuntu 9.10 zum Ende derselben Datei (00_header) und ändern Sie Folgendes:

if [\ $ {recordfail} = 1]; dann
  Zeitlimit = -1 einstellen
sonst
  set timeout = $ {GRUB_TIMEOUT}
fi
EOF

zu

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

Führen Sie dann wie zuvor Folgendes aus:

sudo update-grub2
DZT
quelle
Geniale Lösung, habe mich gefragt, wie das geht, funktioniert einwandfrei! Hinweis: Wenn Sie grub aktualisieren, müssen Sie nur "sudo update grub" ausführen, unabhängig davon, welche Version von grub Sie ausführen.
Das hat gerade meinen Speck gerettet - mein Server war bei jedem Neustart seit einer Woche im Grub-Menü - hatte keine Ahnung, was los war und hatte alles versucht. Dies und der Tipp in der Frage haben es geschafft. Vielen Dank.
Darren Greaves
1

Konfigurieren Sie GRUB für den seriellen Zugriff (und Ihren Bootloader, wenn Sie gerade dabei sind) und halten Sie einen offenen seriellen Anschluss, ein Nullmodemkabel und einen USB-zu-RS232-Konverter für diese Instanzen bereit. Ich habe einen kopflosen Server und einen Guruplug und würde es nicht anders haben.

LawrenceC
quelle
1

Ich habe gerade ein langes Timeout für Rekordfehler festgelegt:

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

Das bedeutet, dass beim Booten eine Zeitüberschreitung von 30 Sekunden auftritt, wenn der vorherige Bootvorgang fehlgeschlagen ist. (Nicht anders als das andere Betriebssystem ...)

Dies könnte (und sollte meiner Meinung nach) sogar eine Einstellung in / etc / default / grub sein.

Gaute Lund
quelle
1

Ich weiß wirklich nicht, warum dies die Standardaktion ist, insbesondere für einen Server, aber dies ist, was ich in meinen Server-Setup-Skripten implementiert habe.

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

Dieser Ansatz ist ein bisschen übersichtlicher - ändern Sie ihn einfach /etc/default/grub, um die Zeile hinzuzufügen:

GRUB_RECORDFAIL_TIMEOUT=2

... was man bei der Bereitstellung automatisch mit so etwas machen könnte:

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

Dies sollte realisierbar sein, wenn die Variable GRUB_RECORDFAIL_TIMEOUT in /etc/grub.d/00_header(wie ich in 12.04 LTS sehe) erwähnt wird :

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

Ich bin ein bisschen neugierig, ob es eine noch bessere Antwort gibt, wenn man sich mit der Aufzeichnung der Fehler befasst.

Alex North-Keys
quelle
Der Parameter GRUB_RECORDFAIL_TIMEOUT wurde hinzugefügt, da diese Frage ursprünglich erörtert wurde. Heutzutage ist dies die bessere Methode.
Mikepurvis