PXELINUX-Multi-Arch

From Syslinux Wiki
Jump to: navigation, search

Placing respective boot loader files for multiple firmware architectures (BIOS, EFI IA32 and EFI X64) into one common TFTP root, requires careful attention:

  • each boot loader file will search for the same configuration files; and,
  • c32 modules, although identically named, come in distinct incompatible architectures.

Several techniques can allow all three architectures to boot. This applies to Syslinux version 6.00 and greater (introduction of EFI32/EFI64 to Syslinux).

Common config no COM32

In this setup, you either can not use any COM32 modules or must not attempt to execute the foreign-architecture COM32 modules. This setup eliminates any use of (vesa)menu.c32.

Place the following files in the same location:

  • pxelinux.0 together with ldlinux.c32 (BIOS); and,
  • syslinux.efi (efi32/efi/syslinux.efi renamed uniquely, e.g. as syslnx32.efi or bootia32.efi) together with ldlinux.e32 (EFI IA32); and,
  • syslinux.efi (efi64/efi/syslinux.efi renamed uniquely, e.g. as syslnx64.efi or bootx64.efi) together with ldlinux.e64 (EFI X64).

Example:

 default:
  DEFAULT mylabel
  LABEL mylabel
  KERNEL boot/vmlinuz
  INITRD boot/initrd
  APPEND myoptions
  SYSAPPEND bitmask

Instead of the KERNEL directive, an alternative KERNEL-LIKE directive could be used when appropriate.

Common directory distinct config

In this setup, COM32 modules can be fully utilized. However, this setup depends on the effective use of DHCP option 209, either by:

  • feeding the network booting client DHCP option 209, either by:
    • encapsulating within vendor-options (DHCP option 43); or,
    • forcibly inserting it into the offer/acknowledgment, as it is not requested by default; or by,
  • built-in options, coded into the booting pxelinux.0/syslinux.efi binary by means of the pxelinux-options tool. In this case, clients running the same binary would use a single config.

Each architecture should be configured to utilize a respective configuration file that includes a PATH statement to an architecture-specific directory for c32 modules. The PATH directive always assumes absolute paths in its argument.

The Working Directory can be changed by means of the CONFIG directive. In-common configuration files can be INCLUDEed. For either directive, adequate relative paths are especially important in this setup.

Relative paths are based on the Current Working Directory, and secondly based according to the PATH directive. The initial Working Directory is either:

  • the tftproot; or,
  • the parent directory of the bootloader file; or,
  • set by dhcp option 210 (pathprefix); or,
  • hardcoded by the pxelinux-options tool.

For the following example, the bios.cfg file is the default configuration file for BIOS clients; the efi32.cfg file is the default configuration file for EFI IA32 clients; the efi64.cfg file is the default configuration file for EFI X64 clients.

 /tftproot/
          |_ boot/
          |      |_ vmlinuz
          |      |_ initrd
          |      |_ splash.png
          |      |_ ...
          |
          |_ bios.cfg
          |_ efi32.cfg
          |_ ef64.cfg
          |_ common.cfg
          |_ pxelinux.0
          |_ ldlinux.c32
          |_ bootia32.efi
          |_ ldlinux.e32
          |_ bootx64.efi
          |_ ldlinux.e64
          |_ ...
          |
          |_ bios/
          |      |_ (bios)*.c32
          |      |_ ...
          |
          |_ efi32/
          |       |_ (efi32)*.c32
          |       |_ ...
          |
          |_ efi64/
          |       |_ (efi32)*.c32
          |       |_ ...
          |_ ...
 bios.cfg:
  PATH bios
  INCLUDE common.cfg

 efi32.cfg:
  PATH efi32
  INCLUDE common.cfg

 efi64.cfg:
  PATH efi64
  INCLUDE common.cfg

 common.cfg:
  UI vesamenu.c32
  MENU BACKGROUND boot/splash.png
  DEFAULT mylabel
  LABEL mylabel
  KERNEL boot/vmlinuz

See also:

Distinct directory

In this setup, each client's architecture boots to a respective working directory containing its own configs and its own c32 modules. File reuse can be achieved by one of several other techniques that may depend on the particular TFTP system's capabilities (e.g. symlinks). For example, BIOS clients will load "bios/pxelinux.0", EFI32 clients will load "efi32/syslinux.efi" and EFI64 clients will load "efi64/syslinux.efi". This setup allows all architectures to use their full capabilities.

Example:

 default:
  UI vesamenu.c32
  DEFAULT mylabel
  LABEL mylabel
  KERNEL vmlinuz

When booting with "/tftproot/bios/pxelinux.0", the Current Working Directory is "/tftproot/bios/".

When booting with "/tftproot/efi32/syslinux.efi", the Current Working Directory is "/tftproot/efi32/".

When booting with "/tftproot/efi64/syslinux.efi", the Current Working Directory is "/tftproot/efi64/".


Distinct directory common kernel path

Note: The paths and file names used in this section are examples only, and are not to be interpreted verbatim.

