Kleine Experimente mit iPXE durchgeführt

Viele von euch werden die PXE-Umgebung so eingerichtet haben, wie ich das in den von mir veröffentlichen Anleitungen erklärt habe. Es gab ja schon die ganze Zeit das Problem, dass man im UEFI-Modus immer in den sauren Apfel beißen musste, weil dort irgendwas nicht funktionierte. Entweder konnte man andere EFI Bootloader nicht quer laden oder diese hatten andere Probleme, wie zum Beispiel dass die meisten Tools dort nicht mehr funktionierten.

Ich habe mir daher mal das iPXE-Projekt etwas genauer angesehen. Damit könnten die bisher aufgetretenen Probleme gelöst werden. Wir könnten also sowohl für Linux Derivate, als auch für Windowsinstallationen endlich eine Ebene schaffen, die problemlos für beide Vorhaben funktionieren würde.

iPXE Firmwarestart
iPXE Firmwarestart

Hier seht Ihr beispielsweise den UEFI Netzwerkboot über IPv4.

Ablaufdarstellung

Hier wird nach dem eigentlichen Firmwarestart (Obere Bildschirmhälfte auf dem Bild) die neue Firmware geladen (Untere Bildschirmhälfte auf dem Bild). Er lädt also zuerst die ipxe.efi (Das ist die neue Netzwerk Boot Firmware), um dann erneut eine Anfrage an den DHCP Server zu stellen, der dann den eigentlichen PXE-Bootloader schickt. Das hört sich etwas umständlich an, aber anders funktioniert das leider nicht. Das würde nur komplett entfallen, wenn die Firmware selbst in das BootRom der Netzwerkkarte gebrannt würde. Ob das allerdings wirklich sinnvoll wäre, weiß ich nicht. Hier müssen aber zwei Firmware miteinander agieren, damit dieses Konstrukt funktioniert. Und genau deshalb funktionierte meine bisherige Anleitung auch nicht bei den Leuten, die diese iPXE Firmware verwendeten. Die DHCP-Option 209 geht nämlich schlicht auf dem Weg ohne Anpassungen an die neuen Gegebenheiten, verloren .

Beim Test entdeckte Schwierigkeiten

Träge mit pxelinux.0 im Legacy Modus

Wenn iPXE nicht nur für den UEFI Modus genutzt wird, sondern auch für den Legacy Mode, dann funktioniert das in Verbindung mit der PXELinux 6.04 Version etwas träge. Ich persönlich wäre auch dafür, iPXE nur für UEFI Geräte verwenden zu wollen. Syslinux ist nämlich ein mächtiges Tool. Denn in dem alten Legacy Mode ist dieses sogar besser als iPXE meiner Meinung nach. Jedenfalls kann Syslinux im Legacy Mode all das, was iPXE auch könnte. Ich finde rein von der Grundidee her, auch Syslinux bei Weitem verständlicher und nutzerfreundlicher (Menüaufbau und Befehle), als das was die Herren und Frauen da bei iPXE gezaubert haben. Das soll nicht heißen, dass diese keine großartige Arbeit geleistet haben! Es ist für mich nur etwas ungewohnt.

TFTP-BlockSize Werte werden nicht beachtet

Aus dem iPXE UEFI Menü heraus kann der Windows-Boot-Manager gestartet werden, aber die TFTP-Einstellungen werden dort nicht mehr beachtet. Ich hatte die TFTPBlockSize-Werte nämlich in der BCD-Datei verändert, um die TFTP Geschwindigkeit deutlich zu beschleunigen. Wenn der WBM über iPXE aufgerufen wird, dann werden diese Einstellungen anscheinend nicht beachtet. Die Übertragungen laufen dann nämlich wieder so langsam ab (4 MB/s), als hätte ich nichts optimiert. Wenn ich über das alte Pxelinux 6.04 den WBM aufrufe, ist es wieder normal schnell (20 MB/s). Woran es liegt weiß ich noch nicht.

