NetBoot

In embedded development work it is often either practical or needed to boot a device from a kernel or image placed on the local network. Some examples of common devices requiring netboot (bootp, pxe-boot), when installing OpenWrt, are Routerboard, Soekris etc. This howto is based on the use of Ubuntu 9.10, or similar Debian based desktop distribution with apt-get.

Preparation

Prerequisites

Read about Bootp and PXEBoot and probably best, if you understand them well.

First, determine whether your bootloader even supports netbooting: start a wireshark capture on your PC interface that you intend to use to serve the device, if it doesnt make a dhcp/bootp request, setting up a dhcp server on your PC is pointless. NB: some devices do this selectively - the Soekris 4801 for example has abios wher eyou can set to boot from CF (80,81=compact flash) or from network (F0, iirc). Other devices may also be modal (ie if ethernet is plugged in at boot, etc..)

Doing a wireshark capture will also tell you if your device has a tftp client (it will make a tftp request for a file) or a tftp server (it will silently wait (briefly) for your client to connect)

Required Packages

Client (OpenWrt)

  • none ⇒ the functionality is already contained in the bootloader

Server (your PC)

You need to install the following packages:

  • Option 1:
    • tftpd-hpa
    • dhcp3-server
    • netkit-inetd
  • Option 2:
    • dnsmasq

sudo apt-get update
# option 1
sudo apt-get install tftpd-hpa dhcp3-server openbsd-inetd
# option 2
sudo apt-get install dnsmasq

Configuration

Server (your PC)

Option 1

TFTPd

TFTPd is typically run as needed, by inetd or xinetd. To chheck the setup of the tftpd server via inetd.conf, either confirm or add the following line in /etc/inetd.conf:

tftp           dgram   udp     wait    root  /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot

Or, if your box runs xinetd (check for /etc/xinetd.conf and /etc/xinetd.d/tftp), then add following, or comment out the disable item.

# default: off
# description: The tftp server serves files using the trivial file transfer \
#	protocol.  The tftp protocol is often used to boot diskless \
#	workstations, download configuration files to network-aware printers, \
#	and to start the installation process for some operating systems.
service tftp
{
	socket_type		= dgram
	protocol		= udp
	wait			= yes
	user			= root
	server			= /usr/sbin/in.tftpd
	server_args		= -s /var/lib/tftpboot
#	disable			= yes
	per_source		= 11
	cps			= 100 2
	flags			= IPv4
}

Don't forget to check if the tftp directory /var/lib/tftpboot was created correctly (add it if it hasn't already been created).

Edit /etc/default/tftpd-hpa to show the following:

RUN_DAEMON="yes"
OPTIONS="-l -s /var/lib/tftpboot"
Start the tftpd daemon with the command:
 sudo /etc/init.d/tftpd-hpa start
Verify that inetd is listening on the right port:
netstat -lu
should show a line with:
udp        0      0 *:tftp                  *:*      

DHCPd

You need to decide on what network interfaces the DHCP server (dhcpd) is supposed to serve DHCP requests? First list available interfaces with ifconfig then edit the line in /etc/default/dhcp3-server file. Separate multiple interfaces is done with adding simple spaces, e.g. "eth0 eth1". like this:

INTERFACES="eth1 eth2"
The setup in this case is basic, and only utilizes one wired interface (eth0), and the file looks like this:
INTERFACES="eth0"

To configure the dhcp server you need to edit the /etc/dhcp3/dhcpd.conf file. The below lines needs to be added to the default file. Hereby substituting IP and MAC address as needed. Beware not to forget the semicolons (";") at the end of lines. In this case the setup is based on the use of the 192.168.23.xxx IP range, and the device which is to boot has a fixed Ip-address (192.168.23.2) based on its MAC address validation.

authoritative;

max-lease-time 604800;
default-lease-time 3100;

ddns-update-style none;
ddns-ttl 7200;

allow booting;
allow bootp;
one-lease-per-client true;

subnet 192.168.23.0 netmask 255.255.255.0 {
	option routers 192.168.23.254;
	option subnet-mask 255.255.255.0;
	option broadcast-address 192.168.23.255;
	ignore client-updates;
}

group {
	host (your device) {
		hardware ethernet (mac address of device);
		next-server 192.168.23.254;
		fixed-address 192.168.23.2;
		filename "name of bootfile";
	}

}

Hereafter it is good to ensure that the eth0 interface is up and active, with:

sudo ifup eth0
Check if the eth0 interface has recieved the correct static IP-address:
ifconfig eth0
If the configuring of your dhcp server is correct, it will start with the following command (the options are stop, start, restart):
sudo /etc/init.d/dhcp3-server start
The dhcp3 server will either reply with an [OK] or [fail], but you can do an extra check and verify it runs (if not, you may have a problem in the dhcpd config file):
ps ax | grep dhcpd

Option 2

Dnsmasq is a DNS resolver, but also includes a DHCP server and a TFTP server too! Add the following configuration to /etc/dnsmasq.conf, or in a file in /etc/dnsmasq.d/ for recent Debian/Ubuntu versions:

# deactivate DNS
port=0
# listen on specific interface and/or address
interface=eth0
listen-address=192.168.7.1
bind-interfaces
## DHCP configuration
dhcp-range=192.168.7.50,192.168.7.150,12h
# detect PXE clients
dhcp-vendorclass=set:pxe,PXEClient
# MACs we serve
dhcp-host=00:aa:bb:cc:dd:ee
dhcp-host=00:bb:cc:dd:ee:ff
# do not send default route and DNS server options
dhcp-option=option:router
dhcp-option=option:dns-server
# ignore request from unknown hosts
dhcp-ignore=tag:!known
# and ignore non-PXE booting
dhcp-ignore=tag:!pxe
## TFTP configuration
enable-tftp
tftp-root=/srv/tftp
dhcp-boot=name_of_the_boot_file

You can remove the PXE filter if you are serving non-PXE hosts (comment the right dhcp-ignore line). You can also not restrict MAC addresses you are responding to, but it's better to spot right.

You must of course have configured your interface with some IP address; see below.

Then simply sudo service dnsmasq restart, and enjoy your all-in-one netbooting server.

Edit interface file

I found that I needed to edit the /etc/network/interfaces file to fix an issue between the Gnome Networkmanager and the dhcp3 server. Without adding the below lines the dhcp server could not identify the correct interface to listen on:

iface eth0 inet static
   address 192.168.23.254
   network 192.168.23.0/24
   netmask 255.255.255.0
   broadcast 192.168.23.255
auto eth0

Client (OpenWrt)

Troubleshooting

Notes

Back to top

inbox/netboot.txt · Last modified: 2012/05/29 10:00 (external edit)