summaryrefslogtreecommitdiff
path: root/pxelinux.doc
blob: 63b975de9ff24bb6fbc2e0122a5fc6b84dbd7528 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
                               PXELINUX

    A bootloader for Linux using the PXE network booting protocol

		Copyright (C) 1994-2001 H. Peter Anvin

This program is provided under the terms of the GNU General Public
License, version 2 or, at your option, any later version.  There is no
warranty, neither expressed nor implied, to the function of this
program.  Please see the included file COPYING for details.

----------------------------------------------------------------------

PXELINUX is a SYSLINUX derivative, for booting Linux off a network
server, using a network ROM conforming to the Intel PXE (Pre-Execution
Environment) specification.  PXELINUX is *not* a program that is
intended to be flashed or burned into a PROM on the network card; if
you want that, check out NILO (http://www.nilo.org/).  NILO can also
be used to create a PXE-compliant boot PROM for most network cards
which have drivers for Linux or FreeBSD.


    ++++ HOW TO CONFIGURE PXELINUX ++++

PXELINUX operates in many ways like SYSLINUX.  If you are not familiar
with SYSLINUX, read syslinux.doc first, since this documentation only
explains the differences.

On the TFTP server, create the directory "/tftpboot", and copy the
following files to it:

	pxelinux.bin		- from the SYSLINUX distribution

	any kernel or initrd images you want to boot

Finally, create the directory "/tftpboot/pxelinux.cfg".  The
configuration file (equivalent of syslinux.cfg -- see syslinux.doc for
the options here) will live in this directory.  Because more than one
system may be booted from the same server, the configuration file name
depends on the IP address of the booting machine.  PXELINUX will
search for its config file on the boot server in the following way:

  First, it will search for the config file using its own IP address
  in upper case hexadecimal, e.g. 192.0.2.91 -> C000025B.

  If that file is not found, it will remove one hex digit and try
  again.  Ultimately, it will try looking for a file named "default"
  (in lower case).

  As an example, for 192.0.2.91, it will try C000025B, C000025,
  C00002, C0000, C000, C00, C0, C, and default, in that order.

It should be noted that all filename references are relative to the
directory pxelinux.bin lives in (usually /tftpboot).  PXELINUX
generally requires that filenames (including any relative path) are 31
characters or shorter in length.

PXELINUX does not support MTFTP, and I have no immediate plans of
doing so.  It is of course possible to use MTFTP for the initial boot,
if you have such a setup.  MTFTP server setup is beyond the scope of
this document.


    ++++ SOME NOTES ON THE TFTP SERVER ++++

PXELINUX currently requires that the boot server has a TFTP server
which supports the "tsize" TFTP option (RFC 1784/RFC 2349).  The
"tftp-hpa" TFTP server, which support options, is available at:

	http://www.kernel.org/pub/software/network/tftp/
	ftp://www.kernel.org/pub/software/network/tftp/

... and on any kernel.org mirror (see http://www.kernel.org/mirrors/).

Another TFTP server which supports this is atftp by Jean-Pierre
Lefebvre:

	ftp://ftp.mamalinux.com/pub/atftp/

Unfortunately, the Intel LANDesk Service Agent II prior to version
0.99h (PXE PDK V2.4) seems to have a rather serious bug: it requests
the TFTP "blksize" option, but will be mortally confused if this
option is actually accepted by the server!  There are three possible
workarounds for this bug:

1. Use a TFTP server with doesn't support "blksize".

   Unfortunately, PXELINUX requires the "tsize" option to be
   supported, and it is very unusual for TFTP servers to implement one
   and not the other.  Both the tftp-hpa and atftp TFTP servers (see
   above) therefore can be configured to disable the blksize option.
   Use "-r blksize" for tftp-hpa, "--no-blksize" for atftp.

2. Use MTFTP for the initial bootstrap.  You need an MTFTP server with
   the appropriate DHCP setup to do this.

3. Use appropriate DHCP options that the client will attempt MTFTP
   before trying conventional TFTP.  It seems that the client will not
   request the "blksize" option if it has tried MTFTP and failed.
   These DHCP options are beyond the scope of this document.


    ++++ SETTING UP THE DHCP SERVER ++++

The PXE protocol uses a very complex set of extensions to DHCP or
BOOTP.  Some PXE implementations can be coaxed to operate with a
normal DHCP server; unfortunately so far no "magic bullet" which works
with all PXE implementations work.

The best one currently known, using ISC dhcp 2.0 dhcpd.conf syntax:

        allow booting;
        allow bootp;

        filename "/tftpboot/pxelinux.bin" ;
        option dhcp-class-identifier "PXEClient";
	option vendor-encapsulated-options 09:0f:80:00:0c:4e:65:74:77:6f:72:6b:20:62:6f:6f:74:0a:07:00:50:72:6f:6d:70:74:06:01:02:08:03:80:00:00:47:04:80:00:00:00:ff;
	next-server <TFTP-server>;
	# server-identifier <TFTP-server>;	# Illegal! See below

        option domain-name "<domain name>";
        option subnet-mask <subnet mask>;
        option broadcast-address <broadcast address>;
        option domain-name-servers <dns servers>;
        option routers <default router>;

	# Skip everything below if you want to use dynamic IP
	# address assignment
        host <hostname> {
                hardware ethernet <ethernet address>;
                fixed-address <hostname>;
        }

However, some PXE implementations will only work this way if the
"dhcp-class-identifier" and "vendor-encapsulated-options" are *not*
present...

Note that if your particular TFTP daemon runs under chroot (tftp-hpa
will do this if you specify the -s (secure) option; this is
recommended), you most likely should not include the /tftpboot prefix.

If the DHCP and TFTP servers are not on the same machine, you are
supposed to set up a DHCP server on port 4011 on the TFTP server; this
is the "PXE boot server", which uses the DHCP protocol.  If this is
not possible, you can try adding the directive "server-identifier
<TFTP-server>;"  Unfortunately this is a violation of DHCP
protocol, but some PXE implementations do not accept the next-server
directive without it or the "boot server".

I have successfully booted an Intel N440BX ("Nightshade") motherboard
with onboard Ethernet and "Intel LANDesk(R) Service Agent II version
0.99c" (derived from the Intel PXE PDK V2.0) and the Intel PRO/100+
Management Adapter "Boot agent 2.6 (build 071)" (derived from the
Intel PXE PDK V3.0 bld 071) using the configuration above and ISC
dhcpd 2.0.


    ++++ SOME NOTES ++++

If the boot fails, PXELINUX (unlike SYSLINUX) will not wait forever;
rather, if it has not received any input for approximately five
minutes after displaying an error message, it will reset the machine.
This allows an unattended machine to recover in case it had bad enough
luck of trying to boot at the same time the TFTP server goes down.


    ++++ PXELINUX IS STILL BETA ++++

PXELINUX is still very much beta; however, I'd be interested in
hearing about any experiences you might have with it, good or bad.  If
you have any comments, please use the SYSLINUX mailing list mentioned
at the end of syslinux.doc.  Thanks!

Currently known problems:

+ Requires a TFTP server which supports the "tsize" option.
+ The error recovery routine doesn't work quite right.  For right now,
  it just does a hard reset - seems good enough.
+ There may be funnies with memory management.  The PXE spec has no
  decent way of telling it to free up all memory and unchain any
  interrupts; it allows the base stack to be unloaded, but not the
  UNDI driver.
+ There seems to be a problem with sending ACK "storms"; a number of
  ACK packets fired off without the proper delay in between.  I
  suspect this is a PXE firmware problem, rather than a PXELINUX
  problem.
+ We should probably call the UDP receive function in the keyboard
  entry loop, so that we answer ARP requests.
+ Boot sectors don't work yet... they probably need auxilliary information
  (such as device) to work at all.
* No way to chain-load onto a hard disk.