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 :
#!/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 :
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.