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";
}