Création d'un serveur PXE

Cette documentation est basée sur un sujet de travaux pratiques rédigé par Jean-Philippe Zimmer (IUT Dijon-Auxerre – Département Réseaux et Télécommunications – Université de Bourgogne) en 2011.

Procédure validée sur Xubuntu 24.04 et Debian 13.

Présentation du projet

Nous souhaitons démarrer un système Debian par le réseau. Pour cela, nous utilisons la technologie PXE (Pre-boot eXecution Environment) qui permet à un ordinateur de démarrer depuis le réseau en récupérant un système d’exploitation se trouvant sur un serveur.

Installation et configuration du client

Reportez-vous à l'article sur la création d'images système live pour la création du système client.

Placer les fichiers du système live (initrd.img, vmlinuz et filesystem.squashfs) dans le répertoire /srv/tftp/boot/netsystem.

Installation et configuration du serveur

Installer les paquets suivants :

apt install isc-dhcp-server tftpd-hpa syslinux-common syslinux-efi pxelinux nftables

Configurer l'adresse IP du serveur (ici : 192.168.0.100) en éditant le fichier /etc/network/interfaces :

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp1s0
iface enp1s0 inet static
	address 192.168.0.100/24
	gateway 192.168.0.1

Autoriser le trafic vers le serveur PXE et en loopback en modifiant le fichier /etc/nftables.conf. Adapter selon les autres services déjà installés :

Pensez à créer une règle pour SSH si vous utilisez ce service pour configurer votre serveur. Ne vous enfermez pas dehors !
#!/usr/sbin/nft -f

flush ruleset

table inet tableinet {
	chain input {
		type filter hook input priority filter; policy drop;
		iifname lo accept
		udp dport 67 accept
		udp dport 69 accept
		ct state {established,related} accept
	}
	chain forward {
		type filter hook forward priority filter;
	}
	chain output {
		type filter hook output priority filter;
	}
}

Activer et redémarrer nftables :

systemctl enable nftables.service
systemctl restart nftables.service

Configuration du serveur DHCP

Dans notre cas, nous travaillerons sur un réseau 192.168.0.0/24. Éditer le fichier /etc/dhcp/dhcpd.conf. Cette configuration détecte si la machine utilise un BIOS, un EFI 32 ou 64 bits et renvoie le fichier approprié :

#
# Sample configuration file for ISC dhcpd for Debian
#
#

# The ddns-updates-style parameter controls whether or not the server will
# attempt to do a DNS update when a lease is confirmed. We default to the
# behavior of the version 2 packages ('none', since DHCP v2 didn't
# have support for DDNS.)
ddns-update-style none;

default-lease-time 43200;
max-lease-time 86400;

# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
log-facility local7;

allow bootp;
allow booting;
next-server 192.168.0.100;
option arch code 93 = unsigned integer 16;
if option arch = 00:06 {
   filename "efi32/syslinux.efi";
} else if option arch = 00:07 {
   filename "efi64/syslinux.efi";
} else if option arch = 00:09 {
   filename "efi64/syslinux.efi";
} else {
   filename "bios/pxelinux.0";
}

subnet 192.168.0.0 netmask 255.255.255.0 {
   option routers 192.168.0.1;
   option subnet-mask 255.255.255.0;
   option broadcast-address 192.168.0.255;
   option domain-name-servers 192.168.0.1;
   range 192.168.0.10 192.168.0.90;
}

Définissez l'interface d'écoute du serveur DHCP en modifiant la ligne suivante dans /etc/default/isc-dhcp-server :

INTERFACESv4="enp1s0"

Redémarrer le service :

systemctl restart isc-dhcp-server

Configuration TFTP

Éditer le fichier /etc/default/tftpd-hpa :

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"

RUN_DAEMON="yes"

Redémarrer le service :

systemctl restart tftpd-hpa

Création du menu au démarrage

Créer l'arborescence accueillant les fichiers pour démarrer les machines BIOS, EFI 32 et 64 bits ainsi que le dossier accueillant les systèmes à démarrer et la configuration du PXE :

mkdir -p /srv/tftp/{boot,pxelinux.cfg,bios,efi32,efi64}

Copier les fichiers de démarrage pour les trois configurations :

