Preparing Files for TFTP Net Booting

If your machine is connected to a local area network, you may be able to boot it over the network from another machine, using TFTP. If you intend to boot the installation system from another machine, the boot files will need to be placed in specific locations on that machine, and the machine configured to support booting of your specific machine.

You need to setup a TFTP server, and for many machines a DHCP server, or RARP server, or BOOTP server.

The Reverse Address Resolution Protocol (RARP) is one way to tell your client what IP address to use for itself. Another way is to use the BOOTP protocol. BOOTP is an IP protocol that informs a computer of its IP address and where on the network to obtain a boot image. The DHCP (Dynamic Host Configuration Protocol) is a more flexible, backwards-compatible extension of BOOTP. Some systems can only be configured via DHCP.

The Trivial File Transfer Protocol (TFTP) is used to serve the boot image to the client. Theoretically, any server, on any platform, which implements these protocols, may be used. In the examples in this section, we shall provide commands for SunOS 4.x, SunOS 5.x (a.k.a. Solaris), and GNU/Linux.

Setting up RARP server

To set up RARP, you need to know the Ethernet address (a.k.a. the MAC address) of the client computers to be installed. If you don't know this information, you can pick it off the initial OpenPROM boot messages, use the OpenBoot .enet-addr command, or boot into Rescue mode (e.g., from the rescue floppy) and use the command /sbin/ifconfig eth0.

On a RARP server system using a Linux 2.4 or 2.6 kernel, or Solaris/SunOS, you use the rarpd program. You need to ensure that the Ethernet hardware address for the client is listed in the ethers database (either in the /etc/ethers file, or via NIS/NIS+) and in the hosts database. Then you need to start the RARP daemon. Issue the command (as root): /usr/sbin/rarpd -a on most Linux systems and SunOS 5 (Solaris 2), /usr/sbin/in.rarpd -a on some other Linux systems, or /usr/etc/rarpd -a in SunOS 4 (Solaris 1).

Setting up a BOOTP server

There are two BOOTP servers available for GNU/Linux. The first is CMU bootpd. The other is actually a DHCP server: ISC dhcpd. In Ubuntu these are contained in the bootp and dhcp3-server packages respectively.

To use CMU bootpd, you must first uncomment (or add) the relevant line in /etc/inetd.conf. On Debian GNU/Linux or Ubuntu, you can run update-inetd --enable bootps, then /etc/init.d/inetd reload to do so. Just in case your BOOTP server does not run Debian or Ubuntu, the line in question should look like:

bootps  dgram  udp  wait  root  /usr/sbin/bootpd  bootpd -i -t 120

Now, you must create an /etc/bootptab file. This has the same sort of familiar and cryptic format as the good old BSD printcap, termcap, and disktab files. See the bootptab manual page for more information. For CMU bootpd, you will need to know the hardware (MAC) address of the client. Here is an example /etc/bootptab:

client:\
  hd=/tftpboot:\
  bf=tftpboot.img:\
  ip=192.168.1.90:\
  sm=255.255.255.0:\
  sa=192.168.1.1:\
  ha=0123456789AB:

You will need to change at least the ha option, which specifies the hardware address of the client. The bf option specifies the file a client should retrieve via TFTP; see the section called “Move TFTP Images Into Place” for more details.

By contrast, setting up BOOTP with ISC dhcpd is really easy, because it treats BOOTP clients as a moderately special case of DHCP clients. Some architectures require a complex configuration for booting clients via BOOTP. If yours is one of those, read the section the section called “Setting up a DHCP server”. In that case, you will probably be able to get away with simply adding the allow bootp directive to the configuration block for the subnet containing the client, and restart dhcpd with /etc/init.d/dhcpd3-server restart.

Setting up a DHCP server

One free software DHCP server is ISC dhcpd. For Ubuntu, the dhcp3-server package is recommended. Here is a sample configuration file for it (see /etc/dhcp3/dhcpd.conf):

option domain-name "example.com";
option domain-name-servers ns1.example.com;
option subnet-mask 255.255.255.0;
default-lease-time 600;
max-lease-time 7200;
server-name "servername";

subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.200 192.168.1.253;
  option routers 192.168.1.1;
}

host clientname {
  filename "/tftpboot/tftpboot.img";
  server-name "servername";
  next-server servername;
  hardware ethernet 01:23:45:67:89:AB;
  fixed-address 192.168.1.90;
}

In this example, there is one server servername which performs all of the work of DHCP server, TFTP server, and network gateway. You will almost certainly need to change the domain-name options, as well as the server name and client hardware address. The filename option should be the name of the file which will be retrieved via TFTP.

After you have edited the dhcpd configuration file, restart it with /etc/init.d/dhcpd3-server restart.

Enabling the TFTP Server

To get the TFTP server ready to go, you should first make sure that tftpd is enabled. This is usually enabled by having something like the following line in /etc/inetd.conf:

tftp dgram udp wait nobody /usr/sbin/tcpd in.tftpd /tftpboot

Ubuntu packages will in general set this up correctly by default when they are installed.

[Note]

Historically, TFTP servers used /tftpboot as directory to serve images from. However, Debian GNU/Linux packages may use other directories to comply with the Filesystem Hierarchy Standard. For example, tftpd-hpa by default uses /var/lib/tftpboot. You may have to adjust the configuration examples in this section accordingly.

Look in /etc/inetd.conf and remember the directory which is used as the argument of in.tftpd[2]; you'll need that below. If you've had to change /etc/inetd.conf, you'll have to notify the running inetd process that the file has changed. On an Ubuntu or Debian machine, run /etc/init.d/inetd reload; on other machines, find out the process ID for inetd, and run kill -HUP inetd-pid.

Move TFTP Images Into Place

Next, place the TFTP boot image you need, as found in the section called “Where to Find Installation Images”, in the tftpd boot image directory. You may have to make a link from that file to the file which tftpd will use for booting a particular client. Unfortunately, the file name is determined by the TFTP client, and there are no strong standards.

SPARC TFTP Booting

Some SPARC architectures add the subarchitecture names, such as SUN4M or SUN4C, to the filename. Thus, if your system's subarchitecture is a SUN4C, and its IP is 192.168.1.3, the filename would be C0A80103.SUN4C. However, there are also subarchitectures where the file the client looks for is just client-ip-in-hex. An easy way to determine the hexadecimal code for the IP address is to enter the following command in a shell (assuming the machine's intended IP is 10.0.0.4).

$ printf '%.2x%.2x%.2x%.2x\n' 10 0 0 4

To get to the correct filename, you will need to change all letters to uppercase and if necessary append the subarchitecture name.

If you've done all this correctly, giving the command boot net from the OpenPROM should load the image. If the image cannot be found, try checking the logs on your tftp server to see which image name is being requested.

You can also force some sparc systems to look for a specific file name by adding it to the end of the OpenPROM boot command, such as boot net my-sparc.image. This must still reside in the directory that the TFTP server looks in.



[2] The -l argument enables some versions of in.tftpd to log all requests to the system logs; this is useful for diagnosing boot errors.