Loading Windows PE with iPXE

One of the things that got me looking at iPXE, was the number of Operating Systems you can load. I often need to deploy series of systems with a mixture of Windows, VMware and Linux of various flavours, so having one tool to network boot them all is really handy.

To get Windows loaded, I use Microsoft's MDT to script an unattended build. In order to install an MDT-based build over the network, you need to get Windows PE loaded first, and the PE media will then load the rest of the scripts (VBScript) and GUI (HTA-based) and run through the task-sequence you configure in the MDT wizard.

Loading PE turned out to be not so tricky:

#!ipxe

kernel wimboot
initrd http://${next-server}/win/bootmgr          bootmgr
initrd http://${next-server}/win/BCD              BCD
initrd http://${next-server}/win/segmono_boot.ttf segmono_boot.ttf
initrd http://${next-server}/win/segoe_slboot.ttf segoe_slboot.ttf
initrd http://${next-server}/win/wgl4_boot.ttf    wgl4_boot.ttf
initrd http://${next-server}/win/boot.sdi         boot.sdi
initrd http://${next-server}/win/lt64.wim         boot.wim
imgstat
boot

The first thing you need is the wimboot kernel, available here. Once you've compiled it and placed it in your PXE/HTTP path, you can load it like you would any Linux OS kernel. The various PE components are then loaded into memory using the initrd command, and boot continues as normal as if you had booted the DVD, with PE resident in memory.

The files - bootmgr, BCD, boot.sdi and boot.wim can all be copied from your PE media when generated in MDT. The fonts - segmono_boot.ttf, segoe_slboot.ttf and wgl4_boot.ttf are optional, however highly highly recommended. If anything goes wrong with your boot, you won't get any messages on-screen without these fonts.

The first argument to initrd should point to the TFTP or HTTP location of the file. The second should remain the same as the above example, as wimboot/PE looks for files loaded into memory with these names.