IPXE
Contents
What is PXE?
Abbreviation Means
Preboot Execution Environment (PXE)
Alternate Resources
A good resource to use to gain a great understand of exactly what PXE is would be to click Understanding PXE Booting
Summary
The PXE protocol is, approximately, a combination of DHCP and TFTP working together to provide a boot environment over networking means. Subtle modifications to both DHCP and TFTP during the PXE Boot environment are made. DHCP is used to locate the appropriate boot server. TFTP is used to download the initial bootstrap program and/or additional files as needed.
To initiate a PXE bootstrap session the PXE firmware broadcasts a DHCPDISCOVER packet extended with PXE-specific options (extended DHCPDISCOVER) to port 67/UDP (DHCP server port). The PXE options identify the firmware as capable of PXE, but they will be ignored by standard DHCP servers. If the firmware receives DHCPOFFERs from such servers, it may configure itself by requesting one of the offered configurations.
These are normally portrayed with:
Linux DHCP (ISC|DHCP|DHCP3)
Server Location
next-server
File to Download
filename "<FILENAME TO RECIEVE>"
Windows DHCP/AD
Server Location
Option 66
File to Download
Option 67
DNSMasq/proxyDHCP
Item's in reference are bolded to help standout. The 3 fields are not needed, just used here to represent typical usage. You can set dhcp-boot with only one field (the boot filename) or two (bootfilename and server).
Server Location
dhcp-boot=pxelinux.0,fogserver,10.0.0.10
File to Download
dhcp-boot=pxelinux.0,fogserver,10.0.0.10
What is iPXE?
Formerly gPXE project, iPXE is an open source PXE implementation and bootloader. It can be used to enable computers without built-in PXE support to boot from the network, or to extend an existing PXE implementation with support for additional protocols. While traditional PXE clients use TFTP to transfer data, iPXE adds the ability to retrieve data through other protocols like HTTP, iSCSI, ATA over Ethernet (AoE), and Fibre Channel over Ethernet (FCoE), and can work with Wi-Fi rather than requiring a wired connection.
- YES, (technically) wireless imaging is supported but largely untested due to the absence in most BIOS setups.
What are the differences between the different PXE files?
Filenames
- ipxe has drivers native to the ipxe project. Those drivers are handled from the iPXE developers.
- undionly uses the "undi" stack made by the manufacturer of the NIC.
Universal Network Device Interface (UNDI) is an application programming interface (API) for network interface cards (NIC) used by the Preboot Execution Environment (PXE) protocol.
When chainloading iPXE from PXE, iPXE can use this API (instead of loading a hardware driver). This way, you're getting support for network controllers that are not natively supported by iPXE. Some network controllers have improved performance when using the UNDI driver over the vendor specific iPXE driver.
To use the UNDI driver, select the UNDI driver (undionly) when generating the iPXE ROM. (e.g. make bin/undionly.kpxe EMBED=embedscriptname) Reference without edits here.
Extensions
More info can be referenced here: [1]
- .pxe is an image designed to be chain loaded, unloading both the underlying PXE and UNDI code sections. This is ultimately the goal, but there's not enough information to allow this to actually work flawlessly every time. It uses, purely, the drivers from the iPXE information. One of the benefits is the codebase for the drivers are handled by the iPXE developers. So, in theory and given enough time, all NICs could potentially be supported.
From the etherboot site:
* .pxe is an image designed to be chain loaded, unloading both the underlying PXE and UNDI code sections. etherboot.org
- .kpxe unloads just the pxe stack and is the normal file we want in use as it seems to be the best between pxe/chaining I can find without flashing roms.
From the etherboot site:
* .kpxe is a PXE image that keeps UNDI loaded and unloads PXE etherboot.org
- .kkpxe keeps both undi and pxe stacks in place. kkpxe works best for buggy hardware. Only recommended if you're having weird issues with the undionly.kpxe
From the etherboot site:
* .kkpxe is a PXE image that keeps PXE+UNDI loaded and return to PXE (instead of int 18h). From here etherboot.org
- .kkkpxe is only used to generate the ipxelinux.0 file. This is only used in conjunction with the syslinux project. When gpxe was the developed software of this type the file was called gpxelinux.0 which can usually be built with modern syslinux.
More information on this can be found on the ipxe forum thread located here.
Undi and iPXE Stack
The UNDI driver is a generic driver that works on network cards that have a vendor UNDI ROM. The ROM contains driver code that is supposed to conform to the PXE/UNDI specification. iPXE can load the UNDI driver and use it instead of a native driver.
Depending on the iPXE image type, UNDI support works as follows:
- undionly.kpxe is loaded from a vendor PXE stack and uses UNDI on the network card that it was booted from.
- All-driver (ipxe) or undi images can load the UNDI for PCI network cards. The network boot ROM must be enabled in the BIOS in order for the UNDI ROM to be visible to iPXE. Note that only the first network card is supported with UNDI since multiple instances of UNDI is unreliable and cannot be supported.
Why write native drivers if UNDI works with every network card?
- iPXE is an open source PXE stack and provides UNDI services. iPXE cannot be used as an option ROM without a native driver.
- UNDI is slow because iPXE must switch CPU modes when calling it.
- UNDI ROMs can be buggy or violate the PXE specification. Native drivers are known to work with iPXE and can be fixed if there is a bug since they are part of the iPXE codebase.
- Enabling the network boot ROM in the BIOS is not always possible or desirable.