123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- /*
- * Copyright 2010-2011 Calxeda, Inc.
- *
- * SPDX-License-Identifier: GPL-2.0+
- */
- 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.
- 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.
- Environment
- -----------
- 'pxe get' requires two environment variables to be set:
- 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.
- bootfile,serverip - these two are typically set in the DHCP response
- handler, and correspond to fields in the DHCP response.
- 'pxe get' optionally supports these two environment variables being set:
- 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.
- 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.
- Environment
- -----------
- There are some environment variables that may need to be set, depending
- on conditions.
- pxefile_addr_r - if the optional argument pxefile_addr_r is not supplied,
- an environment variable named pxefile_addr_r must be supplied. This is
- typically the same value as is used for the 'pxe get' command.
- bootfile - typically set in the DHCP response handler based on the
- same field in the DHCP respone, 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.
- kernel_addr_r, initrd_addr_r - locations in RAM at which 'pxe boot' will
- store the kernel(or FIT image) and initrd it retrieves from tftp. 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 at which 'pxe boot' will store the fdt blob it
- retrieves from tftp. The 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 - the 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.
- 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 begining
- 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.
- 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.
- append <string> - use <string> as the kernel command line when booting this
- label.
- 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.
- 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.
- 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.
- ------------/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
- -------------------------------------------------------------
- ------------/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.
|