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 22.04 et Debian 12.

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.

Nous installerons deux systèmes Debian : le serveur et le client démarré depuis le réseau.

Installation et configuration du client

Démarrer la machine client sur un live Xubuntu et créer sur le disque dur une partition formatée en ext2. Pour la suite de cette documentation, nous considèrerons que cette partition est connectée sur /dev/sda1.

Installer debootstrap :

apt -y install debootstrap

Monter la partition sur /mnt :

mount /dev/sda1 /mnt

Effectuer une installation de base avec debootstrap :

debootstrap --arch i386 stable /mnt/ http://deb.debian.org/debian/

Monter les répertoires du nouveau système fraîchement installés :

mount -t sysfs /sys /mnt/sys
mount -t proc /proc /mnt/proc
mount --bind /dev /mnt/dev
mount -t devpts /dev/pts /mnt/dev/pts
mount --bind /tmp /mnt/tmp

Entrer dans le système du client :

chroot /mnt

Pour la suite de cette documentation, les commandes à exécuter lors du chroot seront précédés par chroot>.

Définir le mot de passe du compte root (si nécesaire) :

chroot> passwd root

Modifier le nom de la machine dans le fichier /etc/hostname et ajouter le nom de machine sur la ligne 127.0.0.1 dans le fichier /etc/hosts.

Créer un utilisateur standard :

chroot> adduser antoine

Définir la langue du système en français :

chroot> apt -y install locales
chroot> dpkg-reconfigure locales

Cocher fr_FR.UTF-8 et choisir cette langue par défaut.

Définir le fuseau horaire de l'horloge :

chroot> dpkg-reconfigure tzdata

Choisir Europe puis Paris.

Modifier le fichier /etc/apt/sources.list comme suit :

deb http://deb.debian.org/debian/ stable main contrib non-free non-free-firmware
deb http://security.debian.org/debian-security stable-security main contrib non-free non-free-firmware
deb http://deb.debian.org/debian/ stable-updates main contrib non-free non-free-firmware
deb http://deb.debian.org/debian/ stable-proposed-updates main contrib non-free non-free-firmware
deb http://ftp.debian.org/debian stable-backports main contrib non-free non-free-firmware

Mettre à jour les dépôts et installer les paquets nécessaires (à personnaliser si vous le souhaitez).

chroot> apt update
chroot> apt -y install bash-completion nano mc xfce4 lightdm network-manager network-manager-gnome gparted gsmartcontrol xfce4-whiskermenu-plugin numix-gtk-theme papirus-icon-theme dmz-cursor-theme cheese vlc firefox-esr firefox-esr-l10n-fr engrampa mate-calc mousepad partclone dcfldd console-data sudo terminator krusader kate geany geany-plugins simple-scan grsync audacity blueman wpasupplicant grub2 os-prober debootstrap gvfs-backends gvfs-fuse qt5ct qt5-style-plugins firmware-linux-nonfree firmware-amd-graphics firmware-ath9k-htc firmware-atheros firmware-bnx2 firmware-bnx2x firmware-brcm80211 firmware-cavium firmware-intel-sound firmware-ipw2x00 firmware-ivtv firmware-iwlwifi firmware-libertas firmware-linux firmware-linux-free firmware-linux-nonfree firmware-microbit-micropython firmware-microbit-micropython-doc firmware-misc-nonfree firmware-myricom firmware-netronome firmware-netxen firmware-qcom-media firmware-qcom-soc firmware-qlogic firmware-realtek firmware-samsung firmware-siano firmware-sof-signed firmware-ti-connectivity firmware-tomu firmware-zd1211 hdmi2usb-fx2-firmware midisport-firmware sigrok-firmware-fx2lafw ubertooth-firmware ubertooth-firmware-source arm-trusted-firmware-tools atmel-firmware bluez-firmware dahdi-firmware-nonfree dns323-firmware-tools broadcom-sta-common broadcom-sta-dkms broadcom-sta-source bluetooth bluez bluez-cups bluez-firmware bluez-obexd bluez-tools pulseaudio-module-bluetooth pulseaudio-module-gsettings pulseaudio-module-zeroconf mesa-utils mesa-utils-extra mesa-va-drivers mesa-vdpau-drivers mesa-vulkan-drivers vulkan-tools vulkan-validationlayers linux-image-686
chroot> apt -y upgrade

Lors de l'installation du paquet console-data, vous serez amené à choisir la configuration du clavier. Choisir l'option Choisir un codage clavier dans la liste complète puis pc / azerty / French / Same as X11 (latin9).

Installer les composants standards :

chroot> tasksel install standard print-server

Ajouter l'utilisateur standard dans le groupe sudo (si nécessaire) :