When referencing a kernel file (e.g. vmlinuz), reference a common path. For example:

  • "::boot/vmlinuz" - TFTP path to current TFTP server starting in its root; or,
  • "http://192.0.2.3/boot/vmlinuz" - using a system capable of HTTP transfer, provided by:
    • pxelinux.0 atop gPXE/iPXE with HTTP support; or,
    • lpxelinux.0; and/or,
    • syslinux.efi.

Try to avoid using "../" notation, as it does not strip a directory but rather adds another part to the path that the TFTP server must then interpret, which one hopes it would be effective (but it is often not).

Example:

 /tftproot/
          |_ boot/
          |      |_ vmlinuz
          |      |_ ...
          |
          |_ bios/
          |      |_ pxelinux.0
          |      |_ ldlinux.c32
          |      |_ default
          |      |_ (bios)*.c32
          |      |_ ...
          |
          |_ efi32/
          |       |_ boot/
          |       |      |_ vmlinuz
          |       |      |_ ...
          |       |
          |       |_ syslinux.efi
          |       |_ ldlinux.e32
          |       |_ default
          |       |_ (efi32)*.c32
          |       |_ ...
          |
          |_ efi64/
          |       |_ syslinux.efi
          |       |_ ldlinux.e64
          |       |_ default
          |       |_ (efi64)*.c32
          |       |_ ...
          |
          |_ ...
 default:
  UI vesamenu.c32
  DEFAULT mylabel
  LABEL mylabel
  KERNEL ::boot/vmlinuz

The double colon symbol ("::") is an absolute path to the tftproot. See PXELINUX#Filename_syntax for other possible notations.


Distinct directory symlink path

Note: The paths and file names used in this section are examples only, and are not to be interpreted verbatim.

Presuming that the tftpd can resolve directory paths' symlinks, depending perhaps on a chroot...

Example for BIOS clients:

When the "boot/vmlinuz" kernel file exists, creating a symlink at "bios/boot/" targeting "../boot" or "/tftproot/boot" would allow the "boot/vmlinuz" reference to be resolved to the "/tftproot/boot/vmlinuz" file by the underlying system whose current working directory is "/tftproot/bios/".

Some tftpds may also provide for a virtual path option that would work in a similar fashion.

Example:

 /tftproot/
          |_ boot/
          |      |_ vmlinuz
          |      |_ ...
          |
          |_ bios/
          |      |_ boot  -> /tftproot/boot/
          |      |_ pxelinux.0
          |      |_ ldlinux.c32
          |      |_ default
          |      |_ (bios)*.c32
          |      |_ ...
          |
          |_ efi32/
          |       |_ boot  -> /tftproot/boot/
          |       |_ syslinux.efi
          |       |_ ldlinux.e32
          |       |_ default
          |       |_ (efi32)*.c32
          |       |_ ...
          |
          |_ efi64/
          |       |_ boot  -> /tftproot/boot/
          |       |_ syslinux.efi
          |       |_ ldlinux.e64
          |       |_ default
          |       |_ (efi64)*.c32
          |       |_ ...
          |
          |_ ...
 default:
  UI vesamenu.c32
  DEFAULT mylabel
  LABEL mylabel
  KERNEL boot/vmlinuz

A KERNEL directive such as "KERNEL boot/vmlinuz" in fact points to "::boot/vmlinuz" by means of the symlinks.


Distinct directory symlink file

Note: The paths and file names used in this section are examples only, and are not to be interpreted verbatim.

Example for BIOS clients:

When the "/tftproot/boot/vmlinuz" file exists, creating a "vmlinuz" symlink in the "/tftproot/bios/boot/" directory targeting "../../boot/vmlinuz" would be resolved to the "/tftproot/boot/vmlinuz" file.

Example:

 /tftproot/
          |_ boot/
          |      |_ vmlinuz
          |      |_ ...
          |
          |_ bios/
          |      |_ boot/
          |      |      |_ vmlinuz  -> /tftproot/boot/vmlinuz
          |      |      |_ ...
          |      |
          |      |_ pxelinux.0
          |      |_ ldlinux.c32
          |      |_ default
          |      |_ (bios)*.c32
          |      |_ ...
          |
          |_ efi32/
          |       |_ boot/
          |       |      |_ vmlinuz  -> /tftproot/boot/vmlinuz
          |       |      |_ ...
          |       |
          |       |_ syslinux.efi
          |       |_ ldlinux.e32
          |       |_ default
          |       |_ (efi32)*.c32
          |       |_ ...
          |
          |_ efi64/
          |       |_ boot/
          |       |      |_ vmlinuz  -> /tftproot/boot/vmlinuz
          |       |      |_ ...
          |       |
          |       |_ syslinux.efi
          |       |_ ldlinux.e64
          |       |_ default
          |       |_ (efi64)*.c32
          |       |_ ...
          |
          |_ ...
 default:
  UI vesamenu.c32
  DEFAULT mylabel
  LABEL mylabel
  KERNEL boot/vmlinuz

A KERNEL directive such as "KERNEL boot/vmlinuz" in fact points to "::boot/vmlinuz" by means of the symlinks.