cp /usr/lib/PXELINUX/pxelinux.0 /srv/tftp/bios/
cp /usr/lib/syslinux/modules/bios/* /srv/tftp/bios/
cp /usr/lib/SYSLINUX.EFI/efi32/syslinux.efi /srv/tftp/efi32/
cp /usr/lib/syslinux/modules/efi32/* /srv/tftp/efi32/
cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /srv/tftp/efi64/
cp /usr/lib/syslinux/modules/efi64/* /srv/tftp/efi64/

Créer les liens symboliques afin que les trois configurations partagent les systèmes à démarrer, le descriptif PCI et la configuration du PXE :

cd /srv/tftp/bios
ln -s ../boot boot
ln -s ../pxelinux.cfg pxelinux.cfg
ln -s ../boot/pci.ids pci.ids
cd /srv/tftp/efi32
ln -s ../boot boot
ln -s ../pxelinux.cfg pxelinux.cfg
ln -s ../boot/pci.ids pci.ids
cd /srv/tftp/efi64
ln -s ../boot boot
ln -s ../pxelinux.cfg pxelinux.cfg
ln -s ../boot/pci.ids pci.ids

Éditer le fichier /srv/tftp/pxelinux.cfg/default :

DEFAULT vesamenu.c32
TIMEOUT 100
MENU TITLE Menu de demarrage
ALLOWOPTIONS 0
MENU AUTOBOOT Demarrage automatique dans # seconde{,s}. 

LABEL NETSYSTEM
	MENU LABEL Demarrer le systeme en reseau
	KERNEL boot/netsystem/vmlinuz
	APPEND boot=live initrd=boot/netsystem/initrd.img fetch=tftp://192.168.0.1/boot/netsystem/filesystem.squashfs ro --
	TEXT HELP
	Amorcer le systeme en reseau. 
	ENDTEXT

Personnaliser le menu

Le menu par défaut n'est pas très flatteur à l'œil. Nous allons le personnaliser et pour cela nous allons agir sur les paramètres suivants :

MENU TITLE
Change le titre du menu.
MENU TITLE Mon menu de demarrage PXE
MENU BACKGROUND
Change le fond d'écran du menu. Cette image doit avoir la résolution égale à celle de l'écran (recommandé : 640 × 480). L'image doit avoir 65536 couleurs. Pour convertir une image, utiliser la commande :
convert -depth 16 -colors 65536 /tmp/background.jpg /srv/tftp/boot/background.jpg
Exemple :
MENU BACKGROUND boot/background.jpg
MENU COLOR
Change la couleur des éléments du menu. Pour plus de détails, se reporter ici : Documentation MENU COLOR Syslinux.
MENU COLOR TITLE 0 #FFD64937 #00000000 std
MENU SEPARATOR
Ajouter un séparateur au menu.
MENU LABEL
Change l'étiquette sur une entrée du menu.
MENU LABEL Demarrer le systeme en reseau
TEXT HELP
Ajoute une description sur une entrée du menu.
TEXT HELP
Amorcer le systeme en reseau. 
ENDTEXT
TIMEOUT
Definit la durée en dixième de secondes d'affichage du menu avant le démarrage de l'option par défaut.
TIMEOUT 100

La documentation complète est disponible ici : http://www.syslinux.org/wiki/index.php?title=Menu

Option de démarrage sur le disque local

Ajouter les lignes suivantes au fichier /srv/tftp/pxelinux.cfg/default :

LABEL LOCALDISK
	MENU LABEL Demarrer le disque local
	KERNEL chain.c32
	APPEND hd0

Option de redémarrage

Ajouter les lignes suivantes au fichier /srv/tftp/pxelinux.cfg/default :

LABEL REBOOT
	MENU LABEL Redemarrer le systeme
	KERNEL reboot.c32

Option de démarrage sur Memtest86+

Télécharger Memtest86+ :

apt -y install unzip
wget -O /tmp/memtest.zip https://memtest.org/download/v7.20/mt86plus_7.20.binaries.zip
unzip /tmp/memtest.zip -d /srv/tftp/boot

Ajouter les lignes suivantes au fichier /srv/tftp/pxelinux.cfg/default :

LABEL MEMTEST
	MENU LABEL Memtest86+
	KERNEL boot/memtest32.bin
	APPEND -e

Option d'inventaire du matériel

Télécharger le descriptif PCI pour l'utilitaire HDT :

wget -O /srv/tftp/boot/pci.ids http://pci-ids.ucw.cz/v2.2/pci.ids

Ajouter les lignes suivantes au fichier /srv/tftp/pxelinux.cfg/default :

LABEL HDT
	MENU LABEL Inventaire du materiel
	COM32 hdt.c32
	APPEND pciidc=boot/pci.ids

Option de démarrage sur l'installeur Debian

Télécharger la derniere version de l'installeur Debian netinstall :

mkdir -p /srv/tftp/boot/debian-64
wget -O /srv/tftp/boot/debian-64/linux http://ftp.fr.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux
wget -O /srv/tftp/boot/debian-64/initrd.gz http://ftp.fr.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz

Ajouter les lignes suivantes au fichier /srv/tftp/pxelinux.cfg/default :

LABEL DEBIAN64
	MENU LABEL Installeur Debian
	KERNEL boot/debian-64/linux
	APPEND vga=788 initrd=boot/debian-64/initrd.gz --- quiet

LABEL RESCUEDEBIAN64
	MENU LABEL Depannage Debian
	KERNEL boot/debian-64/linux
	APPEND vga=788 initrd=boot/debian-64/initrd.gz rescue/enable=true --- quiet

Option de démarrage sur le live et l'installeur Xubuntu

Télécharger la derniere version LTS de l'ISO Xubuntu 64 bits minimale depuis un miroir Xubuntu :

wget -O /srv/tftp/boot/xubuntu-64.iso http://ftp.free.fr/mirrors/ftp.xubuntu.com/releases/24.04/release/xubuntu-24.04.3-minimal-amd64.iso
mkdir /srv/tftp/boot/xubuntu

Monter l'ISO dans le répertoire /srv/tftp/xubuntu-64. Pour cela, ajouter la ligne suivante dans /etc/fstab :

/srv/tftp/boot/xubuntu-64.iso /srv/tftp/boot/xubuntu iso9660 loop 0 0

Monter l'ISO :

mount /srv/tftp/boot/xubuntu

Installer le serveur NFS :

apt install nfs-kernel-server

Fixer les ports NFS en modifiant le fichier /etc/nfs.conf :

[general]
pipefs-directory=/run/rpc_pipefs

[lockd]
port=32768
udp-port=32768

[mountd]
manage-gids=y
port=32767

[statd]
port=32765
outgoing-port=32766

Ajouter les lignes suivantes au fichier /etc/nftables.conf, dans la chaîne input :

table inet tableinet {
	chain input {
		tcp dport 111 accept
		udp dport 111 accept
		tcp dport 2049 accept
		udp dport 2049 accept
		tcp dport {32765,32768} accept
		udp dport {32765,32768} accept
	}
}

Redémarrer nftables :

systemctl restart nftables.service

Ajouter l'export du dossier en lecture seule dans /etc/exports :

/srv/tftp/boot/xubuntu/	192.168.0.0/24(ro,sync)

Recharger le service NFS :

systemctl restart nfs-kernel-server

Ajouter les lignes suivantes au fichier /srv/tftp/pxelinux.cfg/default :

LABEL XUBUNTU-LIVE
	MENU LABEL Live Xubuntu
	KERNEL boot/xubuntu/casper/vmlinuz
	APPEND boot=casper netboot=nfs nfsroot=192.168.0.1:/srv/tftp/boot/xubuntu initrd=boot/xubuntu/casper/initrd ip=dhcp locale=fr_FR bootkbd=fr console-setup/layoutcode=fr noprompt fsck.mode=skip quiet splash --

LABEL XUBUNTU-INSTALL
	MENU LABEL Installeur Xubuntu
	KERNEL boot/xubuntu/casper/vmlinuz
	APPEND boot=casper netboot=nfs nfsroot=192.168.0.1:/srv/tftp/boot/xubuntu initrd=boot/xubuntu/casper/initrd ip=dhcp locale=fr_FR bootkbd=fr console-setup/layoutcode=fr noprompt fsck.mode=skip only-ubiquity quiet splash --
   
LABEL XUBUNTU-INSTALL-OEM
	MENU LABEL Installeur Xubuntu OEM
	KERNEL boot/xubuntu/casper/vmlinuz
	APPEND boot=casper netboot=nfs nfsroot=192.168.0.1:/srv/tftp/boot/xubuntu initrd=boot/xubuntu/casper/initrd ip=dhcp locale=fr_FR bootkbd=fr console-setup/layoutcode=fr noprompt fsck.mode=skip only-ubiquity oem-config/enable=true quiet splash --

Option de démarrage sur un autre serveur PXE

Ajouter les lignes suivantes au fichier /srv/tftp/pxelinux.cfg/default :

LABEL NEPTUNE
	MENU LABEL Basculer sur le menu PXE serveur Neptune
	KERNEL pxechn.c32
	APPEND 192.168.0.101::pxelinux.0

Exemple de configuration complète

Voici un exemple de configuration complète :

Screenshot PXE

Voici le fichier de configuration /srv/tftp/pxelinux.cfg/default associé :

DEFAULT vesamenu.c32
TIMEOUT 100
ONTIMEOUT LOCALDISK
MENU TITLE Menu de demarrage PXE
MENU BACKGROUND boot/splash-pxe.jpg
MENU COLOR TITLE 0 #FFD64937 #00000000 std
MENU COLOR SEL 0 #E0000000 #FFD64937 all
MENU COLOR BORDER 0 #00000000 #00000000 none
MENU VSHIFT 2
ALLOWOPTIONS 0
MENU AUTOBOOT Demarrage automatique du disque local dans # seconde{,s}. 

LABEL LOCALDISK
	MENU LABEL Demarrer le disque local
	KERNEL chain.c32
	APPEND hd0
	TEXT HELP
	Amorcer le disque dur local.
	ENDTEXT

LABEL REBOOT
	MENU LABEL Redemarrer le systeme
	KERNEL reboot.c32
	TEXT HELP
	Redemarrer l'ordinateur.
	ENDTEXT

LABEL MEMTEST
	MENU LABEL Memtest86+
	KERNEL boot/memtest
	APPEND -e
	TEXT HELP
	Effectuer un test de memoire.
	ENDTEXT

LABEL HDT
	MENU LABEL Inventaire du materiel
	COM32 hdt.c32
	APPEND pciidc=boot/pci.ids
	TEXT HELP
	Inventaire du materiel
	ENDTEXT

MENU SEPARATOR

LABEL NETSYSTEM
	MENU LABEL Demarrer le systeme en reseau
	KERNEL boot/netsystem/vmlinuz
	APPEND boot=live initrd=boot/netsystem/initrd.img fetch=tftp://192.168.0.1/boot/netsystem/filesystem.squashfs ro --
	TEXT HELP
	Amorcer le systeme en reseau.
	ENDTEXT

LABEL DEBIAN64
	MENU LABEL Installeur Debian 64 bits
	KERNEL boot/debian-64/linux
	APPEND vga=788 initrd=boot/debian-64/initrd.gz --- quiet
	TEXT HELP
	Installation de Debian stable a partir du reseau.
	ENDTEXT

LABEL RESCUEDEBIAN64
	MENU LABEL Depannage Debian 64 bits
	KERNEL boot/debian-64/linux
	APPEND vga=788 initrd=boot/debian-64/initrd.gz rescue/enable=true --- quiet
	TEXT HELP
	Mode de recuperation de Debian 64 bits
	ENDTEXT

LABEL XUBUNTU-LIVE
	MENU LABEL Live Xubuntu
	KERNEL boot/xubuntu/casper/vmlinuz
	APPEND boot=casper netboot=nfs nfsroot=192.168.0.1:/srv/tftp/boot/xubuntu initrd=boot/xubuntu/casper/initrd ip=dhcp locale=fr_FR bootkbd=fr console-setup/layoutcode=fr noprompt fsck.mode=skip quiet splash --
	TEXT HELP
	Live Xubuntu LTS 64 bits.
	ENDTEXT

LABEL XUBUNTU-INSTALL
	MENU LABEL Installeur Xubuntu
	KERNEL boot/xubuntu/casper/vmlinuz
	APPEND boot=casper netboot=nfs nfsroot=192.168.0.1:/srv/tftp/boot/xubuntu initrd=boot/xubuntu/casper/initrd ip=dhcp locale=fr_FR bootkbd=fr console-setup/layoutcode=fr noprompt fsck.mode=skip only-ubiquity quiet splash --
	TEXT HELP
	Installation de Xubuntu LTS 64 bits.
	ENDTEXT
   
LABEL XUBUNTU-INSTALL-OEM
	MENU LABEL Installeur Xubuntu OEM
	KERNEL boot/xubuntu/casper/vmlinuz
	APPEND boot=casper netboot=nfs nfsroot=192.168.0.1:/srv/tftp/boot/xubuntu initrd=boot/xubuntu/casper/initrd ip=dhcp locale=fr_FR bootkbd=fr console-setup/layoutcode=fr noprompt fsck.mode=skip only-ubiquity oem-config/enable=true quiet splash --
	TEXT HELP
	Installation de Xubuntu LTS 64 bits OEM.
	ENDTEXT

MENU SEPARATOR

LABEL NEPTUNE
	MENU LABEL Basculer sur le menu PXE serveur Neptune
	KERNEL pxechn.c32
	APPEND 192.168.0.101::pxelinux.0
	TEXT HELP
	Demarrer sur le serveur Neptune
	ENDTEXT

Le fond d'écran est téléchargeable ici : https://antoinepernot.fr/data/splash-pxe.jpg

Lancer le client PXE et tester.