Difference between revisions of "PXELINUX-Multi-Arch"

From Syslinux Wiki
Jump to: navigation, search
(begin the page)
 
m (Wiki formatting. Simplify example. Minor rewording.)
 
(8 intermediate revisions by 2 users not shown)
Line 1: Line 1:
Placing multiple architectures (BIOS, EFI32 and EFI64) into 1 common TFTP root requires careful attention as the they will search for the same configuration files and COM32 modules and library modules although identically named, come in 3 distinct incompatible architectures. Outlined below are several techniques that can allow all three to boot. This applies to Syslinux 6.00 and greater (introduction of EFI32/EFI64 to Syslinux).
+
[[Category:PXELINUX]]
 +
[[Category:Examples]]
 +
[[Category:HowTo]]
 +
[[Category:TFTP]]
 +
__NOEDITSECTION__
 +
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 ==
 
== 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 eliminates any use of menu.c32/vesamenu.c32 through the UI directive (setting DEFAULT to point at a ui system like menu.c32/vesamenu.c32 is discouraged).
 
  
Place pxelinux.0/ldlinux.c32 (BIOS), syslinux.efi(efi32/efi/syslinux.efi renamed uniquely as syslnx32.efi or bootia32.efi)/ldlinux.e32(EFI32), and syslinux.efi(efi64/efi/syslinux.efi renamed uniquely as syslnx64.efi or bootx64.efi)/ldlinux.e64(EFI64) into the appropriate directory on the TFTP root.
+
In this setup, you either can not use any COM32 modules or  
 +
must not attempt to execute the {{nowrap|foreign-architecture}} COM32 modules.  
 +
This setup eliminates any use of {{nowrap|(vesa)menu.c32}}.
  
 +
Place the following files in the same location:
 +
* <tt>pxelinux.0</tt> together with <tt>ldlinux.c32</tt> (BIOS); and,
 +
* <tt>syslinux.efi</tt> <!--
 +
-->(<tt>efi32/efi/syslinux.efi</tt> renamed uniquely, <!--
 +
-->e.g. as syslnx32.efi or bootia32.efi) <!--
 +
-->together with <tt>ldlinux.e32</tt> (EFI IA32); and,
 +
* <tt>syslinux.efi</tt> (<tt>efi64/efi/syslinux.efi</tt> renamed uniquely, <!--
 +
-->e.g. as syslnx64.efi or bootx64.efi) <!--
 +
-->together with <tt>ldlinux.e64</tt> (EFI X64).
 +
 +
Example:
 +
<pre>
 +
# default:
 +
  DEFAULT mylabel
 +
  LABEL mylabel
 +
  KERNEL boot/vmlinuz
 +
  INITRD boot/initrd
 +
  APPEND myoptions
 +
  SYSAPPEND bitmask
 +
</pre>
 +
 +
Instead of the KERNEL directive,
 +
