From LQWiki
Jump to: navigation, search

PXE stands for Preboot Execution Environment. It is used to boot a computer using bootstrap information from over the network.


The typical PXE boot looks like this:

  1. Computer A starts. It's BIOS is set to do a PXE boot, so booting from the network.
  2. Computer A acquires an IP address from dhcp server B.
  3. Computer A downloads its booting files (initrd and kernel) via tftp from B.
  4. Computer A executes the kernel just as if it had from its local hard disk.

How to start


To allow your computers to boot from the network, they first need an IP address. So, set up a dhcp-server. Make sure /etc/dhcpd.conf contains the following lines:

allow booting;
allow bootp;
authoritative; # I am the one and only here

Make sure your "subnet" section contains the following lines:

filename "pxelinux.0";

Make sure you have restarted your dhcpd:

/etc/init.d/dhcpd restart


After your computers have received their IP address, they start asking for their booting file from the TFTP-server, in this case So, make sure they can get it. Install tftp, syslinux and copy its pxelinux.0 to /tftpboot/. Activate the tftp server. Test it:

tftp -c get pxelinux.0

Test your configuration now by booting a connected computer from PXE. You should get an error message saying that the configuration file pxelinux.cfg/default has not been found.


Create a /tftpboot/pxelinux.cfg/default like this:

default linux
timeout 0
prompt 1
display display.msg

label linux
  kernel vmlinuz
  append initrd=initrd.img

Change initial ramdisk

If you now want to change the initrd to actually do something, you can do it like this:

cd /tftpboot
mkdir tmp
cd tmp
cp ../initrd.img ./initrd.gz
gunzip initrd.gz
mkdir tmp2
cd tmp2
cpio -id < ../initrd

Do the needed changes now in this folder. Then pack the initrd again:

find . | cpio --create --format='newc' > ../newinitrd
cd ..
gzip newinitrd

Your new initrd is now called newinitrd.gz.

See also