PXE boot with DD-WRT and Ubuntu

After spending all afternoon fighting with my new server and my DD-WRT router, I finally figured out how to get my server to PXE boot and fire up an Ubuntu install. All it really involved was setting up TFTP on another box (my desktop, to be specific), adding a line to DD-WRT's DNSMasq options, and configuring the damn server to boot from PXE, which was the hardest part. Luckily, for those of you who are struggling with it, here's how I did it.

Setting up the PXE client

I had to get my server to boot PXE in the first place. For most people, this just means poking around in the BIOS. Not for me though.

After poking around the HP site, I've found out that my server is a first generation Proliant DL360. Since it's an older machine, this means that it doesn't have a built-in BIOS config, but I had to actually download the old Compaq SmartStart 5.5 CD. I had to hunt around the HP website, but to save you the trouble, you can snag it here:

http://ftp.hp.com/pub/products/servers/supportsoftware/ZIP/smartstart-5.50-0.zip

Once you boot from the CD, you'll want to go into the System Configuration Utility when prompted. From there, it's just like a giant BIOS. Just turn PXE on for whatever ethernet port you're using and it's rarin' to go.

Setting up the TFTP server

Once my server was setup for PXE booting, I had to set up a tftp server for it to grab the boot image from. Since I was using my desktop, which runs Ubuntu, as a host, setup was pretty easy. I just used tftpd-hpa per the Ubuntu wiki's recommendation.

      # sudo aptitude install tftpd-hpa

I had to also edit the configuration file at /etc/default/tftpd-hpa. Mine looks like this:

      #Defaults for tftpd-hpa
      RUN_DAEMON="yes"
      OPTIONS="-l -s /var/lib/tftpboot"

Since I was wanting to PXE boot into an Ubuntu install, I had to extract the install files into /var/lib/tftpboot as I put in the config file. For example, the netboot image files for Ubuntu 9.04 can be found here:

http://archive.ubuntu.com/ubuntu/dists/jaunty/main/installer-i386/current/images/netboot/netboot.tar.gz

Setting up the the DHCP server

DD-WRT uses dnsmasq for DHCP, so if you have a system which uses it too it shouldn't be too much different to setup. Watch out, though! I initially screwed up my configuration which really messed with my router.

All you have to do is add a line to the Additional DNSMasq Options found under the Services tab. If you're running plain dnsmasq, just add the line to your dnsmasq.conf file. The line goes a little something like this:

      dhcp-boot=pxelinux.0,mybox,10.0.0.100

where pxelinux.0 is the file to boot, mybox is the hostname of the tftp server, and 10.0.0.100 is the IP address of the tftp server. You could probably get away with only specifying the hostname or just leaving it blank and supplying the IP address. You can also get more fancy and send certain boot images to certain machines, etc. This way works just fine on a home network like mine.

Once you get this all setup, any machines that try to PXE boot will receive the image and boot to it. If you used the Ubuntu install image like I did, you'll be able to install Ubuntu on any PXE-capable machine or even boot into a rescue shell! Just remember that if you can't setup a boot order (like my Proliant) make sure to disable the PXE boot in dnsmasq before rebooting.