BOOT PXE LINUX COMPLET
Principe
Un serveur PXE permet à un ordinateur de démarrer depuis le réseau en récupérant une image qui se trouve sur un serveur. Le démarrage PXE, appelé amorce PXE, s’effectue en trois étapes :
- Récupération d’une adresse IP sur un serveur DHCP. Par le biais du protocole DHCP, le fichier à amorcer est également indiqué à la machine.
- Téléchargement du fichier à amorcer depuis un serveur Trivial FTP (TFTP).
- Exécution du fichier à amorcer.
Le fichier d’amorçage peut ensuite lancer le démarrage d’un installateur, présenter un menu de choix pour l’utilisateur, récupérer des fichiers distants…
Présentation du système mis en place
Notre serveur PXE fonctionne avec les éléments suivants :
- dnsmasq : logiciel intégrant un serveur DNS (non utilisé ici), un serveur DHCP permettant de faire du PXE et un serveur TFTP. Le choix s’est porté sur ce logiciel car il permet de faire du proxy DHCP, qu’il est simple à configurer et qu’il intègre la plupart des outils nécessaires au serveur PXE.
Petite parenthèse : un proxy DHCP permet de fournir les éléments du protocole DHCP nécessaires au démarrage PXE sans être le serveur DHCP principal qui fournit les adresses IP. Cette fonctionnalité là était nécessaire car le routeur fournissant l’accès à internet pour l’atelier-soudé fait également office de serveur DHCP et nous ne voulions pas modifier sa configuration. De plus, le routeur est constamment démarré contrairement au serveur PXE.
- pxelinux : logiciel dérivé de Syslinux permettant le démarrage PXE depuis un serveur. L’utilisation des éléments de Syslinux permet ensuite de présenter un menu personnalisé à l’utilisateur, de charger des utilitaires ou de démarrer n’importe quel système d’exploitation.
- Un serveur NFS : système de partage de fichiers distant entre machine de type Unix. Il fournit les images disques de tous les systèmes d’exploitation (excepté Windows).
Le serveur est installé sur une machine sous Linux Mint car c’est ce que l’atelier-soudé avait en stock. Linux Mint est une distribution dérivée de Ubuntu, elle même dérivée de Debian. L’ensemble des commandes présentées dans ce billet et les suivants devraient donc être compatible avec tous les systèmes dérivés de Debian, Ubuntu compris. Et tout doit également fonctionner sur d’autres distributions GNU/Linux, moyennant quelques modifications simples au niveau des commandes du gestionnaire de paquet.
Notre serveur PXE est également capable de fournir à l’ordinateur le fichier d’amorçage correspondant à son système bas niveau : BIOS ou UEFI.
Structure des répertoires
Voici à quoi ressemble la structure des répertoires du serveur PXE après installation :
/srv/
|_ tftp/
| |_ boot/
| | |_ linux_mint/
| | | |_ cinammon/
| | | | |_ 32-bit
| | | | |_ 64-bit
| | | |_ MATE/
| | | | |_ 32-bit
| | | | |_ 64-bit
| | | |_ XFCE/
| | | | |_ 32-bit
| | | | |_ 64-bit
| | | |_ KDE/
| | | | |_ 32-bit
| | | | |_ 64-bit
| | |_ windows_10/
| | | |_ 32-bit
| | | |_ 64-bit
| | |_ windows_7
| | |_ windows_XP
| | |_ archlinux/
| | | |_ x86_64
| | |_ utilitaires
| | |_ ...
| |
| |_ bios/
| | |_ boot -> ../boot/
| | |_ pxelinux.cfg/
| | | |_ default
| | | |_ linux_mint.menu
| | | |_ windows.menu
| | | |_ autre.menu
| | | |_ utilitaires.menu
| | |_ pxelinux.0
| | |_ ldlinux.c32
| | |_ (bios)*.c32
| | |_ ...
| |
| |_ efi32/
| | |_ boot -> ../boot/
| | |_ pxelinux.cfg/
| | | |_ default
| | | |_ ...
| | |_ syslinux.efi
| | |_ ldlinux.e32
| | |_ (efi32)*.c32
| | |_ ...
| |
| |_ efi64/
| | |_ boot -> ../boot/
| | |_ pxelinux.cfg/
| | | |_ default
| | | |_ ...
| | |_ syslinux.efi
| | |_ ldlinux.e34
| | |_ (efi64)*.c32
| | |_ ...
|
|_ samba/
| |_ windows/
| | |_ windows_10/
| | | |_ 32-bit
| | | |_ 64-bit
| | |_ windows_7
| | |_ windows_XP
Maintenant que les principes généraux ont été expliqués, je vais rentrer dans la partie plus pratique : l’installation et la configuration du serveur.
Installation des paquets nécessaires :
sudo apt-get install syslinux syslinux-efi dnsmasq pxelinux
Réglage de l’adresse IP du serveur
Le serveur utilise une adresse IP fixe pour pouvoir être adressé par les machines sur le réseau. Ce réglage peut soit être effectué sur l’interface du routeur, soit directement sur le serveur. Dans ce dernier, bien choisir une adresse IP en dehors de la plage DHCP pour éviter une double attribution.
Pour le réglage sur le serveur, éditer le fichier /etc/networks/interfaces et ajouter les lignes suivantes :
sudo nano /etc/networks/interfaces
auto eth0
iface eth0 inet static
address 192.168.0.200
netmask 255.255.255.0
gateway 192.168.0.1
dns-nameservers 9.9.9.9
Le nom de l’interface réseau (ici eth0) est à adapter en fonction de votre machine. De même qu’il vous faudra peut-être adapter l’adresse IP ou celle du routeur (qui est parfois en 192.168.0.254).
Création de l’arborescence :
L’arborescence est présentée dans le premier billet si vous voulez avoir une vue d’ensemble 
- Création des répertoires.
sudo mkdir -p /srv/tftp/boot/
sudo mkdir -p /srv/tftp/bios/pxelinux.cfg/
sudo mkdir -p /srv/tftp/efi32/pxelinux.cfg/
sudo mkdir -p /srv/tftp/efi64/pxelinux.cfg/
- Création de liens symboliques vers le répertoire /srv/tftp/boot/ dans chacun des sous-répertoire dédiés à une architecture. De cette façon les images disque sont disponibles pour toutes les architectures sans être dupliquées.
cd /srv/tftp/bios && sudo ln -s ../boot boot
cd /srv/tftp/efi32 && sudo ln -s ../boot boot
cd /srv/tftp/efi64 && sudo ln -s ../boot boot
Préparation des répertoires :
Il s’agit maintenant de remplir les répertoires avec les fichiers syslinux correspondant au bon système d’amorçage.
- Partie BIOS
sudo ln -s /usr/lib/syslinux/modules/bios/* /srv/tftp/bios/
sudo ln -s /usr/lib/PXELINUX/pxelinux.0 /srv/tftp/bios/
- Partie EFI64
sudo ln -s /usr/lib/syslinux/modules/efi64/* /srv/tftp/efi64/
sudo ln -s /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /srv/tftp/efi64/
- Partie EFI32
sudo ln -s /usr/lib/syslinux/modules/efi32/* /srv/tftp/efi32/
sudo ln -s /usr/lib/SYSLINUX.EFI/efi32/syslinux.efi /srv/tftp/efi32/
Configuration de dnsmasq :
La configuration se fait en modifiant le fichier /etc/dnsmasq.conf (par exemple avec nano)
sudo nano /etc/dnsmasq.conf
Voici la configuration dnsmasq utilisée :
#=============================================================== # Configuration file for dnsmasq #=============================================================== # Disable DNS Server (DNS already provide by the router) port=0 # Enable DHCP logging log-dhcp # Respond to PXE requests for the specified network; # run as DHCP proxy dhcp-range=192.168.0.0,proxy,255.255.255.0 #Detect the client architecture dhcp-match=set:x86PC, option:client-arch, 0 #BIOS dhcp-match=set:UEFI32, option:client-arch, 6 #UEFI32 dhcp-match=set:UEFI64, option:client-arch, 7 #UEFI64 dhcp-match=set:UEFI64, option:client-arch, 9 #EBC ->use the same bootloader as UEFI64 # Load different PXE boot image depending on client architecture (when runing not as a proxy DHCP) dhcp-boot=tag:x86PC, bios/pxelinux dhcp-boot=tag:UEFI32, efi32/syslinux.efi dhcp-boot=tag:UEFI64, efi64/syslinux.efi # Load different PXE boot image depending on client architecture (when runing as a proxy DHCP) pxe-service=tag:x86PC, X86PC, "BIOS Network Boot", bios/pxelinux pxe-service=tag:UEFI32, BC_EFI, "UEFI32 Network Boot", efi32/syslinux.efi pxe-service=tag:UEFI64, X86-64_EFI, "UEFI64 Network Boot", efi64/syslinux.efi ## Activate TFTP and set the root directory enable-tftp tftp-root=/srv/tftp
Désactivation du DNS de dnsmasq :
Cette modification permet d’empêcher dnsmasq de se définir comme serveur DNS pour les machines démarrées via PXE. Cela permet d’utiliser le routeur comme serveur DNS, comme d’habitude.
sudo nano /etc/default/dnsmasq
DNSMASQ_EXCEPT=lo
Redémarrage du service dnsmasq
On termine en redémarrant le service dnsmasq pour prendre en compte les modifications.
sudo systemctl restart dnsmasq
Installation du serveur NFS
sudo apt install nfs-kernel-server
Configuration du serveur NFS:
sudo nano /etc/exports
Il faut ajouter la ligne suivante pour activer le partage sur le répertoire /srv/tftp/boot/.
/srv/tftp/boot 192.168.0.0/24(ro,async,no_root_squash,no_subtree_check)
Application des modifications :
sudo exportfs -rav
Configuration pxelinux
PXELinux charge automatiquement le fichier nommé « default » et situé dans le répertoire « pxelinux.cfg ». Si vous démarrez une machine BIOS, ce sera le fichier /srv/tftp/bios/pxelinux.cfg/default qui sera chargé et pour une machine UEFI64, ce sera le fichier /srv/tftp/efi64/pxelinux.cfg/default.
Sur notre serveur, nous utilisons ce fichier pour présenter à l’utilisateur un menu. Celui-ci liste tous les systèmes que nous avons mis en place.

Notre configuration est découpée en plusieurs fichiers regroupant les systèmes dans des catégories : linux mint, windows, utilitaires et autres systèmes. Nous utilisons également un fichier séparé pour la coloration et la mise en page, ainsi qu’une image de fond. Je vous ai mis en pièce jointe de ce billet de blog l’ensemble des fichiers de configuration que nous utilisons.
Attention ! Du fait que nous ayons abandonnés ce système pour nous tourner vers un serveur IPXE (billet explicatif ici), seuls les démarrages de Linux Mint et de ArchLinux ont été testés. Le chargement des isos de WinPE fonctionne également mais est particulièrement lent, du fait de l’utilisation du TFTP.
Préparation des images linux
Le kernel et le fichier d’initialisation de la RAM sont fournis par TFTP. Le reste des images disques GNU/Linux est envoyé par NFS afin d’augmenter la vitesse de transfert. De ce fait, il est nécessaire de décompresser les images disques et de changer les permissions pour qu’aussi bien le serveur TFTP que le serveur NFS puissent y accéder.
- Téléchargement de l’image disque par votre méthode favorite
- Décompression de l’image disque dans le répertoire adéquat. Exemple pour Linux Mint Cinammon 64-bit, avec l’iso dans le répertoire de téléchargement de l’utilisateur « user » :
cd /srv/tftp/boot/linux_mint/cinammon/64-bit/ && sudo 7z x /home/user/Downloads/limuxmint-18.3-cinammon-64bit.iso
- Changement des permissions
sudo chmod -R 775 /srv/tftp/boot/linux_mint/
Note : plutôt que de changer les permissions de manière bourrine comme montré au dessus, il est plus orthodoxe de créer un utilisateur pour chaque logiciel et un groupe commun. En attribuant les fichiers au groupe commun, tous peuvent donc fonctionner correctement et présenter les fichiers sans erreur.
Sources en vrac
Voici une liste de sources sur lesquels je me suis basé pour la mise en place du serveur. Cette liste n’est pas complète car je n’ai pas gardé trace de toutes mes lectures.
- https://manski.net/2016/09/pxe-server-on-existing-network-dhcp-proxy-on-ubuntu/
- https://www.it-connect.fr/installation-et-configuration-dun-serveur-pxe/
- https://blog.mister-muffin.de/2011/09/12/multiboot-live-systems-via-pxe/
- https://wiki.debian-fr.xyz/PXE_avec_support_EFI#Configuration_du_serveur_nfs
- https://wiki.archlinux.org/index.php/PXE
- https://wiki.archlinux.org/index.php/NFS
Comments on 'BOOT PXE LINUX COMPLET' (0)
Flux des commentaires