Preparation
You will need:
- The syslinux 4.07 package, which includes PXELinux, from https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.07.zip
- I recommend 4.07 as later versions are unable to load memtestx86+ and require additional libraries.
- A functional Windows Deployment Services role, which is beyond the scope of this article
Extract these files from syslinux-4.07.zip into a temporary folder
- /core/pxelinux.0 and rename it to pxelinux.com
- /com32/menu/vesamenu.c32
- /com32/chain/chain.c32
- /memdisk/memdisk (If you want to be able to load raw floppy images and/or ISOs)
File Installation
From here on out, RemoteInstall will refer to the “Remote Installation Folder” you chose during initial setup of WDS
- Copy the above files into \RemoteInstall\Boot\x86
- In the x86 folder, make a copy of abortpxe.com and name it abortpxe.0
- Also make a copy of pxeboot.n12 and rename it to pxeboot.0
- We make copies of these files because pxelinux is picky about file extensions.
- Repeat steps 1-3 in the \RemoteInstall\Boot\x64 directory
The x86 and x64 directories should now have the highlighted files in them.
Initial Configuration
We can make configuration files and a folder for images in either architecture directory, but then we’d be using double the space for storing boot images and we’d have to edit our configuration twice. Instead, we’ll use junctions (symlinks.)
- Create the folder \RemoteInstall\Boot\pxelinux.cfg
- Note that it’s a folder named “pxelinux.cfg” and not a file
- Now create the junction. For this you’ll need to open a command window in the x86 directory and run
- mklink /J pxelinux.cfg E:\RemoteInstall\Boot\pxelinux.cfg
- To get a command window in the x86 directory you can hold shift and right click in the directory and click “Open command window here…”
- mklink /J pxelinux.cfg E:\RemoteInstall\Boot\pxelinux.cfg
- Repeat step 2 but in the x64 directory instead
- Make a plaintext file called “default” in \RemoteInstall\Boot\pxelinux.cfg\ and place this sample configuration in it. Make sure there is no file extension.
DEFAULT vesamenu.c32 PROMPT 0 NOESCAPE 0 ALLOWOPTIONS 0 # Timeout in units of 1/10 s TIMEOUT 300 MENU MARGIN 10 MENU ROWS 16 MENU TABMSGROW 21 MENU TIMEOUTROW 26 MENU COLOR BORDER 30;44 #20ffffff #00000000 none MENU COLOR SCROLLBAR 30;44 #20ffffff #00000000 none MENU COLOR TITLE 0 #ffffffff #00000000 none MENU COLOR SEL 30;47 #40000000 #20ffffff #MENU BACKGROUND MyMenuBackgroundPicture640x480.jpg MENU TITLE PXE Boot Menu #--- LABEL wds MENU LABEL Windows Deployment Services KERNEL pxeboot.0 #--- LABEL Abort MENU LABEL AbortPXE Kernel abortpxe.0 #--- LABEL local MENU DEFAULT MENU LABEL Boot from Harddisk LOCALBOOT 0 Type 0x80
- You should be able to see this file when browsing to either \RemoteInstall\Boot\x86\pxelinux.cfg or \RemoteInstall\Boot\x64\pxelinux.cfg
- If not, check your junctions
- Create a folder to store your boot images in
- I used \RemoteInstall\Images\Linux
- Make junctions in each folder like before
- mklink /J Linux E:\RemoteInstall\Images\Linux
- The junctions should appear like this
- mklink /J Linux E:\RemoteInstall\Images\Linux
- Now that everything is in place we need to change WDS’s default boot images to pxelinux. To do this we’ll run the following commands from an Administrator command prompt
wdsutil /set-server /bootprogram:boot\x86\pxelinux.com /architecture:x86 wdsutil /set-server /N12bootprogram:boot\x86\pxelinux.com /architecture:x86 wdsutil /set-server /bootprogram:boot\x64\pxelinux.com /architecture:x64 wdsutil /set-server /N12bootprogram:boot\x64\pxelinux.com /architecture:x64
At this point you can attempt to boot from the server. You should get the Pxelinux menu; selecting Windows Deployment Services should bring up the WDS menu. If this isn’t the case, go back and make sure all steps have been completed.
Samples
We’ll add memtest86+ and an ISO file to the server as an example. The PXELINUX wiki has some more information about other clients here.
Memtest86+
You’ll need to grab the latest pre-compiled bootable binary from memtest.org and extract the bin file from it. Rename it to just “memtest86+” and place it in your Linux directory.
Add this to your pxelinux configuration, “#—“ separates menu items. LABEL must be unique for each item.
#--- LABEL memtest86+ MENU LABEL Memtest86+ 5.01 KERNEL /Linux/memtest86+
Attempt to boot memtest86+ by selecting it from the pxelinux menu.
- Again, pxelinux can be picky about file extensions
ISO/floppy Image
Here I’m using partedmagic, but this should work with just about any ISO. See the memdisk documentation for more details.
Place your ISO or floppy image in the Linux directory. Since we’re using memdisk we don’t have to worry about the file extension. Here I’m using Partedmagic, the configuration will look something like this
#--- LABEL pmagic MENU LABEL Parted Magic 2013_08_01 KERNEL memdisk INITRD /Linux/pmagic_2013_08_01.iso APPEND iso
If you’re using a floppy image you won’t include “APPEND iso”. Some Windows installation media also requires you add raw to the append line (APPEND iso raw).