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 20.04 et Debian 10.

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
deb http://security.debian.org/ stable/updates main contrib non-free
deb http://deb.debian.org/debian/ stable-updates main contrib non-free
deb http://deb.debian.org/debian/ stable-proposed-updates main contrib non-free
deb http://ftp.debian.org/debian stable-backports main contrib non-free

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 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é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

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/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/buster/main/installer-i386/current/images/netboot/netboot.tar.gz
wget -O /tmp/debian-netinstall-64.tgz http://ftp.nl.debian.org/debian/dists/buster/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/{initrd.gz,linux} /srv/tftp/debian-32
cp /tmp/debian-64/debian-installer/amd64/{initrd.gz,linux} /srv/tftp/debian-64

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

LABEL DEBIAN32
    MENU LABEL Debian 10 - Installeur 32 bits
    KERNEL debian-32/linux
    APPEND VGA=788 initrd=debian-32/initrd.gz --- quiet
    
LABEL DEBIAN64
    MENU LABEL Debian 10 - Installeur 64 bits
    KERNEL debian-64/linux
    APPEND VGA=788 initrd=debian-64/initrd.gz --- quiet

Option de démarrage sur l'installeur Ubuntu

Télécharger la derniere version de l'installeur Ubuntu netinstall qui permet d'intaller les différentes variantes d'Ubuntu :

wget -O /tmp/netboot-ubuntu.tar.gz http://archive.ubuntu.com/ubuntu/dists/focal/main/installer-amd64/current/legacy-images/netboot/netboot.tar.gz

Décompresser l'archive téléchargée :

tar -C /tmp -zxvf /tmp/netboot-ubuntu.tar.gz

Créer le dossier /srv/tftp/ubuntu-64 et y copier les fichiers initrd.gz et linux de l'archive décompressée.

mkdir /srv/tftp/ubuntu-64
cp /tmp/ubuntu-installer/amd64/{linux,initrd.gz} /srv/tftp/ubuntu-64/

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

LABEL UBUNTU
    MENU LABEL Ubuntu 20.04 - Installeur 64 bits
    KERNEL ubuntu-64/linux
    APPEND VGA=788 initrd=ubuntu-64/initrd.gz --- quiet

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 Debian 10 - Installeur 32 bits
    KERNEL debian-32/linux
    APPEND VGA=788 initrd=debian-32/initrd.gz --- quiet
    TEXT HELP
    Installation de Debian 8 Jessie a partir du reseau. 
    ENDTEXT
    
LABEL DEBIAN64
    MENU LABEL Debian 10 - Installeur 64 bits
    KERNEL debian-64/linux
    APPEND VGA=788 initrd=debian-64/initrd.gz --- quiet
    TEXT HELP
    Installation de Debian 8 Jessie a partir du reseau. 
    ENDTEXT


LABEL UBUNTU
    MENU LABEL Ubuntu 20.04 - Installeur 64 bits
    KERNEL ubuntu-64/linux
    APPEND VGA=788 initrd=ubuntu-64/initrd.gz --- quiet
    TEXT HELP
    Installation d'Ubuntu 15.10 a partir du reseau. 
    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.