Difference between revisions of "PXELINUX-Multi-Arch"

From Syslinux Wiki
Jump to: navigation, search
m (Common directory distinct config: Add "common.cfg" to the directory tree.)
m (Wiki formatting. Simplify example. Minor rewording.)
 
Line 3: Line 3:
 
[[Category:HowTo]]
 
[[Category:HowTo]]
 
[[Category:TFTP]]
 
[[Category:TFTP]]
Placing respective boot loader files for multiple firmware architectures (BIOS, EFI IA32 and EFI X64) into one common TFTP root, requires careful attention:
+
__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,
 
* each boot loader file will search for the same configuration files; and,
* c32 modules, although identically named, come in distinct incompatible architectures.
+
* c32 modules, although identically named, <!--
 +
-->come in distinct incompatible architectures.
  
 
Several techniques can allow all three architectures to boot.  
 
Several techniques can allow all three architectures to boot.  
This applies to Syslinux version 6.00 and greater (introduction of EFI32/EFI64 to Syslinux).
+
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 {{nowrap|foreign-architecture}} COM32 modules.  
+
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}}.
 
This setup eliminates any use of {{nowrap|(vesa)menu.c32}}.
  
 
Place the following files in the same location:
 
Place the following files in the same location:
 
* <tt>pxelinux.0</tt> together with <tt>ldlinux.c32</tt> (BIOS); and,  
 
