This method of booting WinPE uses Memdisk to boot a hard disk image containing a WinPE WIM file and the support files necessary to load and boot the WIM. This is done in order to bypass the traditional (read: Microsoft) way of network booting WinPE over TFTP, and all the inherent problems with using TFTP, specifically, scaling to any significant number of clients on cheap hardware.


You will need the following:


Download and install the Windows AIK Create an ISO containing WinPE.wim from C:\Program Files\Windows AIK\Tools\PETools\%PROCESSOR_ARCHITECTURE%\WinPE.wim (Processor_architecture is most likely x86) Create a new VM with a 200MB HD. Boot the VM from the Vista Recovery CD.

Boot Vista Recovery CD

Next → Repair → Next → Command Prompt

At the CMD Prompt:

 select disk 0
 create partition primary
 select partition 1
 format fs=ntfs quick
 detail partition (Verify active)
mkdir boot
copy d:\bootmgr c:\
copy d:\boot\boot.sdi c:\
attrib +s +h +r c:\bootmgr
bcdedit -createstore c:\boot\BCD
bcdedit -import c:\boot\BCD
bcdedit -create {bootmgr} /d "Boot Manager"
bcdedit -create -application osloader /d "WinPE"
bcdedit -create {ramdiskoptions} /d "Ramdisk Options"
bcdedit -set {bootmgr} device partition=C:
bcdedit -set {bootmgr} default %WinPE GUID%
bcdedit -set {default} device ramdisk=[C:]\winpe.wim,{ramdiskoptions}
bcdedit -set {default} osdevice ramdisk=[C:]\winpe.wim,{ramdiskoptions}
bcdedit -set {default} path \windows\system32\boot\winload.exe
bcdedit -set {default} systemroot \windows
bcdedit -set {default} detecthal yes
bcdedit -set {default} winpe yes
bcdedit -set {ramdiskoptions} ramdisksdidevice partition=C:
bcdedit -set {ramdiskoptions} ramdisksdipath \boot.sdi

Now, without restarting the VM, and still booted from the Recovery CD, unmount the Recovery CD and mount the ISO you created with WinPE.wim from the Windows AIK

copy d:\winpe.wim c:\

Unmount the CD and reboot the VM. It should boot the WinPE.wim. Once this is verified as working, mount and boot Knoppix.

Boot from Knoppix

Once booted into Knoppix, DD the Virtual Machine Hard Disk

dd if=/dev/hda of=~/winpe.dd

Throw winpe.dd up on the server of your choice and with gPXE and memdisk, boot it.

dhcp net0
kernel http://webserver/memdisk
initrd http://webserver/winpe.dd

Customizing WinPE.wim

Once you have winpe.dd which is just a 200MB Hard Disk Image, you can use Linux, fdisk, losetup, and ntfs-3g to exchange the WinPE.wim file inside winpe.dd with a customized WinPE.wim to suit your needs. This section will be filled out at a later date.

Scaling up with SLAM

All of this is highly experimental and should be used at your own risk.

Memdisk is small enough that it can probably be served over any protocol without causing a significant bottleneck when serving 30+ clients simultaneously. The 200MB Hard Drive image on the other hand could be problematic. The gPXE source contains a small multicasting server called mini-slamd. Vanilla gPXE builds to not contain support for SLAM by default. To add SLAM support, grab the gPXE source and edit gpxe/src/config/general.h

@@ -50,7 +50,7 @@
 #undef  DOWNLOAD_PROTO_HTTPS    /* Secure Hypertext Transfer Protocol */
 #undef  DOWNLOAD_PROTO_FTP      /* File Transfer Protocol */
 #undef  DOWNLOAD_PROTO_TFTM     /* Multicast Trivial File Transfer Protocol */
-#undef  DOWNLOAD_PROTO_SLAM     /* Scalable Local Area Multicast */
+#define DOWNLOAD_PROTO_SLAM     /* Scalable Local Area Multicast */
 #undef  DOWNLOAD_PROTO_FSP      /* FSP? */

Make gPXE and confirm that your build has slamd support. This can be done by booting from the compiled gPXE binary and checking the supported protocols line when gPXE boots.

mini-slamd is in gpxe/contrib/mini-slamd. mini-slamd.c contains defines that should be tailored for your specific environment, including server port, multicast ip, maximum clients, TTL, etc. Once configured, compile with the included makefile and run, with the command line argument being the winpe.dd file. Hypothetically, one could network boot a large number of WinPE clients simultaneously using this method. One example of how this might be used would be at a university, to network boot a lab of computers to WinPE and then use ImageX to connect to a multicast reimage session on a Windows Deployment Server.