]>
Commit | Line | Data |
---|---|---|
83d290c5 | 1 | SPDX-License-Identifier: GPL-2.0+ |
06283a64 JH |
2 | /* |
3 | * Copyright 2010-2011 Calxeda, Inc. | |
06283a64 JH |
4 | */ |
5 | ||
6 | The 'pxe' commands provide a near subset of the functionality provided by | |
a187559e BM |
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 | |
06283a64 JH |
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 | |
fce78503 WS |
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. | |
06283a64 | 83 | |
a655938a CK |
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. | |
06283a64 | 91 | |
69076dff NA |
92 | fdtoverlay_addr_r - location in RAM at which 'pxe boot' will temporarily store |
93 | fdt overlay(s) before applying them to the fdt blob stored at 'fdt_addr_r'. | |
94 | ||
c2969792 AOA |
95 | pxe_label_override - override label to be used, if exists, instead of the |
96 | default label. This will allow consumers to choose a pxe label at | |
97 | runtime instead of having to prompt the user. If "pxe_label_override" is set | |
98 | but does not exist in the pxe menu, pxe would fallback to the default label if | |
99 | given, and no failure is returned but rather a warning message. | |
100 | ||
06283a64 JH |
101 | pxe file format |
102 | =============== | |
103 | The pxe file format is nearly a subset of the PXELINUX file format; see | |
104 | http://syslinux.zytor.com/wiki/index.php/PXELINUX. It's composed of one line | |
105 | commands - global commands, and commands specific to labels. Lines begining | |
106 | with # are treated as comments. White space between and at the beginning of | |
107 | lines is ignored. | |
108 | ||
109 | The size of pxe files and the number of labels is only limited by the amount | |
a187559e | 110 | of RAM available to U-Boot. Memory for labels is dynamically allocated as |
06283a64 JH |
111 | they're parsed, and memory for pxe files is statically allocated, and its |
112 | location is given by the pxefile_addr_r environment variable. The pxe code is | |
113 | not aware of the size of the pxefile memory and will outgrow it if pxe files | |
114 | are too large. | |
115 | ||
116 | Supported global commands | |
117 | ------------------------- | |
118 | Unrecognized commands are ignored. | |
119 | ||
6b62b9a3 WD |
120 | default <label> - the label named here is treated as the default and is |
121 | the first label 'pxe boot' attempts to boot. | |
06283a64 | 122 | |
d2faad3f MW |
123 | fallback <label> - the label named here is treated as a fallback option that |
124 | may be attempted should it be detected that booting of | |
125 | the default has failed to complete, for example via | |
126 | U-Boot's boot count limit functionality. | |
127 | ||
06283a64 JH |
128 | menu title <string> - sets a title for the menu of labels being displayed. |
129 | ||
130 | menu include <path> - use tftp to retrieve the pxe file at <path>, which | |
6b62b9a3 WD |
131 | is then immediately parsed as if the start of its |
132 | contents were the next line in the current file. nesting | |
133 | of include up to 16 files deep is supported. | |
06283a64 | 134 | |
6b62b9a3 WD |
135 | prompt <flag> - if 1, always prompt the user to enter a label to boot |
136 | from. if 0, only prompt the user if timeout expires. | |
06283a64 JH |
137 | |
138 | timeout <num> - wait for user input for <num>/10 seconds before | |
6b62b9a3 | 139 | auto-booting a node. |
06283a64 | 140 | |
6b62b9a3 WD |
141 | label <name> - begin a label definition. labels continue until |
142 | a command not recognized as a label command is seen, | |
143 | or EOF is reached. | |
06283a64 JH |
144 | |
145 | Supported label commands | |
146 | ------------------------ | |
147 | labels end when a command not recognized as a label command is reached, or EOF. | |
148 | ||
6b62b9a3 WD |
149 | menu default - set this label as the default label to boot; this is |
150 | the same behavior as the global default command but | |
151 | specified in a different way | |
06283a64 | 152 | |
6b62b9a3 | 153 | kernel <path> - if this label is chosen, use tftp to retrieve the kernel |
fce78503 WS |
154 | (or FIT image) at <path>. it will be stored at the address |
155 | indicated in the kernel_addr_r environment variable, and | |
156 | that address will be passed to bootm to boot this kernel. | |
2023000a PD |
157 | For FIT image, The configuration specification can be |
158 | appended to the file name, with the format: | |
159 | <path>#<conf>[#<extra-conf[#...]] | |
160 | It will passed to bootm with that address. | |
161 | (see: doc/uImage.FIT/command_syntax_extensions.txt) | |
162 | It useful for overlay selection in pxe file | |
163 | (see: doc/uImage.FIT/overlay-fdt-boot.txt) | |
06283a64 | 164 | |
69076dff NA |
165 | fdtoverlays <path> [...] - if this label is chosen, use tftp to retrieve the DT |
166 | overlay(s) at <path>. it will be temporarily stored at the | |
167 | address indicated in the fdtoverlay_addr_r environment variable, | |
168 | and then applied in the load order to the fdt blob stored at the | |
169 | address indicated in the fdt_addr_r environment variable. | |
170 | ||
35821a25 ET |
171 | devicetree-overlay <path> [...] - if this label is chosen, use tftp to retrieve the DT |
172 | overlay(s) at <path>. it will be temporarily stored at the | |
173 | address indicated in the fdtoverlay_addr_r environment variable, | |
174 | and then applied in the load order to the fdt blob stored at the | |
175 | address indicated in the fdt_addr_r environment variable. | |
176 | Alias for fdtoverlays. | |
177 | ||
02901469 ZN |
178 | kaslrseed - set this label to request random number from hwrng as kaslr seed. |
179 | ||
6b62b9a3 WD |
180 | append <string> - use <string> as the kernel command line when booting this |
181 | label. | |
06283a64 | 182 | |
6b62b9a3 WD |
183 | initrd <path> - if this label is chosen, use tftp to retrieve the initrd |
184 | at <path>. it will be stored at the address indicated in | |
185 | the initrd_addr_r environment variable, and that address | |
186 | will be passed to bootm. | |
a5dacef7 PD |
187 | For FIT image, the initrd can be provided with the same value than |
188 | kernel, including configuration: | |
189 | <path>#<conf>[#<extra-conf[#...]] | |
190 | In this case, kernel_addr_r is passed to bootm. | |
06283a64 | 191 | |
a655938a CK |
192 | fdt <path> - if this label is chosen, use tftp to retrieve the fdt blob |
193 | at <path>. it will be stored at the address indicated in | |
194 | the fdt_addr_r environment variable, and that address will | |
195 | be passed to bootm. | |
a5dacef7 PD |
196 | For FIT image, the device tree can be provided with the same value |
197 | than kernel, including configuration: | |
198 | <path>#<conf>[#<extra-conf[#...]] | |
199 | In this case, kernel_addr_r is passed to bootm. | |
a655938a | 200 | |
35821a25 ET |
201 | devicetree <path> - if this label is chosen, use tftp to retrieve the fdt blob |
202 | at <path>. it will be stored at the address indicated in | |
203 | the fdt_addr_r environment variable, and that address will | |
204 | be passed to bootm. Alias for fdt. | |
205 | ||
6015f8f1 SB |
206 | fdtdir <path> - if this label is chosen, use tftp to retrieve a fdt blob |
207 | relative to <path>. If the fdtfile environment variable | |
208 | is set, <path>/<fdtfile> is retrieved. Otherwise, the | |
209 | filename is generated from the soc and board environment | |
210 | variables, i.e. <path>/<soc>-<board>.dtb is retrieved. | |
211 | If the fdt command is specified, fdtdir is ignored. | |
212 | ||
06283a64 | 213 | localboot <flag> - Run the command defined by "localcmd" in the environment. |
6b62b9a3 WD |
214 | <flag> is ignored and is only here to match the syntax of |
215 | PXELINUX config files. | |
06283a64 JH |
216 | |
217 | Example | |
218 | ------- | |
219 | Here's a couple of example files to show how this works. | |
220 | ||
695c1329 | 221 | ------------/tftpboot/pxelinux.cfg/menus/base.menu----------- |
06283a64 JH |
222 | menu title Linux selections |
223 | ||
224 | # This is the default label | |
225 | label install | |
226 | menu label Default Install Image | |
227 | kernel kernels/install.bin | |
228 | append console=ttyAMA0,38400 debug earlyprintk | |
229 | initrd initrds/uzInitrdDebInstall | |
230 | ||
231 | # Just another label | |
232 | label linux-2.6.38 | |
233 | kernel kernels/linux-2.6.38.bin | |
234 | append root=/dev/sdb1 | |
235 | ||
236 | # The locally installed kernel | |
237 | label local | |
238 | menu label Locally installed kernel | |
239 | append root=/dev/sdb1 | |
240 | localboot 1 | |
241 | ------------------------------------------------------------- | |
242 | ||
243 | ------------/tftpboot/pxelinux.cfg/default------------------- | |
244 | menu include pxelinux.cfg/menus/base.menu | |
245 | timeout 500 | |
246 | ||
247 | default linux-2.6.38 | |
248 | ------------------------------------------------------------- | |
249 | ||
250 | When a pxe client retrieves and boots the default pxe file, | |
251 | 'pxe boot' will wait for user input for 5 seconds before booting | |
252 | the linux-2.6.38 label, which will cause /tftpboot/kernels/linux-2.6.38.bin | |
253 | to be downloaded, and boot with the command line "root=/dev/sdb1" | |
254 | ||
255 | Differences with PXELINUX | |
256 | ========================= | |
a187559e BM |
257 | The biggest difference between U-Boot's pxe and PXELINUX is that since |
258 | U-Boot's pxe support is written entirely in C, it can run on any platform | |
259 | with network support in U-Boot. Here are some other differences between | |
260 | PXELINUX and U-Boot's pxe support. | |
06283a64 | 261 | |
a187559e | 262 | - U-Boot's pxe does not support the PXELINUX DHCP option codes specified |
06283a64 JH |
263 | in RFC 5071, but could be extended to do so. |
264 | ||
a187559e BM |
265 | - when U-Boot's pxe fails to boot, it will return control to U-Boot, |
266 | allowing another command to run, other U-Boot command, instead of resetting | |
06283a64 JH |
267 | the machine like PXELINUX. |
268 | ||
a187559e BM |
269 | - U-Boot's pxe doesn't rely on or provide an UNDI/PXE stack in memory, it |
270 | only uses U-Boot. | |
06283a64 | 271 | |
a187559e | 272 | - U-Boot's pxe doesn't provide the full menu implementation that PXELINUX |
06283a64 | 273 | does, only a simple text based menu using the commands described in |
6b62b9a3 | 274 | this README. With PXELINUX, it's possible to have a graphical boot |
a187559e | 275 | menu, submenus, passwords, etc. U-Boot's pxe could be extended to support |
06283a64 JH |
276 | a more robust menuing system like that of PXELINUX's. |
277 | ||
a187559e BM |
278 | - U-Boot's pxe expects U-Boot uimg's as kernels. Anything that would work |
279 | with the 'bootm' command in U-Boot could work with the 'pxe boot' command. | |
06283a64 | 280 | |
a187559e | 281 | - U-Boot's pxe only recognizes a single file on the initrd command line. It |
06283a64 JH |
282 | could be extended to support multiple. |
283 | ||
a187559e | 284 | - in U-Boot's pxe, the localboot command doesn't necessarily cause a local |
06283a64 JH |
285 | disk boot - it will do whatever is defined in the 'localcmd' env |
286 | variable. And since it doesn't support a full UNDI/PXE stack, the | |
287 | type field is ignored. | |
288 | ||
a187559e | 289 | - the interactive prompt in U-Boot's pxe only allows you to choose a label |
06283a64 | 290 | from the menu. If you want to boot something not listed, you can ctrl+c |
a187559e | 291 | out of 'pxe boot' and use existing U-Boot commands to accomplish it. |