Mit iPXE gibt es ein OpenSource-Projekt, um Netzwerkrechner ohne großen Aufwand starten zu können. Wenn man da das volle Programm haben will, sollte man sich auch den Source-Code besorgen:
git clone http://git.ipxe.org/ipxe.git cd ipxe/src
Damit habe ich einen funktionierenden Source-Tree, von dem aus ich verschiedene Ziele kompilieren kann. Wenn ich schon dabei bin, kann ich wimboot auch gleich mitnehmen.
wget -v http://git.ipxe.org/releases/wimboot/wimboot-latest.zip
In dieser ZIP-Datei befindet sich eine Datei namens wimboot.i386 und eine Datei namens wimboot.x86_64. Beide benötige ich, um WindowsPE übers Netzwerk zu starten.
Als nächstes erstelle ich eine Text-Datei, in der ich das Start-Script unterbringe, welches unmittelbar nach dem Booten von iPXE ausgeführt wird. Es ist eine bewährte Strategie, hier auf ein externes Script zu verweisen, da ich nicht bei jeder Änderung das iPXE-Binary neu kompilieren möchte.
Der Inhalt von chain.ipxe:
#!ipxe dhcp chain http://192.168.3.11/boot/net.ipxe
In der ersten Zeile teile ich dem Binary mit, das es sich um ein iPXE-Script handelt. Das dhcp sorgt für eine (erneute) Zuteilung der Netzwerkdaten vom DHCP-Server. Über das chain in der letzten Zeile übergebe ich das weitere Vorgehen an das iPXE-Script in der angegebenen Datei.
Die verfügbaren Funktionen im fertigen Binary steuere ich mit den beiden Dateien config/console.h und config/general.h. In ersterer sorge ich für ein #define CONSOLE_FRAMEBUFFER und ein #define KEYBOARD_MAP de. In der Zweiten wähle ich die zu unterstützenden Protokolle aus, die verfügbaren Image-Typen, wie PNG sowie ein #define CONSOLE_CMD. Jetzt kann ich mir mit den Befehlen:
make make bin/ipxe.pxe EMBED=chain.ipxe make bin-x86_64-efi/ipxe.efi EMBED=chain.ipxe make bin-i386-efi/ipxe.efi EMBED=chain.ipxe
die Binarys erstellen, welche später über den DHCP-Server an die bootenden Maschinen verteilt werden. Dazu muß ich diese Binarys nur noch als ipxe.pxe, ipxe.x86_64.efi bzw. ipxe.i386.efi in das root-Verzeichnis vom TFTP-Server kopieren:
cp bin/ipxe.pxe /srv/pxe/ipxe.pxe cp bin-x86_64-efi/ipxe.efi /srv/pxe/ipxe.x86_64.efi cp bin-i386-efi/ipxe.efi /srv/pxe/ipxe.i386.efi
Die entsprechende Regel für den DHCP-Server sieht so aus:
filename "ipxe.pxe"; # default filename for bootp-clients class "Legacy" { match if substring(option vendor-class-identifier, 0, 20) = "PXEClient:Arch:00000"; } class "UEFI-32-6" { # EFI IA32 (Intel x86 32-bit EFI mode) match if substring(option vendor-class-identifier, 0, 20) = "PXEClient:Arch:00006"; filename "ipxe.i386.efi"; } class "UEFI-64-1" { # EFI x86-64 (Intel x86 64-bit EFI mode) match if substring(option vendor-class-identifier, 0, 20) = "PXEClient:Arch:00007"; filename "ipxe.x86-64.efi"; }