an alternative [[Config#KERNEL-LIKE_DIRECTIVES|KERNEL-LIKE directive]]
 +
could be used when appropriate.
  
 
== Common directory distinct config ==
 
== Common directory distinct config ==
In this setup, COM32 modules can be fully utilized however this depends on the effective use of DHCP option 209, either by built-in options (coded into the booting binary pxelinux.0/syslinux.efi by pxelinux-options) or by feeding the PXE booting client DHCP option 209, either by encapsulating within vendor-options (DHCP option 43) or forcibly inserting it into the offer/acknowledgement, as it's not requested by default.  This also presumes 1 common config regardless of UUID/MAC/IP address.
 
  
All 3 architectures should be configured to utilize a unique configuration file that includes a PATH statement to an architecture-specific directory for COM32 modules and library modules.
+
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 {{nowrap|offer/acknowledgment}}, <!--
 +
-->as it is not requested by default; or by,
 +
* {{nowrap|built-in}} options, <!--
 +
-->coded into the booting {{nowrap|pxelinux.0/syslinux.efi}} binary <!--
 +
-->by means of the <!--
 +
-->[[PXELINUX#Hardcoded_options|{{nowrap|<tt>pxelinux-options</tt>}}]] 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 [[Directives/path|PATH]] statement to an
 +
{{nowrap|architecture-specific}} directory for c32 modules.
 +
The PATH directive always assumes absolute paths in its argument.
 +
 +
The [[PXELINUX#Working_directory|Working Directory]] can be changed
 +
by means of the [[Config#CONFIG|CONFIG]] directive.
 +
{{nowrap|In-common}} configuration files can be [[Config#INCLUDE|INCLUDE]]ed.
 +
For either directive,
 +
adequate relative paths are especially important in this setup.
 +
 +
Relative paths are based on
 +
the [[PXELINUX#Working_directory|Current Working Directory]],
 +
and secondly based according to the [[Directives/path|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 <tt>pxelinux-options</tt> 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.
 +
 +
<pre>
 +
/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
 +
          |      |_ ...
 +
          |_ ...
 +
</pre>
 +
<pre>
 +
# 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
 +
</pre>
 +
 +
See also:
 +
* [[Directives/path]]
 +
* [[PXELINUX#Working_directory]]
 +
* [[Config#INCLUDE]]
 +
* [[Config#CONFIG]]
  
 
== Distinct directory ==
 
== Distinct directory ==
In this setup, each architecture boots a unique directory, has its own configs and COM32 modules and library modules. File reuse can be achieved by one of several other techniques that may depend on the particular TFTP system's capabilities (ie symlinks).
+
 
 +
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 {{nowrap|"bios/pxelinux.0"}},
 +
EFI32 clients will load {{nowrap|"efi32/syslinux.efi"}} and
 +
EFI64 clients will load {{nowrap|"efi64/syslinux.efi"}}.
 +
This setup allows all architectures to use their full capabilities.
 +
 
 +
Example:
 +
<pre>
 +
# default:
 +
  UI vesamenu.c32
 +
  DEFAULT mylabel
 +
  LABEL mylabel
 +
  KERNEL vmlinuz
 +
</pre>
 +
 
 +
When booting with {{nowrap|"<tt>''/tftproot/bios/pxelinux.0''</tt>"}},
 +
the [[PXELINUX#Working_directory|Current Working Directory]]
 +
is {{nowrap|"<tt>''/tftproot/bios/''</tt>"}}.
 +
 
 +
When booting with {{nowrap|"<tt>''/tftproot/efi32/syslinux.efi''</tt>"}},
 +
the Current Working Directory is {{nowrap|"<tt>''/tftproot/efi32/''</tt>"}}.
 +
 
 +
When booting with {{nowrap|"<tt>''/tftproot/efi64/syslinux.efi''</tt>"}},
 +
the Current Working Directory is {{nowrap|"<tt>''/tftproot/efi64/''</tt>"}}.
 +
 
  
 
=== Distinct directory common kernel path ===
 
=== Distinct directory common kernel path ===
Reference kernel path outside boot directory
+
 
 +
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:
 +
* ":<nowiki/>:boot/vmlinuz" - <!--
 +
-->TFTP path to current TFTP server starting in its root; or,
 +
* "<nowiki>http://192.0.2.3/boot/vmlinuz</nowiki>" - <!--
 +
-->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 {{nowrap|"<code>../</code>"}} notation,
 +
as it does not strip a directory but rather
 +
adds another part to the path that the TFTP server must then interpret,
 +
which we all hope it would be effective (but it is often not).
 +
 
 +
Example:
 +
<pre>
 +
/tftproot/
 +
          |_ boot/
 +
          |      |_ vmlinuz
 +
          |      |_ ...
 +
          |
 +
          |_ bios/
 +
          |      |_ pxelinux.0
 +
          |      |_ ldlinux.c32
 +
          |      |_ default
 +
          |      |_ (bios)*.c32
 +
          |      |_ ...
 +
          |
 +
          |_ efi32/
 +
          |      |_ syslinux.efi
 +
          |      |_ ldlinux.e32
 +
          |      |_ default
 +
          |      |_ (efi32)*.c32
 +
          |      |_ ...
 +
          |
 +
          |_ efi64/
 +
          |      |_ syslinux.efi
 +
          |      |_ ldlinux.e64
 +
          |      |_ default
 +
          |      |_ (efi64)*.c32
 +
          |      |_ ...
 +
          |
 +
          |_ ...
 +
</pre>
 +
<pre>
 +
# default:
 +
  UI vesamenu.c32
 +
  DEFAULT mylabel
 +
  LABEL mylabel
 +
  KERNEL ::boot/vmlinuz
 +
</pre>
 +
 
 +
The double colon symbol {{nowrap|1=("<code>:<nowiki/>:</code>")}}
 +
is an absolute path to the tftproot.
 +
See [[PXELINUX#Filename_syntax]] for other possible notations.
 +
 
  
 
=== Distinct directory symlink path ===
 
=== Distinct directory symlink path ===
Ref to a kernel path that's symlinked
+
 
 +
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: <br/>
 +
 
 +
When the {{nowrap|"<tt>''boot/vmlinuz''</tt>"}} kernel file exists,
 +
creating a symlink at {{nowrap|"<tt>''bios/boot''</tt>"}}
 +
targeting {{nowrap|"<tt>''../boot/''</tt>"}}
 +
or {{nowrap|"<tt>''/tftproot/boot/''</tt>"}}
 +
would allow the {{nowrap|"<tt>''boot/vmlinuz''</tt>"}} reference
 +
to be resolved to the {{nowrap|"<tt>''/tftproot/boot/vmlinuz''</tt>"}} file
 +
by the underlying system whose current working directory is
 +
{{nowrap|"<tt>''/tftproot/bios/''</tt>"}}.
 +
 
 +
Some tftpds may also provide for a virtual path option
 +
that would work in a similar fashion.
 +
 
 +
Example:
 +
{| width=100%
 +
|
 +
<pre>
 +
/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
 +
          |      |_ ...
 +
          |
 +
          |_ ...
 +
</pre>
 +
|}
 +
<pre>
 +
# default:
 +
  UI vesamenu.c32
 +
  DEFAULT mylabel
 +
  LABEL mylabel
 +
  KERNEL boot/vmlinuz
 +
</pre>
 +
 
 +
A KERNEL directive such as {{nowrap|"''KERNEL boot/vmlinuz''"}}
 +
in fact points to "'':<nowiki/>:boot/vmlinuz''" by means of the symlinks.
 +
 
  
 
=== Distinct directory symlink file ===
 
=== Distinct directory symlink file ===
Ref a file that's a symlink
+
 
 +
Note: The ''paths and file names'' used in this section are examples only,
 +
and are not to be interpreted verbatim.
 +
 
 +
Example for BIOS clients: <br/>
 +
 
 +
When the {{nowrap|"<tt>''/tftproot/boot/vmlinuz''</tt>"}} file exists,
 +
creating a "<tt>''vmlinuz''</tt>" symlink  
 +
in the {{nowrap|"<tt>''/tftproot/bios/boot/''</tt>"}} directory
 +
targeting "<tt>''../../boot/vmlinuz''</tt>"
 +
would be resolved to the {{nowrap|"<tt>''/tftproot/boot/vmlinuz''</tt>"}} file.
 +
 
 +
Example:
 +
{| width=100%
 +
|
 +
<pre>
 +
/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
 +
          |      |_ ...
 +
          |
 +
          |_ ...
 +
</pre>
 +
|}
 +
<pre>
 +
# default:
 +
  UI vesamenu.c32
 +
  DEFAULT mylabel
 +
  LABEL mylabel
 +
  KERNEL boot/vmlinuz
 +
</pre>
 +
 
 +
A KERNEL directive such as {{nowrap|"''KERNEL boot/vmlinuz''"}}
 +
in fact points to "'':<nowiki/>:boot/vmlinuz''" by means of the symlinks.

Latest revision as of 15:31, 31 October 2020


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 we all hope it would be effective (but it is often not).

Example:

 /tftproot/
          |_ boot/
          |      |_ vmlinuz
          |      |_ ...
          |
          |_ bios/
          |      |_ pxelinux.0
          |      |_ ldlinux.c32
          |      |_ default
          |      |_ (bios)*.c32
          |      |_ ...
          |
          |_ efi32/
          |       |_ 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.