Tom Rini | 83d290c | 2018-05-06 17:58:06 -0400 | [diff] [blame] | 1 | SPDX-License-Identifier: GPL-2.0+ |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 2 | /* |
| 3 | * Copyright 2010-2011 Calxeda, Inc. |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 4 | */ |
| 5 | |
| 6 | The 'pxe' commands provide a near subset of the functionality provided by |
Bin Meng | a187559 | 2016-02-05 19:30:11 -0800 | [diff] [blame] | 7 | the PXELINUX boot loader. This allows U-Boot based systems to be controlled |
| 8 | remotely using the same PXE based techniques that many non U-Boot based servers |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 9 | use. |
| 10 | |
| 11 | Commands |
| 12 | ======== |
| 13 | |
| 14 | pxe get |
| 15 | ------- |
| 16 | syntax: pxe get |
| 17 | |
| 18 | follows PXELINUX's rules for retrieving configuration files from a tftp |
| 19 | server, and supports a subset of PXELINUX's config file syntax. |
| 20 | |
| 21 | Environment |
| 22 | ----------- |
| 23 | 'pxe get' requires two environment variables to be set: |
| 24 | |
| 25 | pxefile_addr_r - should be set to a location in RAM large enough to hold |
| 26 | pxe files while they're being processed. Up to 16 config files may be |
| 27 | held in memory at once. The exact number and size of the files varies with |
| 28 | how the system is being used. A typical config file is a few hundred bytes |
| 29 | long. |
| 30 | |
| 31 | bootfile,serverip - these two are typically set in the DHCP response |
| 32 | handler, and correspond to fields in the DHCP response. |
| 33 | |
| 34 | 'pxe get' optionally supports these two environment variables being set: |
| 35 | |
| 36 | ethaddr - this is the standard MAC address for the ethernet adapter in use. |
| 37 | 'pxe get' uses it to look for a configuration file specific to a system's |
| 38 | MAC address. |
| 39 | |
| 40 | pxeuuid - this is a UUID in standard form using lower case hexadecimal |
| 41 | digits, for example, 550e8400-e29b-41d4-a716-446655440000. 'pxe get' uses |
| 42 | it to look for a configuration file based on the system's UUID. |
| 43 | |
| 44 | File Paths |
| 45 | ---------- |
| 46 | 'pxe get' repeatedly tries to download config files until it either |
| 47 | successfully downloads one or runs out of paths to try. The order and |
| 48 | contents of paths it tries mirrors exactly that of PXELINUX - you can |
| 49 | read in more detail about it at: |
| 50 | |
| 51 | http://syslinux.zytor.com/wiki/index.php/Doc/pxelinux |
| 52 | |
| 53 | pxe boot |
| 54 | -------- |
| 55 | syntax: pxe boot [pxefile_addr_r] |
| 56 | |
| 57 | Interprets a pxe file stored in memory. |
| 58 | |
| 59 | pxefile_addr_r is an optional argument giving the location of the pxe file. |
| 60 | The file must be terminated with a NUL byte. |
| 61 | |
| 62 | Environment |
| 63 | ----------- |
| 64 | There are some environment variables that may need to be set, depending |
| 65 | on conditions. |
| 66 | |
| 67 | pxefile_addr_r - if the optional argument pxefile_addr_r is not supplied, |
| 68 | an environment variable named pxefile_addr_r must be supplied. This is |
| 69 | typically the same value as is used for the 'pxe get' command. |
| 70 | |
| 71 | bootfile - typically set in the DHCP response handler based on the |
| 72 | same field in the DHCP respone, this path is used to generate the base |
| 73 | directory that all other paths to files retrieved by 'pxe boot' will use. |
| 74 | If no bootfile is specified, paths used in pxe files will be used as is. |
| 75 | |
| 76 | serverip - typically set in the DHCP response handler, this is the IP |
| 77 | address of the tftp server from which other files will be retrieved. |
| 78 | |
| 79 | kernel_addr_r, initrd_addr_r - locations in RAM at which 'pxe boot' will |
Wenbin Song | fce7850 | 2016-09-01 16:28:22 +0800 | [diff] [blame] | 80 | store the kernel(or FIT image) and initrd it retrieves from tftp. These |
| 81 | locations will be passed to the bootm command to boot the kernel. These |
| 82 | environment variables are required to be set. |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 83 | |
Chander Kashyap | a655938 | 2012-09-06 19:36:31 +0000 | [diff] [blame] | 84 | fdt_addr_r - location in RAM at which 'pxe boot' will store the fdt blob it |
| 85 | retrieves from tftp. The retrieval is possible if 'fdt' label is defined in |
| 86 | pxe file and 'fdt_addr_r' is set. If retrieval is possible, 'fdt_addr_r' |
| 87 | will be passed to bootm command to boot the kernel. |
| 88 | |
| 89 | fdt_addr - the location of a fdt blob. 'fdt_addr' will be passed to bootm |
| 90 | command if it is set and 'fdt_addr_r' is not passed to bootm command. |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 91 | |
| 92 | pxe file format |
| 93 | =============== |
| 94 | The pxe file format is nearly a subset of the PXELINUX file format; see |
| 95 | http://syslinux.zytor.com/wiki/index.php/PXELINUX. It's composed of one line |
| 96 | commands - global commands, and commands specific to labels. Lines begining |
| 97 | with # are treated as comments. White space between and at the beginning of |
| 98 | lines is ignored. |
| 99 | |
| 100 | The size of pxe files and the number of labels is only limited by the amount |
Bin Meng | a187559 | 2016-02-05 19:30:11 -0800 | [diff] [blame] | 101 | of RAM available to U-Boot. Memory for labels is dynamically allocated as |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 102 | they're parsed, and memory for pxe files is statically allocated, and its |
| 103 | location is given by the pxefile_addr_r environment variable. The pxe code is |
| 104 | not aware of the size of the pxefile memory and will outgrow it if pxe files |
| 105 | are too large. |
| 106 | |
| 107 | Supported global commands |
| 108 | ------------------------- |
| 109 | Unrecognized commands are ignored. |
| 110 | |
Wolfgang Denk | 6b62b9a | 2011-12-19 12:03:40 +0100 | [diff] [blame] | 111 | default <label> - the label named here is treated as the default and is |
| 112 | the first label 'pxe boot' attempts to boot. |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 113 | |
| 114 | menu title <string> - sets a title for the menu of labels being displayed. |
| 115 | |
| 116 | menu include <path> - use tftp to retrieve the pxe file at <path>, which |
Wolfgang Denk | 6b62b9a | 2011-12-19 12:03:40 +0100 | [diff] [blame] | 117 | is then immediately parsed as if the start of its |
| 118 | contents were the next line in the current file. nesting |
| 119 | of include up to 16 files deep is supported. |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 120 | |
Wolfgang Denk | 6b62b9a | 2011-12-19 12:03:40 +0100 | [diff] [blame] | 121 | prompt <flag> - if 1, always prompt the user to enter a label to boot |
| 122 | from. if 0, only prompt the user if timeout expires. |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 123 | |
| 124 | timeout <num> - wait for user input for <num>/10 seconds before |
Wolfgang Denk | 6b62b9a | 2011-12-19 12:03:40 +0100 | [diff] [blame] | 125 | auto-booting a node. |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 126 | |
Wolfgang Denk | 6b62b9a | 2011-12-19 12:03:40 +0100 | [diff] [blame] | 127 | label <name> - begin a label definition. labels continue until |
| 128 | a command not recognized as a label command is seen, |
| 129 | or EOF is reached. |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 130 | |
| 131 | Supported label commands |
| 132 | ------------------------ |
| 133 | labels end when a command not recognized as a label command is reached, or EOF. |
| 134 | |
Wolfgang Denk | 6b62b9a | 2011-12-19 12:03:40 +0100 | [diff] [blame] | 135 | menu default - set this label as the default label to boot; this is |
| 136 | the same behavior as the global default command but |
| 137 | specified in a different way |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 138 | |
Wolfgang Denk | 6b62b9a | 2011-12-19 12:03:40 +0100 | [diff] [blame] | 139 | kernel <path> - if this label is chosen, use tftp to retrieve the kernel |
Wenbin Song | fce7850 | 2016-09-01 16:28:22 +0800 | [diff] [blame] | 140 | (or FIT image) at <path>. it will be stored at the address |
| 141 | indicated in the kernel_addr_r environment variable, and |
| 142 | that address will be passed to bootm to boot this kernel. |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 143 | |
Wolfgang Denk | 6b62b9a | 2011-12-19 12:03:40 +0100 | [diff] [blame] | 144 | append <string> - use <string> as the kernel command line when booting this |
| 145 | label. |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 146 | |
Wolfgang Denk | 6b62b9a | 2011-12-19 12:03:40 +0100 | [diff] [blame] | 147 | initrd <path> - if this label is chosen, use tftp to retrieve the initrd |
| 148 | at <path>. it will be stored at the address indicated in |
| 149 | the initrd_addr_r environment variable, and that address |
| 150 | will be passed to bootm. |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 151 | |
Chander Kashyap | a655938 | 2012-09-06 19:36:31 +0000 | [diff] [blame] | 152 | fdt <path> - if this label is chosen, use tftp to retrieve the fdt blob |
| 153 | at <path>. it will be stored at the address indicated in |
| 154 | the fdt_addr_r environment variable, and that address will |
| 155 | be passed to bootm. |
| 156 | |
Stefan Brüns | 6015f8f | 2015-08-30 19:10:58 +0200 | [diff] [blame] | 157 | fdtdir <path> - if this label is chosen, use tftp to retrieve a fdt blob |
| 158 | relative to <path>. If the fdtfile environment variable |
| 159 | is set, <path>/<fdtfile> is retrieved. Otherwise, the |
| 160 | filename is generated from the soc and board environment |
| 161 | variables, i.e. <path>/<soc>-<board>.dtb is retrieved. |
| 162 | If the fdt command is specified, fdtdir is ignored. |
| 163 | |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 164 | localboot <flag> - Run the command defined by "localcmd" in the environment. |
Wolfgang Denk | 6b62b9a | 2011-12-19 12:03:40 +0100 | [diff] [blame] | 165 | <flag> is ignored and is only here to match the syntax of |
| 166 | PXELINUX config files. |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 167 | |
| 168 | Example |
| 169 | ------- |
| 170 | Here's a couple of example files to show how this works. |
| 171 | |
Stefan Brüns | 695c132 | 2015-08-30 19:10:59 +0200 | [diff] [blame] | 172 | ------------/tftpboot/pxelinux.cfg/menus/base.menu----------- |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 173 | menu title Linux selections |
| 174 | |
| 175 | # This is the default label |
| 176 | label install |
| 177 | menu label Default Install Image |
| 178 | kernel kernels/install.bin |
| 179 | append console=ttyAMA0,38400 debug earlyprintk |
| 180 | initrd initrds/uzInitrdDebInstall |
| 181 | |
| 182 | # Just another label |
| 183 | label linux-2.6.38 |
| 184 | kernel kernels/linux-2.6.38.bin |
| 185 | append root=/dev/sdb1 |
| 186 | |
| 187 | # The locally installed kernel |
| 188 | label local |
| 189 | menu label Locally installed kernel |
| 190 | append root=/dev/sdb1 |
| 191 | localboot 1 |
| 192 | ------------------------------------------------------------- |
| 193 | |
| 194 | ------------/tftpboot/pxelinux.cfg/default------------------- |
| 195 | menu include pxelinux.cfg/menus/base.menu |
| 196 | timeout 500 |
| 197 | |
| 198 | default linux-2.6.38 |
| 199 | ------------------------------------------------------------- |
| 200 | |
| 201 | When a pxe client retrieves and boots the default pxe file, |
| 202 | 'pxe boot' will wait for user input for 5 seconds before booting |
| 203 | the linux-2.6.38 label, which will cause /tftpboot/kernels/linux-2.6.38.bin |
| 204 | to be downloaded, and boot with the command line "root=/dev/sdb1" |
| 205 | |
| 206 | Differences with PXELINUX |
| 207 | ========================= |
Bin Meng | a187559 | 2016-02-05 19:30:11 -0800 | [diff] [blame] | 208 | The biggest difference between U-Boot's pxe and PXELINUX is that since |
| 209 | U-Boot's pxe support is written entirely in C, it can run on any platform |
| 210 | with network support in U-Boot. Here are some other differences between |
| 211 | PXELINUX and U-Boot's pxe support. |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 212 | |
Bin Meng | a187559 | 2016-02-05 19:30:11 -0800 | [diff] [blame] | 213 | - U-Boot's pxe does not support the PXELINUX DHCP option codes specified |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 214 | in RFC 5071, but could be extended to do so. |
| 215 | |
Bin Meng | a187559 | 2016-02-05 19:30:11 -0800 | [diff] [blame] | 216 | - when U-Boot's pxe fails to boot, it will return control to U-Boot, |
| 217 | allowing another command to run, other U-Boot command, instead of resetting |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 218 | the machine like PXELINUX. |
| 219 | |
Bin Meng | a187559 | 2016-02-05 19:30:11 -0800 | [diff] [blame] | 220 | - U-Boot's pxe doesn't rely on or provide an UNDI/PXE stack in memory, it |
| 221 | only uses U-Boot. |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 222 | |
Bin Meng | a187559 | 2016-02-05 19:30:11 -0800 | [diff] [blame] | 223 | - U-Boot's pxe doesn't provide the full menu implementation that PXELINUX |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 224 | does, only a simple text based menu using the commands described in |
Wolfgang Denk | 6b62b9a | 2011-12-19 12:03:40 +0100 | [diff] [blame] | 225 | this README. With PXELINUX, it's possible to have a graphical boot |
Bin Meng | a187559 | 2016-02-05 19:30:11 -0800 | [diff] [blame] | 226 | menu, submenus, passwords, etc. U-Boot's pxe could be extended to support |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 227 | a more robust menuing system like that of PXELINUX's. |
| 228 | |
Bin Meng | a187559 | 2016-02-05 19:30:11 -0800 | [diff] [blame] | 229 | - U-Boot's pxe expects U-Boot uimg's as kernels. Anything that would work |
| 230 | with the 'bootm' command in U-Boot could work with the 'pxe boot' command. |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 231 | |
Bin Meng | a187559 | 2016-02-05 19:30:11 -0800 | [diff] [blame] | 232 | - U-Boot's pxe only recognizes a single file on the initrd command line. It |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 233 | could be extended to support multiple. |
| 234 | |
Bin Meng | a187559 | 2016-02-05 19:30:11 -0800 | [diff] [blame] | 235 | - in U-Boot's pxe, the localboot command doesn't necessarily cause a local |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 236 | disk boot - it will do whatever is defined in the 'localcmd' env |
| 237 | variable. And since it doesn't support a full UNDI/PXE stack, the |
| 238 | type field is ignored. |
| 239 | |
Bin Meng | a187559 | 2016-02-05 19:30:11 -0800 | [diff] [blame] | 240 | - the interactive prompt in U-Boot's pxe only allows you to choose a label |
Jason Hobbs | 06283a6 | 2011-08-31 10:37:30 -0500 | [diff] [blame] | 241 | from the menu. If you want to boot something not listed, you can ctrl+c |
Bin Meng | a187559 | 2016-02-05 19:30:11 -0800 | [diff] [blame] | 242 | out of 'pxe boot' and use existing U-Boot commands to accomplish it. |