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.
Next → Repair → Next → Command Prompt
At the CMD Prompt:
diskpart select disk 0 create partition primary select partition 1 format fs=ntfs quick active detail partition (Verify active) c: 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.
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.
#!gPXE dhcp net0 kernel http://webserver/memdisk initrd http://webserver/winpe.dd boot
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.
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
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.