SCCM/Windows Deployment Services: PXE mit ISC DHCP

Microsoft's Windows Deployment Services (WDS), die auch in Zusammenarbeit mit dem SCCM eingesetzt werden, bieten Funktionen, die mit funktionierendem Client-Boot mittels PXE am komfortabelsten zu verwenden sind. Damit PXE funktioniert, muss dem Client bei einem Netzwerkboot per DHCP mitgeteilt werden, was er zu booten versuchen soll. Microsoft selbst empfiehlt, entweder den WDS oder zumindest einen mit dem WDS verbandelten DHCP-Server einzusetzen und notfalls per IP-Helper unterschiedliche Netze an den einen DHCP-Server weiterzuverweisen. Das ist oft nicht wünschenswert.

Statt dessen ist es eher üblich, verteilte DHCP-Server einzusetzen. Auf diesem Gebiet ist der ISC DHCP einer der Platzhirsche. Damit PCs nicht nur das passende PXE-Bootimage finden, sondern danach auch noch mit dem WDS zusammenarbeiten, spielen die DHCP-Optionen 60 (PXE), 66 (Boot-Server) und 67 (Bootfile) eine Rolle. Im einfachsten Fall landen wir bei einer sehr simplen ISC-DHCP-Konfiguration:

# WDS Server IP oder Name
option tftp-server-name "192.168.5.63";
next-server 192.168.5.63;
# PXE Boot Image
option bootfile-name "\\smsboot\\x64\\wdsnbp.com";
filename "\\smsboot\\x64\\wdsnbp.com";

Die Verwendung sowohl von next-server/filename als auch den beiden Optionen tftp-server-name und bootfile-name ist redundant, betrifft aber nicht dieselben Teile der DHCP-Antwort. Aktuelle PCs begnügen sich mit den beiden "option"-Angaben

Wo sich das Boot-Image befindet ist mit der WDS-Installation gegenzuprüfen – gegebenenfalls ist statt smsboot boot zu verwenden. Die IP-Adresse 192.168.5.63 steht hier stellvertretend für den WDS-Server und muss natürlich angepasst werden.

Das funktioniert soweit gut für PCs, die im traditionellen BIOS-Modus starten. PCs im UEFI-Modus benötigen ein anderes Boot-Image, nämlich wdsngfw.efi. Nun liesse sich natürlich in der DHCP-Konfiguration pro Client ein eigenes Boot-Image festlegen. Der Verwaltungsaufwand dafür wäre dann allerdings nicht klein. Am bequemsten ist es deshalb, wenn der DHCP-Server selbst die richtige Angabe liefern kann. Glücklicherweise melden die Clients dem DHCP-Server, welche (Boot-)Architektur sie haben und der DHCP-Server kann abhängig von der Architektur unterschiedlich antworten. Das sieht in der Konfiguration etwa so aus:

option arch code 93 = unsigned integer 16;

subnet ... {
...
# WDS Server IP oder Name
option tftp-server-name "192.168.5.63";
next-server 192.168.5.63;

# PXE boot image
if option arch = 00:07 or option arch = 00:09 {
   filename "\\smsboot\\x64\\wdsngfw.efi";
   option bootfile-name "\\smsboot\\x64\\wdsngfw.efi";
} else {
  filename  "\\smsboot\\x64\\wdsnbp.com";
  option bootfile-name  "\\smsboot\\x64\\wdsnbp.com";
}

Anhand der Client-Architektur verweisen wir den Client an unterschiedliche Boot-Images. Als Architekturen sind definiert:

0    Intel x86PC
1    NEC/PC98
2    EFI Itanium
3    DEC Alpha
4    Arc x86
5    Intel Lean Client
6    EFI IA32
7    EFI BC (EFI Byte Code)
8    EFI Xscale
9    EFI x86-64

Entsprechend lässt sich natürlich obige if-Anweisung ergänzen um die Unterstützung weiterer Plattformen. z.B. würde sich aufdrängen, für die Architektur 6 (UEFI 32-bit) die Datei smsboot\\x86\\wdsmgfw.efi auszuliefern, und wdsnbp.com nur der Architektur 0 (Legacy BIOS) zuzuordnen.

Es reicht allerdings nicht in jedem Fall aus, einfach das richtige Boot-Image zu übermitteln. Erhalten Sie z.B. folgende Fehlermeldung

Windows Deployment Services (Server IP 0.0.0.0)
Windows Deployment Services encountered an error:
Error Code: 0xc0000023

dann bedeutet dies, dass zwar das .efi-Image geladen wurde, dies nun aber nicht weiss, was es tun soll. Für solche Fälle hat es sich als hilfreich erwiesen, per Option 60 den String "PXEClient" mitzuliefern:

option arch code 93 = unsigned integer 16;
option pxec code 60 = string;

subnet ... {
...
# WDS Server IP oder Name
option tftp-server-name "192.168.5.63";
next-server 192.168.5.63;

# PXE boot image
if option arch = 00:07 or option arch = 00:09 {
   # UEFI 64-bit
   option pxec "PXEClient";   
   filename "\\smsboot\\x64\\wdsngfw.efi";
   option bootfile-name "\\smsboot\\x64\\wdsngfw.efi";
}
if option arch = 00:06 {
   # UEFI 32-bit
   option pxec "PXEClient";   
   filename "\\smsboot\\x86\\wdsngfw.efi";
   option bootfile-name "\\smsboot\\x64\\wdsngfw.efi";
}
if option arch = 00:00 {
  # Legacy BIOS
  filename  "\\smsboot\\x64\\wdsnbp.com";
  option bootfile-name  "\\smsboot\\x64\\wdsnbp.com";
}

Nebenbei haben wir in diesem Beispiel auch noch gleich die Unterscheidung zwischen 32b/64b eingebaut und liefern das Image für BIOS-Boot nur dann, wenn die passende Architektur gefordert wird. Auch der Fehler 102 deutet übrigens auf dieselbe Ursache hin.