By default VMware virtual machines only PXE boot on first install. Once an operating system has been installed on the hard drive, it will boot that and never try to network boot again. This is due to the default BIOS boot order. By changing the boot order, they can be configured to try a network boot first and after a short timeout boot from disk.
In the vSphere client, find the VM in question, and chose Edit Settings
. Under VM Options
, expand Boot Options
and enable the
“Force BIOS setup” option.
Connect to the console and reboot the VM. It should now boot directly
into the BIOS Setup Utility. Use the arrow keys to navigate to the
Boot
menu. Note that “Hard Drive” is listed before “Network Boot”.
Use the arrow keys to highlight the “Network boot” item and then the +
key move it above the “Hard Drive” item.
Move to the Exit
menu and press Enter
to “Exit Saving Changes”.
Now, every time the VM boots, it will first network boot. If that fails, it will then boot the disk normally. Configure your PXE server to continue booting to the hard drive after a short timeout if there is no user interaction. This is typically the default configuration for most setups; the relevant part of our pxelinux configuration that does this:
TIMEOUT 50
ONTIMEOUT local
[...]
LABEL local
MENU LABEL Boot first hard drive
LOCALBOOT 0
Unfortunately, this whole process is manual. I’d like to know if there is a programmatic way to make these changes. The best I’ve come up with is to do this manually to one virtual machine, and use that as a template for future VMs.