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