* <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>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).
+
-->(<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:
 
Example:
 
<pre>
 
<pre>
  default:
+
  # default:
 
   DEFAULT mylabel
 
   DEFAULT mylabel
 
   LABEL mylabel
 
   LABEL mylabel
Line 41: Line 51:
 
* feeding the network booting client DHCP option 209, either by:  
 
* feeding the network booting client DHCP option 209, either by:  
 
** encapsulating within vendor-options (DHCP option 43); or,  
 
** 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,
+
** forcibly inserting it into the {{nowrap|offer/acknowledgment}}, <!--
* {{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.
+
-->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.  
+
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 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.  
+
The [[PXELINUX#Working_directory|Working Directory]] can be changed  
{{nowrap|In-common}} configuration files can be [[Config#INCLUDE|INCLUDE]]ed. For either directive, adequate relative paths are especially important in this setup.
+
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  
 
Relative paths are based on  
 
the [[PXELINUX#Working_directory|Current Working Directory]],  
 
the [[PXELINUX#Working_directory|Current Working Directory]],  
and secondly based according to the PATH directive.  
+
and secondly based according to the [[Directives/path|PATH]] directive.  
 
The initial Working Directory is either:
 
The initial Working Directory is either:
 
* the tftproot; or,
 
* the tftproot; or,
Line 60: Line 80:
  
 
For the following example,  
 
For the following example,  
the bios.cfg file is the default configuration file for BIOS clients;  
+
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 ''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.
+
the ''efi64.cfg'' file is the default configuration file for EFI X64 clients.
  
 
<pre>
 
<pre>
Line 98: Line 118:
 
</pre>
 
</pre>
 
<pre>
 
<pre>
  bios.cfg:
+
  # bios.cfg:
 
   PATH bios
 
   PATH bios
 
   INCLUDE common.cfg
 
   INCLUDE common.cfg
 
+
  efi32.cfg:
+
  # efi32.cfg:
 
   PATH efi32
 
   PATH efi32
 
   INCLUDE common.cfg
 
   INCLUDE common.cfg
 
+
  efi64.cfg:
+
  # efi64.cfg:
 
   PATH efi64
 
   PATH efi64
 
   INCLUDE common.cfg
 
   INCLUDE common.cfg
 
+
  common.cfg:
+
  # common.cfg:
 
   UI vesamenu.c32
 
   UI vesamenu.c32
 
   MENU BACKGROUND boot/splash.png
 
   MENU BACKGROUND boot/splash.png
Line 126: Line 146:
 
== Distinct directory ==
 
== Distinct directory ==
  
In this setup, each client's architecture boots to a respective working directory containing its own configs and its own c32 modules.  
+
In this setup, each client's architecture boots to a respective  
File reuse can be achieved by one of several other techniques that may depend on the particular TFTP system's capabilities (e.g. symlinks).  
+
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"}},  
 
For example, BIOS clients will load {{nowrap|"bios/pxelinux.0"}},  
 
EFI32 clients will load {{nowrap|"efi32/syslinux.efi"}} and  
 
EFI32 clients will load {{nowrap|"efi32/syslinux.efi"}} and  
Line 135: Line 157:
 
Example:
 
Example:
 
<pre>
 
<pre>
  default:
+
  # default:
 
   UI vesamenu.c32
 
   UI vesamenu.c32
 
   DEFAULT mylabel
 
   DEFAULT mylabel
Line 142: Line 164:
 
</pre>
 
</pre>
  
When booting with {{nowrap|"''/tftproot/bios/pxelinux.0''"}},  
+
When booting with {{nowrap|"<tt>''/tftproot/bios/pxelinux.0''</tt>"}},  
 
the [[PXELINUX#Working_directory|Current Working Directory]]  
 
the [[PXELINUX#Working_directory|Current Working Directory]]  
is {{nowrap|"''/tftproot/bios/''"}}.
+
is {{nowrap|"<tt>''/tftproot/bios/''</tt>"}}.
  
When booting with {{nowrap|"''/tftproot/efi32/syslinux.efi''"}},  
+
When booting with {{nowrap|"<tt>''/tftproot/efi32/syslinux.efi''</tt>"}},  
the Current Working Directory is {{nowrap|"''/tftproot/efi32/''"}}.
+
the Current Working Directory is {{nowrap|"<tt>''/tftproot/efi32/''</tt>"}}.
  
When booting with {{nowrap|"''/tftproot/efi64/syslinux.efi''"}},  
+
When booting with {{nowrap|"<tt>''/tftproot/efi64/syslinux.efi''</tt>"}},  
the Current Working Directory is {{nowrap|"''/tftproot/efi64/''"}}.
+
the Current Working Directory is {{nowrap|"<tt>''/tftproot/efi64/''</tt>"}}.
  
  
 
=== Distinct directory common kernel path ===
 
=== 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.
+
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.  
 
When referencing a kernel file (e.g. ''vmlinuz''), reference a common path.  
 
For example:  
 
For example:  
* ":<nowiki/>:boot/vmlinuz" - TFTP path to current TFTP server starting in its root; or,  
+
* ":<nowiki/>:boot/vmlinuz" - <!--
* "<nowiki>http://192.0.2.3/boot/vmlinuz</nowiki>" - using a system capable of HTTP transfer, provided by:
+
-->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,  
 
** pxelinux.0 atop gPXE/iPXE with HTTP support; or,  
 
** lpxelinux.0; and/or,
 
** lpxelinux.0; and/or,
 
** syslinux.efi.
 
** syslinux.efi.
  
Try to avoid using {{nowrap|"<tt>../</tt>"}} notation,  
+
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,  
+
as it does not strip a directory but rather  
which one hopes it would be effective (but it is often not).
+
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:
 
Example:
Line 184: Line 210:
 
           |
 
           |
 
           |_ efi32/
 
           |_ efi32/
          |      |_ boot/
 
          |      |      |_ vmlinuz
 
          |      |      |_ ...
 
          |      |
 
 
           |      |_ syslinux.efi
 
           |      |_ syslinux.efi
 
           |      |_ ldlinux.e32
 
           |      |_ ldlinux.e32
Line 204: Line 226:
 
</pre>
 
</pre>
 
<pre>
 
<pre>
  default:
+
  # default:
 
   UI vesamenu.c32
 
   UI vesamenu.c32
 
   DEFAULT mylabel
 
   DEFAULT mylabel
Line 211: Line 233:
 
</pre>
 
</pre>
  
The double colon symbol {{nowrap|("<tt>:<nowiki/>:</tt>")}} is an absolute path to the tftproot.  
+
The double colon symbol {{nowrap|1=("<code>:<nowiki/>:</code>")}}  
 +
is an absolute path to the tftproot.  
 
See [[PXELINUX#Filename_syntax]] for other possible notations.
 
See [[PXELINUX#Filename_syntax]] for other possible notations.
  
Line 217: Line 240:
 
=== Distinct directory symlink path ===
 
=== Distinct directory symlink path ===
  
Note: The ''paths and file names'' used in this section are examples only, and are not to be interpreted verbatim.
+
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...
+
Presuming that the tftpd can resolve directory paths' symlinks,  
 +
depending perhaps on a chroot...
  
 
Example for BIOS clients: <br/>  
 
Example for BIOS clients: <br/>  
  
When the {{nowrap|"''boot/vmlinuz''"}} kernel file exists,  
+
When the {{nowrap|"<tt>''boot/vmlinuz''</tt>"}} kernel file exists,  
creating a symlink at {{nowrap|"''bios/boot/''"}}  
+
creating a symlink at {{nowrap|"<tt>''bios/boot''</tt>"}}  
targeting {{nowrap|"''../boot''"}} or {{nowrap|"''/tftproot/boot''"}}  
+
targeting {{nowrap|"<tt>''../boot/''</tt>"}}  
would allow the {{nowrap|"''boot/vmlinuz''"}} reference  
+
or {{nowrap|"<tt>''/tftproot/boot/''</tt>"}}  
to be resolved to the {{nowrap|"''/tftproot/boot/vmlinuz''"}} file  
+
would allow the {{nowrap|"<tt>''boot/vmlinuz''</tt>"}} reference  
by the underlying system whose current working directory is {{nowrap|"''/tftproot/bios/''"}}.
+
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.
+
Some tftpds may also provide for a virtual path option  
 +
that would work in a similar fashion.
  
 
Example:
 
Example:
 +
{| width=100%
 +
|
 
<pre>
 
<pre>
 
  /tftproot/
 
  /tftproot/
Line 265: Line 295:
 
           |_ ...
 
           |_ ...
 
</pre>
 
</pre>
 +
|}
 
<pre>
 
<pre>
  default:
+
  # default:
 
   UI vesamenu.c32
 
   UI vesamenu.c32
 
   DEFAULT mylabel
 
   DEFAULT mylabel
Line 279: Line 310:
 
=== Distinct directory symlink file ===
 
=== Distinct directory symlink file ===
  
Note: The ''paths and file names'' used in this section are examples only, and are not to be interpreted verbatim.
+
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/>  
 
Example for BIOS clients: <br/>  
  
When the {{nowrap|"''/tftproot/boot/vmlinuz''"}} file exists,  
+
When the {{nowrap|"<tt>''/tftproot/boot/vmlinuz''</tt>"}} file exists,  
creating a "''vmlinuz''" symlink  
+
creating a "<tt>''vmlinuz''</tt>" symlink  
in the {{nowrap|"''/tftproot/bios/boot/''"}} directory  
+
in the {{nowrap|"<tt>''/tftproot/bios/boot/''</tt>"}} directory  
targeting "''../../boot/vmlinuz''"  
+
targeting "<tt>''../../boot/vmlinuz''</tt>"  
would be resolved to the {{nowrap|"''/tftproot/boot/vmlinuz''"}} file.
+
would be resolved to the {{nowrap|"<tt>''/tftproot/boot/vmlinuz''</tt>"}} file.
  
 
Example:
 
Example:
 +
{| width=100%
 +
|
 
<pre>
 
<pre>
 
  /tftproot/
 
  /tftproot/
Line 331: Line 365:
 
           |_ ...
 
           |_ ...
 
</pre>
 
</pre>
 +
|}
 
<pre>
 
<pre>
  default:
+
  # default:
 
   UI vesamenu.c32
 
   UI vesamenu.c32
 
   DEFAULT mylabel
 
   DEFAULT mylabel

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.