iPXE ist unfähig die Syslinux.efi (pxelinuxEFI64.efi) zu starten

Unter Verwendung der iPXE Firmware lässt sich Syslinux im UEFI Modus nicht aufrufen. Dies wird immer mit einem Fehler quittiert. Das ist aber im Endeffekt auch egal. Ich dachte mir nur anfangs, es wäre sehr bequem einfach nur zwei Einträge im iPXE Menü zu erstellen:

Einen Verweis zum WBM und dann einem zum Syslinux UEFI Menü, denn dann hätte man alle Fliegen mit einer Klappe geschlagen ohne großartig viel ändern zu müssen. Das funktioniert nur dummerweise nicht. Naja, macht nichts.

iPXE UEFI – Das Keyboard Layout ist immer Englisch

Der Hersteller selbst schreibt in seiner Dokumentation, dass man die Sprache in der Datei /src/config/console.h mittels der Zeile:

 #define KEYBOARD_MAP us

ändern kann. Aber selbst wenn man das us gegen de tauscht, wie das hier beschrieben ist: https://ipxe.org/buildcfg/keyboard_map,  ändert sich nichts an der Tatsache. In der offiziell erhältlichen Firmware wird zwar die englische Tastatur genutzt, dafür werden die Umlaute aber korrekt dargestellt. Wer diese hingegen selbst kompiliert, bei dem funktioniert dann nicht mal mehr das. Woran es liegt weiß ich nicht. Ich habe zu dem Problem schon intensiv recherchiert und ich scheine da nicht der Einzige mit diesem Problem zu sein. Eine Lösung habe ich leider noch nicht gefunden.

Resümee

Ich bin bei meinen Tests nun soweit, dass ich mit dem Ergebnis schon durchaus zufrieden bin:

iPXE Testsetup
iPXE Testsetup

Es können aus dieser Umgebung heraus der Windows-Boot-Manager gestartet werden und auch Linux Installationen funktionieren ohne Probleme.

iPXE Linux-Live-Systeme
iPXE Linux-Live-Systeme
iPXE Ubuntu 20.04
iPXE Ubuntu 20.04

WinPEs mittels Wimboot mit HTTP “Lichtgeschwindigkeit” laden:

iPXE Wimboot WinPE
iPXE Wimboot WinPE

Das Verlassen des iPXE-Menüs setzt auch den normalen Bootvorgang fort. Es wird zwar ein Fehler angezeigt, er macht es aber trotzdem. Vielleicht bekomme ich das auch noch hin, dass es komplett ohne Fehlermeldung abläuft. Werde mich da wohl noch etwas einlesen müssen. Es ist für mich allerdings eine kleine Umstellung, da ich nun schon wieder eine neue Menü- und Befehlsstruktur lernen muss.

Warum müssen die eigentlich immer das Rad neu erfinden? 😀

Ansonsten bin ich schwer angetan. Beim Aussehen könnte man auch noch was machen. Meine dort verwendete Firmware ist die offiziell erhältliche und dort sind in den Standardeinstellungen die Konsolenfunktionen deaktiviert. Die braucht man aber um das Ganze grafisch etwas aufzuwerten (Farben/Hintergrundbild/Abstände). Dies muss dann aber selbst kompiliert werden.

Da habe ich ja so richtig Lust drauf. 😎

Abschnitt aktualisiert:

Habe nun die Firmware für UEFI32 und UEFI64 kompiliert und alles eingestellt:

iPXE Grafisches Menü
iPXE Grafisches Menü

Mein altes PXELinux Menü habe ich in einem auch gleich angepasst:

PXElinux Grafisches Menü
PXElinux Grafisches Menü

Wann ich jetzt genau dazu komme die Anleitungen von mir anzupassen, weiß ich noch nicht. Denn eigentlich müsste ich die Anleitungen fast komplett neu schreiben. Mal sehen.

