Wie kann ich einen bestimmten Server fragen, was gebootet werden soll?

Wie kann ich einen bestimmten Server fragen, was gebootet werden soll?

Welche Optionen stehen zur Verfügung, um das folgende Startszenario durchzuführen?

Beim Booten (vor dem Booten) einen definierten Webserver kontaktieren und fragen, was gebootet werden soll (normale Antwort: Booten von der lokalen Festplatte; alternative Antwort: Boot-Image XYZ)

Das Ziel besteht darin, die Clients neu installieren zu können, ohne dass eine Benutzerinteraktion auf den Clients erforderlich ist. Der logische Weg hierfür wäre ein PXE-Boot, aber da wir die Umgebung nicht kontrollieren, ist der standardmäßige PXE-Boot unsicher, da er einen Angriffsvektor öffnen würde.

Was ich bisher herausgefunden und ausprobiert habe, ist Folgendes: Grub2 von der lokalen Festplatte starten und iPXE kettenladen. iPXE kontaktiert dann den angegebenen Webserver über http und erhält ein iPXE-Skript zurück. Aber von dort aus habe ich noch keine Möglichkeit gefunden, von der lokalen Festplatte zu booten (außer Grub erneut zu starten und in einer Endlosschleife zu enden). Das Betriebssystem, das ich booten möchte, befindet sich auf Partition 2 derselben Festplatte, von der Grub/iPXE gestartet wird.

  1. Gibt es einen alternativen Weg, um das zu erreichen, was wir erreichen wollen?
  2. Gibt es eine Möglichkeit, Grub anzuweisen, beim zweiten Start (von iPXE zurück) eine andere Option auszuwählen oder iPXE anzuweisen, von Partition 2 zu booten?

Randbemerkung: Partition 2 enthält einen Windows Boatloader und kann über das Grub-Menü gebootet werden.

Antwort1

Ich habe die folgende Technik zum Upgrade eines Remote-Systems verwendet, die Ihnen möglicherweise auch helfen könnte. Auf diesem System konnte ich nur einen Reset einleiten, nicht den (Start-)Bildschirm ansehen. Das System startete in Grub (auf Ubuntu 12.04) und hatte sowohl eine zusätzliche Partition als auch eine Datenpartition. Der Trick besteht darin, Folgendes einzufügen /etc/default/grub:

GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=false

Dass Sie immer in den Eintrag 0 (Ubuntu 12.04) booten, es sei denn:

  • jemand an der Konsole wählt etwas anderes aus
  • Sie führen aus grub-reboot X, während Sie bei Ubuntu angemeldet sind, und starten neu

Von Ubuntu aus würde ich eine TAR-Datei herunterladen und in die zusätzliche Partition extrahieren (oder kleine Änderungen manuell vornehmen), dann update-grubdas Grub-Menü aktualisieren (das die neu gefüllte zusätzliche Partition gescannt und Menüeinträge für ihr Betriebssystem erstellt hat) und dann grub-reboot und verwenden reboot.

Wenn die Maschine nicht wieder in Betrieb genommen werden kann (also nicht sshnach einer Schonfrist), kann ich sie zurücksetzen und sie wird in Ubuntu neu gestartet, bereit für die Analyse des Fehlers und den nächsten Zyklus.

Mit dem entsprechenden Programm, das beim Booten ausgeführt wird, können Sie prüfen, welches das nächste „Image“ ist, das Sie herunterladen müssen, prüfen, ob Sie es bereits haben (wenn nicht, laden Sie es herunter) und installieren Sie es. Starten Sie dann wie oben beschrieben neu.

Bei einer schlanken systemdDistribution sollte der Neustartvorgang relativ schnell erfolgen und das Herunterladen/Installieren eines alternativen Betriebssystems/einer alternativen Distribution würde den größten Teil der Zeit in Anspruch nehmen.

Antwort2

Ich habe einen Weg gefunden, das zu erreichen, wonach wir gesucht haben. Vielen Dank an @jc__ für den Hinweis mit grubenv und auch an @Anthon.

Hier ist meine Lösung: Legen Sie eine iPXE-Kernel-Binärdatei (.lkrn) mit dem benutzerdefinierten Skript zur Kontaktaufnahme mit dem Boot-Control-Server in /boot ab.

Richten Sie dann Grub ein

1- Variable aus grubenv verwenden

GRUB_DEFAULT=saved

2- Laden Sie iPXE über /boot von Grub aus und fügen Sie vor dem Booten von iPXE den folgenden Befehl ein

set saved_entry='<menuentry to boot from local drive>'
save_env saved_entry

3- Stellen Sie dem Grub-Menüeintrag, der das Betriebssystem vom lokalen Laufwerk lädt, voran mit

set saved_entry='<menuentry iPXE>'
save_env saved_entry

4- Wenn nichts getan werden muss, weist der Boot-Control-Server iPXE an, vom lokalen Laufwerk zu booten mit

sanboot --no-describe --drive 0x80

5 – Grub wird erneut geladen und bootet in das lokale Laufwerk. Der nächste Bootvorgang wird wieder als iPXE eingerichtet.

Die Startzeit von Windows 10 beträgt inklusive Abfrage des Boot Control Servers etwa 25 Sekunden. Also eigentlich ziemlich schnell. :)

Antwort3

Es gibt mindestens zwei Möglichkeiten, dies zu erreichen:

  1. Schauen Sie sich anhttp://ipxe.org/appnote/work_around_bios_halting_on_ipxe_exit#examples, einer dieser Befehle könnte für Sie funktionieren:

    chain ${server}/grub4dos.exe --config-file="find --set-root /BOOTMGR;chainloader /BOOTMGR"
    chain ${server}/grub4dos.exe --config-file="root (hd0,1);chainloader +1"
    
  2. Ich verwende derzeit Folgendes, da ich dies erstellt habe, bevor ich diese Seite zu GRUB4DOS auf der iPXE-Site gefunden habe. Erstellen Sie ein ISO-Image mit ISOLINUX und dieser Konfiguration:

    NOESCAPE 1
    PROMPT 0
    ALLOWOPTIONS 0
    
    DEFAULT chain-hd0-2
    LABEL chain-hd0-2
    SAY Chaining hd0 2...
    COM32 chain.c32
    APPEND hd0 2
    

    Und booten Sie es mit (Sie müssen hier 0x81 verwenden, da standardmäßig 0x80 verwendet wird, was die lokale Festplatte überschreiben würde):

    sanboot --drive 0x81 ${server}/chain-hd0-2.iso
    

verwandte Informationen