Here are some points I’d like to make to clarify the relationship between PXELinux, Etherboot and gPXE/iPXE:
- PXELinux and gPXE serve different purposes: as the interesting paper x86 Network Booting: Integrating gPXE and PXELINUX points out, PXELinux is a so-called Network Boot Program (NBP) – a program that is loaded by the PXE Boot ROM located on your network interface card or integrated in your mainboard’s BIOS. gPXE can be a NBP, but is usually used as PXE Boot Code (BC) and Universal Network Driver Interface (UNDI) driver combined into a single image, which can be programmed into a ROM or loaded from the original PXE Boot ROM as a more sophisticated replacement. So to put it together:
- the NIC’s PXE Boot ROM becomes active. This may be the original ROM, however you might have replaced it with gPXE.
- It sends a DHCP request and gets in the DHCP response the server IP and the filename to request.
- It tries to contact a TFTP service on
and requests .
- It downloads the file and tries to execute it. This is the Network Boot Program mentioned above. The NBP may be PXELinux, however it could again be gPXE. In the latter case, gPXE will not provide the same feature set as PXELinux – most often this setup is used when the NIC’s PXE Boot ROM is buggy or featured-limited and the ROM can not be replaced with a ROM containing gPXE. The original PXE Boot ROM then chainloads gPXE, transfers control to it and gPXE does the “real” work, eg. downloading a Linux kernel via HTTP.
- As the linked paper points out, the PXELinux and gPXE projects aim for some sort of cooperation. As a result, gPXE has been integrated into the syslinux source distribution. When you build syslinux, you do not only get core/pxelinux.0 but also a gpxe/gpxelinux.0 binary. As doc/pxelinux.txt in the source archive points out, this is a combination of gPXE, compiled as undionly.kkpxe (ie. no network drivers included, the UNDI driver of the PXE Boot ROM’s PXE stack does not get unloaded) and PXELinux. By contrast to the original pxelinux.0, gpxelinux.0 can eg. download the PXELinux configuration from arbitrary HTTP URLs. Think of a dynamic PHP script accessing some sort of deployment database.
- As the linked paper also points out, gPXE originates in the Etherboot project. Etherboot was born way back as a project to generate network boot ROMs for NICs, albeit not in the PXE manner. As PXE became popular, gPXE was born. Again, for details see the paper.
- Now what’s iPXE? Interpreting the iPXE FAQ, there was disagreement within the Etherboot project which led to a fork. iPXE is the modern successor by the same people who wrote gPXE and as such also used with QEMU, for instance. Syslinux (and thus PXELinux) still uses iPXE, until a stable versioning scheme becomes available, however the iPXE guys have git branches with ipxelinux.