chroot> usermod -a -G sudo antoine

Modifier le fichier /etc/fstab comme suit :

UUID=<UUID de sda1> / ext2 defaults 0 1
tmpfs /tmp tmpfs defaults 0 0
tmpfs /var/tmp tmpfs defaults 0 0
tmpfs /var/log tmpfs defaults 0 0

Configurer la connexion automatique pour l'utilisateur standard à l'environnement graphique en décommentant et modifiant les lignes suivantes dans /etc/lightdm/lightdm.conf :

autologin-user=antoine
autologin-user-timeout=0

Pour une connexion automatique du système en mode ligne de commande, modifier le fichier /etc/systemd/system/getty.target.wants/getty@tty1.service et replacer la ligne suivante :

ExecStart=-/sbin/agetty --autologin antoine --noclear %I $TERM

Définir le curseur de la souris par défaut :

chroot> update-alternatives --config x-cursor-theme

Définir le gestionnaire de thème Qt :

echo "QT_QPA_PLATFORMTHEME=qt5ct" >> /etc/environment

Désactiver l'enregistrement de session XFCE :

chroot> mkdir /etc/xdg/xfce4/kiosk
chroot> echo "[xfce4-session]" > /etc/xdg/xfce4/kiosk/kioskrc
chroot> echo "SaveSession=NONE" >> /etc/xdg/xfce4/kiosk/kioskrc

Installer GRUB :

chroot> os-prober
chroot> grub-install /dev/sda

Quitter le chroot :

chroot> exit

Démonter les répertoires du système de fichiers chrooté :

umount /mnt/sys
umount /mnt/proc
umount /mnt/dev/pts
umount /mnt/dev
umount /mnt/tmp

Redémarrer la machine virtuelle sur le disque /dev/sda et personnaliser la configuration selon vos besoins.

Désactiver la mise en veille, l'hibernation depuis la session graphique :

xfconf-query -c xfce4-session -np '/shutdown/ShowSuspend' -t 'bool' -s 'false'
xfconf-query -c xfce4-session -np '/shutdown/ShowHibernate' -t 'bool' -s 'false'

Un fois cela fait, redémarrer sur le live Xubuntu et remonter les partitions :

mount /dev/sda1 /mnt

Installer le paquet live-boot sur le système de maintenance :

mount -t sysfs /sys /mnt/sys
mount -t proc /proc /mnt/proc
mount --bind /dev /mnt/dev
mount -t devpts /dev/pts /mnt/dev/pts
mount --bind /tmp /mnt/tmp
chroot /mnt
chroot> apt -y install live-boot
chroot> apt clean
chroot> exit

Dans le fichier /mnt/etc/fstab, retirer le montage de la racine.

Éteindre le client.

Installation et configuration du serveur

Installer les paquets suivants :

apt install isc-dhcp-server tftpd-hpa syslinux-common pxelinux rsync

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 enp0s3
iface enp0s3 inet static
    address 192.168.0.100
    netmask 255.255.255.0
    gateway 192.168.0.1

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 :

#
# 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;

option subnet-mask 255.255.255.0;
option broadcast-address 192.168.0.255;
option routers 192.168.0.1;
option domain-name-servers 192.168.0.1;

allow bootp;
allow booting;
next-server 192.168.0.100;
filename "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;
   range 192.168.0.10 192.168.0.90;
}

Redémarrer le service :

service isc-dhcp-server restart

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 :

service tftpd-hpa restart

Création du menu au démarrage

Copier le fichier /usr/lib/PXELINUX/pxelinux.0 sous /srv/tftp/ et créer le dossier /srv/tftp/pxelinux.cfg :

cp /usr/lib/PXELINUX/pxelinux.0 /srv/tftp/
mkdir /srv/tftp/pxelinux.cfg

Copier les modules nécessaires à l'affichage du menu de démarrage :

cp /usr/lib/syslinux/modules/bios/{menu.c32,vesamenu.c32,reboot.c32,chain.c32,libutil.c32,libcom32.c32,hdt.c32,ldlinux.c32,libgpl.c32,libmenu.c32,pxechn.c32} /srv/tftp/

Télécharger Memtest86+ :

wget -O /srv/tftp/memtest http://www.memtest.org/download/archives/5.31b/memtest86+-5.31b.bin

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

wget -O /srv/tftp/pci.ids http://pci-ids.ucw.cz/v2.2/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 netsystem/vmlinuz
    APPEND boot=live initrd=netsystem/initrd.img fetch=tftp://192.168.0.1/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/background.jpg
MENU BACKGROUND 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 Debian 8 Jessie - Installeur 64 bits
MENU LABEL
Change l'étiquette sur une entrée du menu.
MENU LABEL Debian 8 Jessie - Installeur 64 bits
TEXT HELP
Ajoute une description sur une entrée du menu.
TEXT HELP
    Installation de Debian 8 Jessie a partir du 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+

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

