| .. SPDX-License-Identifier: GPL-2.0+ | |
| Copyright 2010-2011 Calxeda, Inc. | |
| PXE Boot and extlinux.conf | |
| ========================== | |
| The ``pxe`` commands provide a near subset of the functionality | |
| provided by the PXELINUX boot loader. This allows U-Boot based systems | |
| to be controlled remotely using the same PXE based techniques that | |
| many non U-Boot based servers use. | |
| The ``sysboot`` command and Extlinux boot method use the same file | |
| format as PXE boot for ``extlinux.conf``. | |
| Commands | |
| -------- | |
| ``pxe get`` | |
| **Syntax:** ``pxe get`` | |
| follows PXELINUX's rules for retrieving configuration files | |
| from a tftp server, and supports a subset of PXELINUX's config | |
| file syntax. It requires certain environment variables to be | |
| set, see the Environment section below. | |
| **File Paths** | |
| ``pxe get`` repeatedly tries to download config files until it | |
| either successfully downloads one or runs out of paths to | |
| try. The order and contents of paths it tries mirrors exactly | |
| that of PXELINUX - you can read in more detail about it at: | |
| http://syslinux.zytor.com/wiki/index.php/Doc/pxelinux | |
| ``pxe boot`` | |
| **Syntax:** ``pxe boot [pxefile_addr_r]`` | |
| Interprets a pxe file stored in memory. | |
| ``pxefile_addr_r`` is an optional argument giving the location | |
| of the pxe file. The file must be terminated with a NUL byte. | |
| There are some environment variables that may need to be set, | |
| depending on conditions, see the Environment section below. | |
| ``sysboot`` | |
| **Syntax:** ``sysboot [-p] <interface> <dev[:part]> <ext2|fat|any> [addr] [filename]`` | |
| Load and boot an ``extlinux.conf`` file from a local | |
| filesystem. Paths in the ``extlinux.conf`` file (kernel, | |
| initrd, FDT and overlays) will be interpreted within that | |
| filesystem. | |
| Example: | |
| ``sysboot mmc 0.0:2 any ${pxefile_addr_r} /boot/extlinux.conf`` | |
| Environment | |
| ----------- | |
| ``pxefile_addr_r`` | |
| Should be set to a location in RAM large enough to hold pxe | |
| files while they're being processed. Up to 16 config files may | |
| be held in memory at once. The exact number and size of the | |
| files varies with how the system is being used. A typical | |
| config file is a few hundred bytes long. Required for ``pxe | |
| get``, for ``pxe boot`` if the optional argument | |
| ``pxefile_addr_r`` is not supplied. | |
| ``bootfile`` | |
| Typically set in the DHCP response handler, required for ``pxe | |
| get``. For ``pxe boot``, this path is used to generate the | |
| base directory that all other paths to files retrieved by | |
| ``pxe boot`` will use. If no bootfile is specified, paths used | |
| in pxe files will be used as is. | |
| ``serverip`` | |
| Typically set in the DHCP response handler, this is the IP | |
| address of the tftp server from which other files will be | |
| retrieved. Required for ``pxe get``. | |
| ``kernel_addr_r``, ``initrd_addr_r`` | |
| Locations in RAM to store the kernel (or FIT image) and | |
| initrd. These locations will be passed to the ``bootm`` | |
| command to boot the kernel. These environment variables are | |
| required to be set. | |
| ``fdt_addr_r`` | |
| Location in RAM to store the retrieved fdt blob. Retrieval is | |
| possible if ``fdt`` label is defined in pxe file and | |
| ``fdt_addr_r`` is set. If retrieval is possible, | |
| ``fdt_addr_r`` will be passed to ``bootm`` command to boot the | |
| kernel. | |
| ``fdt_addr`` | |
| Location of a fdt blob. ``fdt_addr`` will be passed to | |
| ``bootm`` command if it is set and ``fdt_addr_r`` is not | |
| passed to bootm command. | |
| ``fdtoverlay_addr_r`` | |
| Location in RAM to temporarily store fdt overlay(s) before | |
| applying them to the fdt blob stored at | |
| ``fdt_addr_r``. Required to use the ``fdtoverlays`` command in | |
| the PXE file. | |
| ``extension_overlay_addr`` | |
| Location in RAM to temporarily store extension fdt overlay(s) | |
| before applying them to the fdt blob stored at ``fdt_addr_r``. | |
| ``pxe_label_override`` | |
| Override label to be used, if exists, instead of the default | |
| label. This will allow consumers to choose a pxe label at | |
| runtime instead of having to prompt the user. If | |
| ``pxe_label_override`` is set but does not exist in the pxe | |
| menu, pxe would fallback to the default label if given, and no | |
| failure is returned but rather a warning message. | |
| ``ethaddr`` | |
| This is the standard MAC address for the ethernet adapter in | |
| use. ``pxe get`` uses it to look for a configuration file | |
| specific to a system's MAC address. | |
| ``pxeuuid`` | |
| This is a UUID in standard form using lower case hexadecimal | |
| digits, for example, | |
| 550e8400-e29b-41d4-a716-446655440000. ``pxe get`` uses it to | |
| look for a configuration file based on the system's UUID. | |
| pxe file format | |
| --------------- | |
| The pxe file format is nearly a subset of the PXELINUX file format; | |
| see http://syslinux.zytor.com/wiki/index.php/PXELINUX. It's composed | |
| of one line commands - global commands, and commands specific to | |
| labels. Lines beginning with # are treated as comments. White space | |
| between and at the beginning of lines is ignored. | |
| The size of pxe files and the number of labels is only limited by the amount | |
| of RAM available to U-Boot. Memory for labels is dynamically allocated as | |
| they're parsed, and memory for pxe files is statically allocated, and its | |
| location is given by the pxefile_addr_r environment variable. The pxe code is | |
| not aware of the size of the pxefile memory and will outgrow it if pxe files | |
| are too large. | |
| Supported global commands | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Unrecognized commands are ignored. | |
| ``default <label>`` | |
| The label named here is treated as the default and is the | |
| first label 'pxe boot' attempts to boot. | |
| ``fallback <label>`` | |
| The label named here is treated as a fallback option that may | |
| be attempted should it be detected that booting of the default | |
| has failed to complete, for example via U-Boot's boot count | |
| limit functionality. | |
| ``menu title <string>`` | |
| Sets a title for the menu of labels being displayed. | |
| ``menu include <path>`` | |
| Use tftp to retrieve the pxe file at ``<path>``, which is then | |
| immediately parsed as if the start of its contents were the | |
| next line in the current file. nesting of include up to 16 | |
| files deep is supported. | |
| ``prompt <flag>`` | |
| If 1, always prompt the user to enter a label to boot from. If | |
| 0, only prompt the user if timeout expires. | |
| ``timeout <num>`` | |
| Wait for user input for <num>/10 seconds before auto-booting a | |
| node. | |
| ``label <name>`` | |
| Begin a label definition. Labels continue until a command not | |
| recognized as a label command is seen, or EOF is reached. | |
| Supported label commands | |
| ^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Labels end when a command not recognized as a label command is reached, or EOF. | |
| ``menu default`` | |
| set this label as the default label to boot; this is the same | |
| behavior as the global default command but specified in a | |
| different way | |
| ``kernel <path>`` | |
| If this label is chosen, use tftp to retrieve the kernel (or | |
| FIT image) at ``<path>``. it will be stored at the address | |
| indicated in the ``kernel_addr_r`` environment variable, and | |
| that address will be passed to ``bootm`` to boot this | |
| kernel. For FIT image, the configuration specification can be | |
| appended to the file name, with the format: | |
| ``<path>#<conf>[#<extra-conf[#...]]`` | |
| It will be passed to bootm with that address (see: | |
| doc/uImage.FIT/command_syntax_extensions.txt). It is useful | |
| for overlay selection in pxe file (see | |
| :doc:`./fit/overlay-fdt-boot`). | |
| ``fdtoverlays <path> [...]`` | |
| If this label is chosen, use tftp to retrieve the DT | |
| overlay(s) at ``<path>``. It will be temporarily stored at the | |
| address indicated in the ``fdtoverlay_addr_r`` environment | |
| variable, and then applied in the load order to the fdt blob | |
| stored at the address indicated in the ``fdt_addr_r`` | |
| environment variable. | |
| ``devicetree-overlay <path> [...]`` | |
| if this label is chosen, use tftp to retrieve the DT | |
| overlay(s) at ``<path>``. It will be temporarily stored at the | |
| address indicated in the ``fdtoverlay_addr_r`` environment | |
| variable, and then applied in the load order to the fdt blob | |
| stored at the address indicated in the ``fdt_addr_r`` | |
| environment variable. Alias for fdtoverlays. | |
| ``kaslrseed`` | |
| set this label to request random number from hwrng as kaslr seed. | |
| ``append <string>`` | |
| Use ``<string>`` as the kernel command line when booting this | |
| label. Environment variable references like ``${var}`` are | |
| substituted before boot. | |
| ``initrd <path>`` | |
| If this label is chosen, use tftp to retrieve the initrd at | |
| ``<path>``. it will be stored at the address indicated in the | |
| ``initrd_addr_r`` environment variable, and that address will | |
| be passed to ``bootm``. For FIT image, the initrd can be | |
| provided with the same value than kernel, including | |
| configuration: | |
| ``<path>#<conf>[#<extra-conf[#...]]`` | |
| In this case, ``kernel_addr_r`` is passed to ``bootm``. | |
| ``fdt <path>`` | |
| If this label is chosen, use tftp to retrieve the fdt blob at | |
| ``<path>``. It will be stored at the address indicated in the | |
| ``fdt_addr_r`` environment variable, and that address will be | |
| passed to ``bootm``. For FIT image, the device tree can be | |
| provided with the same value than kernel, including | |
| configuration: | |
| ``<path>#<conf>[#<extra-conf[#...]]`` | |
| In this case, ``kernel_addr_r`` is passed to ``bootm``. | |
| ``devicetree <path>`` | |
| If this label is chosen, use tftp to retrieve the fdt blob at | |
| ``<path>``. it will be stored at the address indicated in the | |
| ``fdt_addr_r`` environment variable, and that address will be | |
| passed to ``bootm``. Alias for fdt. | |
| ``fdtdir <path>`` | |
| If this label is chosen, use tftp to retrieve a fdt blob | |
| relative to ``<path>``. If the ``fdtfile`` environment | |
| variable is set, ``<path>/<fdtfile>`` is retrieved. Otherwise, | |
| the filename is generated from the ``soc`` and ``board`` | |
| environment variables, i.e. ``<path>/<soc>-<board>.dtb`` is | |
| retrieved. If the ``fdt`` command is specified, ``fdtdir`` is | |
| ignored. | |
| ``localboot <flag>`` | |
| Run the command defined by ``localcmd`` in the | |
| environment. ``<flag>`` is ignored and is only here to match | |
| the syntax of PXELINUX config files. | |
| Example | |
| ------- | |
| Here's a couple of example files to show how this works. | |
| .. code-block:: | |
| :caption: /tftpboot/pxelinux.cfg/menus/base.menu | |
| menu title Linux selections | |
| # This is the default label | |
| label install | |
| menu label Default Install Image | |
| kernel kernels/install.bin | |
| append console=ttyAMA0,38400 debug earlyprintk | |
| initrd initrds/uzInitrdDebInstall | |
| # Just another label | |
| label linux-2.6.38 | |
| kernel kernels/linux-2.6.38.bin | |
| append root=/dev/sdb1 | |
| # The locally installed kernel | |
| label local | |
| menu label Locally installed kernel | |
| append root=/dev/sdb1 | |
| localboot 1 | |
| .. code-block:: | |
| :caption: /tftpboot/pxelinux.cfg/default | |
| menu include pxelinux.cfg/menus/base.menu | |
| timeout 500 | |
| default linux-2.6.38 | |
| When a pxe client retrieves and boots the default pxe file, ``pxe | |
| boot`` will wait for user input for 5 seconds before booting the | |
| ``linux-2.6.38`` label, which will cause | |
| ``/tftpboot/kernels/linux-2.6.38.bin`` to be downloaded, and boot with | |
| the command line ``root=/dev/sdb1`` | |
| Differences with PXELINUX | |
| ------------------------- | |
| The biggest difference between U-Boot's pxe and PXELINUX is that since | |
| U-Boot's pxe support is written entirely in C, it can run on any platform | |
| with network support in U-Boot. Here are some other differences between | |
| PXELINUX and U-Boot's pxe support. | |
| - U-Boot's pxe does not support the PXELINUX DHCP option codes specified | |
| in RFC 5071, but could be extended to do so. | |
| - when U-Boot's pxe fails to boot, it will return control to U-Boot, | |
| allowing another command to run, other U-Boot command, instead of resetting | |
| the machine like PXELINUX. | |
| - U-Boot's pxe doesn't rely on or provide an UNDI/PXE stack in memory, it | |
| only uses U-Boot. | |
| - U-Boot's pxe doesn't provide the full menu implementation that PXELINUX | |
| does, only a simple text based menu using the commands described in | |
| this README. With PXELINUX, it's possible to have a graphical boot | |
| menu, submenus, passwords, etc. U-Boot's pxe could be extended to support | |
| a more robust menuing system like that of PXELINUX's. | |
| - U-Boot's pxe expects U-Boot uimg's as kernels. Anything that would work | |
| with the 'bootm' command in U-Boot could work with the 'pxe boot' command. | |
| - U-Boot's pxe only recognizes a single file on the initrd command line. It | |
| could be extended to support multiple. | |
| - in U-Boot's pxe, the localboot command doesn't necessarily cause a local | |
| disk boot - it will do whatever is defined in the 'localcmd' env | |
| variable. And since it doesn't support a full UNDI/PXE stack, the | |
| type field is ignored. | |
| - the interactive prompt in U-Boot's pxe only allows you to choose a label | |
| from the menu. If you want to boot something not listed, you can ctrl+c | |
| out of 'pxe boot' and use existing U-Boot commands to accomplish it. |