PXE network boot on Linux

The purpose of this tutorial is to cover the subject of booting and installing Linux using the network, be it local or not.

We will treat installing Linux without optical, USB or other removable media, by just using the LAN. You are expected to have at least two computers in your network, and the client will need a NIC and a BIOS capable of using PXE.

We will guide you from beginning to end, but some basic networking and Linux configuration knowledge, plus the use of an editor of your choice are required. You will learn what PXE is, how to configure a DHCP server, how to configure a TFTP server so the client can have access to the files, plus lots of interesting things, as usual. Let’s get started.

In this tutorial you will learn:

  • What is PXE?
  • Typical network layout for PXE booting
  • How to setup DHCP and TFTP
  • How to configure PXE for network boot
PXE network boot on Linux
PXE network boot on Linux
Software Requirements and Linux Command Line Conventions
Category Requirements, Conventions or Software Version Used
System Any Linux system
Software N/A
Other Privileged access to your Linux system as root or via the sudo command.
Conventions # – requires given linux commands to be executed with root privileges either directly as a root user or by use of sudo command
$ – requires given linux commands to be executed as a regular non-privileged user

What is PXE?

PXE (pronounced “pixie”) stands for Preboot eXecution Environment and was introduced by Intel and Systemsoft in 1999. In short, it’s a capability most modern network cards and BIOSes have that enables the system to boot from LAN, just like it would boot from hard disk or CD-ROM.

The PXE support must be present in the NIC’s firmware which, if set up accordingly in the BIOS, will get an IP address from the PXE server and download the necessary boot images. In order for an IP address to be available, the server must offer DHCP.

After an IP address is leased, the TFTP server (which can be the same box as the DHCP server) hands out the necessary files to the client, so it can boot them after loading. That’s the whole idea, so enough talk, let’s get to work, shall we?

Network layout for PXE booting

Before we start, it’s important to understand the type of network layout one would need to have in order for PXE booting to be possible. As an example, we will show you how we have setup our test environment.

Our server is a Debian machine with two network cards, and the distribution we will install is also Debian. You can use any other distribution, but probably some config file locations will differ.

This article does not deal with how you will set up the software sources for the actual installation. We will only take you to a working debian-installer and that’s about it. You’ll find lots of tutorials out there about how to set up a local Debian repository or how to configure a gateway on Linux.

So, the checklist. We will need the following:

  • DHCP server
  • TFTP server
  • the initrd and the kernel image to be transferred to the client

We chose a rather unusual approach in our setup, and you will see why.

Outside world ------> Router ------> Switch ------>(eth0) Server(eth1) ------> Client

So, the router gives out DHCP addresses (small, home router) in the form of 192.168.0.x. The server, which will also be handing out DHCP addresses, has its outside connection via eth0 and the inside connection for the client via eth1.

The client has the only Ethernet connection directly to the PXE server, but that doesn’t mean you can’t configure the server as a gateway for netinstall or add another NIC to the client for outside access. There are a lot of possibilities, the important issue at hand is booting via PXE. Let’s start by installing the TFTP server.

Setup TFTP

TFTP stands for Trivial File Transfer Protocol and it’s the de facto “language” when it comes to transferring files to use with PXE.

  1. On Debian, we install it thusly:
    $ sudo apt install tftpd-hpa pxelinux
  2. Start your TFTP server with the following systemctl command.
    $ sudo systemctl start tftpd-hpa

Setup DHCP

We have to offer the client an address before we commence installing via network, and this is done by using the Dynamic Host Configuration Protocol. The DHCP server has a pool of addresses from which it offers IPs when requested.

  1. One installs the server part with:
    $ sudo apt install isc-dhcp-server
  2. Edit the /etc/dhcp/dhcpd.conf file, and adapt it with the IP addresses and network information of your own systems. Ours looks something like this:
    ddns-update-style none;
    # Remember the semicolons at the end of each line!
    default-lease-time 86400;
    max-lease-time 604800;
    subnet netmask {
            filename "pxelinux.0";
            option subnet-mask;
    # There is more to this file than we've shown, but what you have here is enough for PXE.

    A little recap may be in order: eth0 – outside world via switched network (192.168.0.x) and eth1 – direct link to the client (192.168.1.x).

  3. After making the necessary changes, you will need to restart the DHCP service.

    $ sudo systemctl restart isc-dhcp-server

Configuring PXE

  1. Now we need to provide the boot file. To do so, we will download the netboot image from Debian.
  2. Decompress the netinstall archive into your /srv/tftp directory. The contents should look like this:
  3. Ensure that all files have the necessary permissions:
    $ sudo chmod -R a+r /srv/tftp/*
  4. Now, hoping that everything is alright, you can just boot your client and alter its’ BIOS settings for network boot.

Before we finish, we owe you an explanation for this network setup we chose. We could have probably made it simpler, like using our ISP’s connection directly, and being able to access the network (Internet) as well. The idea is that the PXE server in our scenario can’t get its IP address (eth0) from DHCP as this setup won’t work: if you’re not going to use the two-NIC scenario on the server, like we did, you need some kind of fixed IP address.

So, the possibilities would be: ISP connected directly, set router to give only static IPs, make the PXE/DHCP/TFTP server also a gateway or create a local repository. We chose the latter because it suits our topology and purposes best, and it only involves setting up a webserver on the LAN, really.

If we would have explained all your choices, including iptables for a gateway or apache for a HTTP server, this article would have been huge. Instead, we preferred to stick to the title and give you exactly that: Network booting with Linux.

Remember that this is just an example: like with NetbootCD, you can add as many distributions as you want, provided you have the necessary space on the server.

Final thoughts

First of all, we recommend patience. PXE is known to be kind of slow, regardless of your top Gigabit switch you bought last week. Second, read the comments and examples in dhcpd.conf as they will be useful now and later.

Comments and Discussions
Linux Forum