LABEL MEMTEST
    MENU LABEL Memtest86+
    KERNEL memtest
    APPEND -e

Option d'inventaire du matériel

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

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

Option de démarrage sur l'installeur Debian

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

wget -O /tmp/debian-netinstall-32.tgz http://ftp.nl.debian.org/debian/dists/stable/main/installer-i386/current/images/netboot/netboot.tar.gz
wget -O /tmp/debian-netinstall-64.tgz http://ftp.nl.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/netboot.tar.gz

Décompresser les archives téléchargées et copier les fichiers nécessaires dans l'arborescence du système de démarrage :

mkdir -p /srv/tftp/debian-32
mkdir -p /srv/tftp/debian-64
mkdir -p /tmp/debian-32
mkdir -p /tmp/debian-64
tar zxvf /tmp/debian-netinstall-32.tgz -C /tmp/debian-32
tar zxvf /tmp/debian-netinstall-64.tgz -C /tmp/debian-64
cp /tmp/debian-32/debian-installer/i386/{linux,initrd.gz} /srv/tftp/debian-32
cp /tmp/debian-64/debian-installer/amd64/{linux,initrd.gz} /srv/tftp/debian-64

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

LABEL DEBIAN32
    MENU LABEL Installeur Debian 32 bits
    KERNEL debian-32/linux
    APPEND VGA=788 initrd=debian-32/initrd.gz --- quiet
    
LABEL DEBIAN64
    MENU LABEL Installeur Debian 64 bits
    KERNEL debian-64/linux
    APPEND VGA=788 initrd=debian-64/initrd.gz --- 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 depuis un miroir Xubuntu et copier son contenu dans le répertoire /srv/tftp/xubuntu-64 :

wget -O /tmp/xubuntu-64.iso http://cdimages.ubuntu.com/xubuntu/releases/22.04/release/xubuntu-22.04.1-desktop-amd64.iso
mount -o loop /tmp/xubuntu-64.iso /mnt
mkdir /srv/tftp/xubuntu
rsync -av /mnt/ /srv/tftp/xubuntu/

Installer le serveur NFS :

apt install nfs-kernel-server	

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

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

Recharger le service NFS :

service nfs-kernel-server reload

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

LABEL XUBUNTU-LIVE
    MENU LABEL Live Xubuntu
    KERNEL xubuntu/casper/vmlinuz
    APPEND boot=casper netboot=nfs nfsroot=192.168.0.1:/srv/tftp/xubuntu initrd=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 xubuntu/casper/vmlinuz
    APPEND boot=casper netboot=nfs nfsroot=192.168.0.1:/srv/tftp/xubuntu initrd=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 xubuntu/casper/vmlinuz
    APPEND boot=casper netboot=nfs nfsroot=192.168.0.1:/srv/tftp/xubuntu initrd=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 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 memtest
    APPEND -e
    TEXT HELP
    Effectuer un test de memoire. 
    ENDTEXT
    
LABEL HDT
    MENU LABEL Inventaire du materiel
    COM32 hdt.c32
    APPEND pciidc=pci.ids
    TEXT HELP
    Inventaire du materiel
    ENDTEXT

MENU SEPARATOR

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

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

LABEL XUBUNTU-LIVE
    MENU LABEL Live Xubuntu
    KERNEL xubuntu/casper/vmlinuz
    APPEND boot=casper netboot=nfs nfsroot=192.168.0.1:/srv/tftp/xubuntu initrd=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 xubuntu/casper/vmlinuz
    APPEND boot=casper netboot=nfs nfsroot=192.168.0.1:/srv/tftp/xubuntu initrd=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 xubuntu/casper/vmlinuz
    APPEND boot=casper netboot=nfs nfsroot=192.168.0.1:/srv/tftp/xubuntu initrd=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

Création du système client amorçable

Installer le paquet squashfs-tools :

apt -y install squashfs-tools

Connecter le disque dur du client sur le serveur. Pour la suite, nous considérerons que celui-ci est connecté sur /dev/sdb.

Monter la partition du système client :

mount /dev/sdb1 /mnt

Copier les fichiers vmlinuz et initrd.img vers /srv/tftp/netystem :

mkdir /srv/tftp/netsystem
cp /mnt/{initrd.img,vmlinuz} /srv/tftp/netsystem

Créer le système de fichiers squashfs :

mksquashfs /mnt /srv/tftp/netsystem/filesystem.squashfs -e boot

Démonter le disque du client :

umount /mnt

Déconnecter le disque dur du client.

Lancer le client PXE et tester.