From Linuxintro
Revision as of 13:22, 3 November 2015 by imported>ThorstenStaerk (→‎See also)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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


The typical PXE boot looks like this:

  1. Computer A starts. Its 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

In this example we use SUSE Linux 12.1.


To allow your computers to boot from the network, they first need an IP address. So, set up a dhcp-server. Adapt /etc/dhcpd.conf, here is an example:

ddns-update-style interim;
authoritative; # I am the one and only here
default-lease-time 600;
max-lease-time 3600;
option broadcast-address;
option routers;
option domain-name-servers;
option domain-name "mydomain.net";

subnet netmask 
   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.

# yast -i tftp syslinux
  • copy syslinux' pxelinux.0 to /srv/tftpboot/:
# rpm -ql syslinux | grep pxelinux.0
# cp /usr/share/syslinux/pxelinux.0 /srv/tftpboot/
  • Activate the tftp server. To do this, change /etc/xinetd.d/tftp. Replace
disable = yes


disable = no

Then restart xinetd which hosts tftpd:

/etc/init.d/xinetd restart
  • 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 directory /srv/tftpboot/pxelinux.cfg:

mkdir /srv/tftpboot/pxelinux.cfg

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

default linux
timeout 0
prompt 1
display display.msg

label linux
  kernel vmlinuz
  append initrd=initrd
  • Now you must supply kernel (vmlinuz) and initrd into the tftp folder:
cp /boot/vmlinuz /srv/tftpboot
cp /boot/initrd /srv/tftpboot

Change initial ramdisk

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

cd /srv/tftpboot
mkdir tmp
cd tmp
cp ../initrd ./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.

Basic setup

The goal here is to be able to boot a Linux shell from PXE.

For this I took the initrd and kernel from the SUSE 12.1 install DVD and modified the initrd. I replaced /init on the initrd by /bin/bash. Then I copied busybox to /bin. Then I booted from PXE. Then I mounted /proc:

mount -t proc proc /proc


cd /srv
wget http://www.tux.org/pub/people/kent-robotti/looplinux/rip/RIPLinuX-13.7.PXE.zip
unzip RIPLinuX-13.7.PXE.zip

Ubuntu 10.04

This article is a stub and needs improvement. You can help here :)

This works only partly. Keep it here for development. The links are valid as of 2012-12-14.

sudo su -
apt-get install tftpd-hpa
wget http://ftp.debian.org/debian/dists/wheezy/main/installer-i386/current/images/netboot/netboot.tar.gz
tar xvzf netboot.tar.gz
sed -i 's/BOOT=local/BOOT=nfs/'  /etc/initramfs-tools/initramfs.conf
mkinitramfs -o /boot/initrd-netboot.img
cp /boot/vmlinuz-2.6.32-33-generic /var/lib/tftpboot/
cp /boot/initrd-netboot.img /var/lib/tftpboot/
apt-get install dhcp3-server
cat >dhcpd.conf <<EOF
option domain-name "mydomain.org";
option domain-name-servers;
option routers;
allow booting;
allow bootp;
authoritative; # I am the one and only here 

ddns-update-style none;
default-lease-time 14400;
subnet netmask {
  default-lease-time 14400;
  max-lease-time 172800;
  filename "pxelinux.0";
/etc/init.d/dhcp3-server start
cat >/etc/exports<<EOF
/public/   *(rw,no_root_squash,sync)

See also