Autoboot without a DHCP-supplied boot path
gPXE can be built with an embedded image, which might be a script. That script might look like this:
#!gpxe dhcp net0 chain url://for.your/boot/script.gpxe
That is, obtain an IP address through DHCP on the first network interface and then load and run another script from a specific URL. However, if a network connection is only available on some other interface, dhcp net0
will fail and the script will stop executing.
gPXE also has an autoboot
command, which tries to scan all the network interfaces to obtain an IP address and then boot from the server and path specified in the DHCP reply.
By patching the gPXE source code, one can however use autoboot
as a more flexible dhcp
command, ignoring the DHCP boot options. This is how:
Go into src/usr/autoboot.c
and find the netboot()
function. In that function there is a line “route();
”. After that line, add “return 0;
”. This causes autoboot to return when it has obtained a DHCP lease so that the next command is run.
Go into src/hci/commands/autoboot_cmd.c
and find the line “/* Can never return success by definition */
”. Change the following line from “return 1;
” to “return 0;
”.
Now build your patched gPXE with the following embedded script:
#!gpxe autoboot chain url://for.your/boot/script.gpxe
You now have a patched gPXE that will obtain a DHCP lease on any network interface and then load the script from the specified URL, ignoring the DHCP boot options.
This method is of course a hack which will likely be obsoleted by scripting language improvements in the future.