Abschnitt aktualisiert:

Habe nun alle Beispieldateien und Konfigurationen für die Anleitungen erstellt. Jetzt muss ich nur noch die Anleitungen selbst ändern. 😀

Auf eure Meinungen bin ich schon gespannt. Wie seht Ihr das? Benutzt Ihr iPXE schon lange? Wie findet Ihr dieses im Vergleich zu anderen erhältlichen Bootloadern (pxelinux/GRUB/LILO usw.)? Lasst es mich wissen. Der Kommentarbereich wartet schon auf euch.

Zum Anfang!

24 Antworten auf „Kleine Experimente mit iPXE durchgeführt“

  1. Hallo Stefan,
    ich finde es toll wie du dich mit PXE und nun mit iPXE ins Zeug legst, ich würde mich freuen wenn Du eine Anleitung dafür machen könntest.
    Würde dich dabei auch gerne unterstüzen wenn du möchtest…
    VG Roland

    1. Dankeschön. Ich weiß nur noch nicht ganz, wie genau du mir helfen könntest. Was käme dir denn da so ganz spontan in den Sinn? 🙂

        1. Ich habe die meisten Anleitungen bereits aktualisiert. Sind alle an die iPXE Firmware angepasst. Du musst sie nur noch lesen. 🙂

    1. Richtig. Das ist eine der vielen weiterführenden Anleitungen, die auf dieser hier beruhen:

      https://www.german-syslinux-blog.de/synology-dsm-6-0-syslinux-6-04-pxetftpdhcp-server-einrichten/

      Damit die Windows Anleitung funktioniert, müssen natürlich erst einmal die Server eingerichtet sein.

      Zitat:
      “Da hast Du dir aber extrem viel Mühe gemacht, hut ab da wäre ich nie durch gestiegen…”

      Mach Dir nichts daraus. Ich habe 12 Jahre lang eine Support Community betrieben und habe eine gewisse Übung daran, nicht nur Anleitungen zu verfassen, sondern mich auch mit den Nutzern auseinandersetzen zu müssen. Ich wünsche dir viel Spaß beim Einrichten. 😎

  2. Toll, Deine Beschreibung. Vielen Dank.
    Wegen meiner langsamen FritzPowerLAN-Strecke zwischen Rechner und Synology und der Unfähigkeit meines LOM-Adapters, Deine Bootmanager-Einträge bezügl. Deiner vorgeschlagenen tftpblocksize und tftpwindowsize umzugehen, war ich auf der Suche nach einer Möglichkeit, den PXE-Code im LAN-Adapter zu aktualisieren. Leider Fehlanzeige. Dann bin ich über das Stichwort “chainloading” auf die Möglichkeit gestoßen, iPXE zu benutzen, und damit auf Deine aktualisierte Beschreibung.
    Fast auf Anhieb habe ich Deine neue iPXE-Implementierung zum Fliegen gebracht. Ich bin begeistert. Da ich nur Legacy-Hardware habe, habe ich in der dhcpd-pxe.conf den BIOS-Modus aktiviert. Mußte nur Deine undionly.kpxe in undionly.kpxe.0 umbenennen, weil Du sie in der dhcpd-pxe.conf so genannt hattest. Jetzt muß ich mich nur noch mit der neuen Menüstruktur vertraut machen. Allerdings kann ich Deine oben erwähnte Einschränkung, daß die TFTP-Blocksize ignoriert wird, nicht bestätigen. Die SDI- und WIM-Datei werden binnen 6 Minuten übertragen, was sonst ca. 1 Std. dauerte.

    1. Freut mich, dass alles so reibungslos geklappt hat. 🙂

      Bezüglich der TFTP-Blocksize ging es nur um den UEFI Modus. Im Legacy Modus funktioniert das weiterhin wie gehabt bei mir.

  3. So, jetzt habe ich die iPXE Menüstruktur mit meinen Ideen angepaßt. Nun zeigen sich zwei Probleme, die ich ohne Deine Hilfe wohl nicht werde lösen können.
    Vorausschicken möchte ich, daß ich nur Legacy Hardware habe, auf denen ich testen kann.
    1. WinPE 10.0 (ADK 10 Build 2004) läßt sich über WBM nicht mehr ausführen. Nach dem Laden wird startnet.cmd korrekt ausgeführt, aber im winpe_menu.cmd scheitert wpeutil UpdateBootInfo
    mit Fehler 0x8007000d. FEHLER: Der angegebene Registrierungsschlüssel bzw. Wert wurde nicht gefunden. Diese Anzeige konnte ich natürlich erst sehen, nachdem ich @echo off und cls herausgenommen hatte, sonst kam nur “echo” kann syntaktisch an dieser Stelle nicht verarbeitet werden. In der Registry steht dann als PEBootType “Error” statt ramdisk und PEFirmwareType fehlt. Da bin ich mir meinem Latein am Ende.
    2. Das Starten von memtest86.5.01 funzt gar nicht, weder als iso noch als bin.
    Soviel erst einmal zu meinen Erfahrungen.

    1. 1. Das war mir auch schon aufgefallen. Ich bin mir noch nicht sicher warum das bei Verwendung der iPXE Firmware und des WBM nicht mehr funktioniert. Aber sei’s drum. Ich werde bei Zeiten den Fehler abfangen und die Skripte dafür anpassen. Solange kannst du die WIM-Dateien mittels Wimboot laden. Dort ist das Problem nicht präsent.
      2. Ich weiß zwar nicht wie die Zeile bei Dir zum Starten von Memtest 5.01 aussieht, aber damit funktioniert’s:

      :memtest501_x86_64
      echo ${chotkey}Memtest 5.01${resetbold} 64-Bit 
      set base-url images/memtest
      chain ${boot-url}${base-url}/memtest501.0
      boot || goto failed
      goto start
      

      Eventuell müsstest du noch die Pfade anpassen.

  4. Nachdem ich mich nun ca. einen Monat lang mit iPXE beschäftigt habe, ist meine Begeisterung etwas abgekühlt.
    Vorausschicken möchte ich, daß ich hauptsächlich aus einem Grund auf PXE gestoßen bin, nämlich, daß ich im Fehlerfall mein Betriebssystem von einer Sicherungs-Datei wiederherstellen kann, ohne eine CD/DVD einzulegen, auf der mein Restore-Programm liegt.
    Ich benutze seit vielen Jahren mit Erfolg O&O DriveImage einer Berliner Firma. Die CD/DVD zum Offline-Laden des Programms ist Windows 7 bzw. 10 basiert in den verschiedenen Programmversionen.
    Wie gesagt, habe ich nur Legacy Hardware, einen ASRock Vision 3D Desktop, einen Lenovo und einen Acer Laptop.

    Seltsamerweise verhalten sich die Rechner native unterschiedlich bei sonst völlig gleichen iPXE-Einstellungen.
    In der VirtualBox funktioniert alles auch unter iPXE, wie es soll, aber das hilft mir natürlich im Fall eines Windows “Breakdown” nicht weiter.
    Leider kann ich in der VirtualBox im EFI-Modus nicht von LAN booten, sonst könnte ich das auch ausprobieren.
    Jedenfalls habe ich durch vieles Probieren das eine oder andere Problem gelöst durch Benutzen von lpxelinux.0 aus Syslinux 6.03
    und memdisk aus 6.03.

    Was ich nicht lösen konnte im iPXE Modus, ist, daß mein ASRock die O&O ISOs zwar booten kann, aber das Windows dann aber ohne Anzeige “einschläft”, nachdem das Windows Logo eine Weile angezeigt wurde und sich die Punkte drehten.
    Der Bildschirm bleibt dann dunkel, aber Windows scheint irgendwie noch zu “atmen”. Durch mehrmaliges Alt-F4 Drücken wird ein Reboot angestoßen. Ich weiß nicht, wie ich diesen Status analysieren soll.

    Die anderen Möglichkeiten von iPXE, wie Windows- oder Linux-Installationen sind für mich eher zweitrangig und “Spielerei”.
    Daher werde ich wohl oder übel wieder auf PXE zurückfallen, da hierbei alles so funktioniert, wie es soll.

    Ein weiterer Wunsch, ein Windows auf einer iSCSI-Platte zu installieren, scheitert schon beim Zuordnen des Target,
    das ich auf einem Synology-NAS definiert habe mit der Nachricht: Could not open SAN device: Operation not permitted (http://ipxe.org/410d613c).
    Hast Du schon mit iSCSI experimentiert?

    Na ja, ein erfüllter Wunsch gebiert halt augenblicklich Junge. Vielleicht kannst Du mir den einen oder anderen Tipp geben.
    Vielen Dank für Deine Geduld.

    1. Wenn dieses O&O Driveimage mit einem älteren WinPE arbeitet, dann darfst du nicht die BCD_Wimboot nehmen und all die anderen Dateien (bootmgr.exe, boot.sdi), die dazu gehören. Dann müsstest du diese manuell aus deinem O&O Driveimage ISO fischen und dann via wimboot darauf verlinken. Die vorgefertigten Dateien aus meinem Paket sind nur für Windows 10 WinPE’s geeignet. Es kann zwar sein, dass eventuell auch mal ältere WinPE Versionen funktionieren (Windows 8 z.b.), aber das ist ein Glücksspiel. So verschieden ist Windows 8 zu 10 nicht. Bei Windows 7 sieht das schon wieder anders aus.

      Mit iSCSI habe ich mal etwas herum gespielt und mir ein spezielles WinPE gebastelt. In iPXE habe ich das nicht konfiguriert gehabt. Da das aber rein dem Spieltrieb geschuldet war, habe ich mich damit auch nicht intensiv beschäftigt. Ich konnte allerdings ein iSCSI-Target im WinPE einbinden. Da ich hier sowieso schnelle PCIe NVMe SSDs habe, macht es keinen Sinn das ich ein Windows System auf dem langsamen NAS liegen habe und davon boote. Ich habe hier nur 1 Gbit zur Zeit. 😀 Das wäre ein Rückschritt. Für den Notfall habe ich Backups, die innerhalb von 5 Minuten zurück gespielt sind. Da das ganz ganz selten vorkommt, habe ich das alles nicht weiter verfolgt gehabt.

      Wenn du nun überhaupt nicht glücklich sein solltest, dann kannst du das ja alles wieder komplett rückgängig machen. Da du ja eh nur Asbach Hardware hast, wäre das ja auch nicht schlimm. Nur wäre es ja eigentlich nicht verkehrt, das auch neuere Clients bei dir funktionieren. Das musst du aber selber wissen. Wenn du dir nie einen neuen Rechner/Notebook anschaffen willst…

  5. Also der Tipp, die ISOs zu entpacken und die darauf befindlichen SDI- und WIM-Dateien zu benutzen, war schon mal Gold wert. Vielen Dank. Ich bleibe bei iPXE.

  6. Hallo,

    erstmal danke für dieses Projekt hier. Das hat mir schonmal sehr weiter geholfen. Ich versuche derzeit die iPXE*.efi dateien selber zu kompilieren. Hat auch soweit geklappt. Leider funktionieren sie aber anstelle deiner nicht. Ich vermute mal, dass mir ein paar Einstellungen fehlen im config order.
    Daher meine Frage an Dich. Wie hast du denn diese beiden Dateien erzeugt? Welche Einstellungen hast du geändert im src/config ordner? oder hast du make ggf. parameter mitgegeben?

    1. Hallo,

      es wäre ja schon nicht schlecht gewesen, wenn du auch geschrieben hättest, was genau da nicht funktioniert… 🙂
      Ich hatte nur das Nötigste für den Download im Artikel geändert. Das wäre einmal die /src/config/console.h:

      #define KEYBOARD_MAP	us

      in

      #define KEYBOARD_MAP	de

      geändert (Funktioniert aber nicht wie erwartet bei mir…) und bei

      //#define CONSOLE_FRAMEBUFFER

      die // Zeichen entfernt.

      Dann noch /src/config/general.h:

      //#define  IMAGE_PNG
      //#define  CONSOLE_CMD

      aktiviert und die // Zeichen entfernt. Diese Änderungen sind nötig, sonst kannst du das Menü nicht grafisch und individuell an deine Bedürfnisse anpassen.

      Für jede einzelne Variante habe ich jeweils eigene make Befehle verwendet:

      Erstellt für UEFI & UEFI64 Clients eine Firmware:

      make bin-x86_64-efi/ipxe.efi

      Erstellt für UEFI32 Clients eine Firmware:

      make bin-i386-efi/ipxe.efi

      Erstellt für BIOS Clients eine Firmware:

      make bin/undionly.kpxe

      Das war es auch schon.

  7. ok… ich denke, ich habe es hinbekommen:

    man muss in der src/config/console.h folgendes ändern vor dem make:

    alt:

    #define.+KEYBOARD_MAP us
    //#define CONSOLE_FRAMEBUFFER

    neu:
    #define KEYBOARD_MAP de
    #define CONSOLE_FRAMEBUFFER

    —————————

    und ja … das mit der deutschen tastatur hat bei mir auch nicht funktioniert. 🙁

    1. hier nochmal die ansible tasks, die daraus entstanden sind:

      “`
      – name: install build dependencies
      become: ‘yes’
      apt:
      name:
      – liblzma-dev
      – binutils-dev
      – lib32z1-dev
      – libiberty-dev
      – git
      delegate_to: localhost
      tags:
      – pxeserver
      – build_ipxe

      – name: get ipxe dir
      register: ipxe_dir
      stat:
      path: ./files/ipxe
      delegate_to: localhost
      tags:
      – pxeserver
      – build_ipxe

      – name: clone ipxe repository
      git:
      dest: ./files/ipxe
      repo: ‘{{ ipxe_repo }}’
      version: ‘v{{ ipxe_version }}’
      delegate_to: localhost
      when: not ipxe_dir.stat.exists
      tags:
      – pxeserver
      – build_ipxe

      – name: set german keyboad layout before make
      lineinfile:
      path: files/ipxe/src/config/console.h
      regexp: ‘#define.+KEYBOARD_MAP’
      line: ‘#define KEYBOARD_MAP de’
      delegate_to: localhost
      tags:
      – pxeserver
      – build_ipxe

      – name: activate framebuffer console before make
      lineinfile:
      path: files/ipxe/src/config/console.h
      regexp: ‘//#define CONSOLE_FRAMEBUFFER’
      line: ‘#define CONSOLE_FRAMEBUFFER’
      delegate_to: localhost
      tags:
      – pxeserver
      – build_ipxe

      – name: activate console before make
      lineinfile:
      path: files/ipxe/src/config/console.h
      regexp: ‘//#define CONSOLE_CMD’
      line: ‘#define CONSOLE_CMD’
      delegate_to: localhost
      tags:
      – pxeserver
      – build_ipxe

      – name: make ipxe
      make:
      chdir: ./files/ipxe/src
      target: ‘{{ item }}’
      with_items:
      – bin/undionly.kpxe
      – bin-x86_64-efi/ipxe.efi
      – bin-i386-efi/ipxe.efi
      delegate_to: localhost
      tags:
      – pxeserver
      – build_ipxe
      “`

Schreibe einen Kommentar zu Stefan Saft Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert