Démarrage PXE avec Openwrt, Dnsmasq et FreeNAS

Ajourd’hui j’ai décidé de simplifier mon architecture réseau , je me sépare donc de mon serveur DHCP(dhcpd) et décide d’utiliser celui de mon routeur sous OpenWRT. Il y a tout de même un petit couac : mon vieux serveur me permettait de démarrer en PXE pour différentes architectures x86 : efi, efi64 et Bios.

Si la configuration du PXE sous dhcpd est très documenté, avec dnsmasq c’est pas vraiment le cas. Je vous livre ici le résultat de mes recherche avec un exemple qui fonctionne très bien.

Ce que j’ai

J’ai un routeur TPLink sous OpenWRT et un serveur Freenas qui fournit des services SMB, NFS et TFTP. FreeNAS et déjà configuré et fonctionnel puisque je l’utilisait déjà avec mon serveur DHCP.

Le démarrage PXE est assuré par iPXE. Le tout doit me permettre de démarrer des machines via le réseau soit pour installer des Windows, soit cloner / restaurer des machines avec Clonezilla ou encore dépanner / récupérer des données avec SysrecueCD. Las machines clientes sur lesquelles j’interviens vont du vieux portable en Core Duo à l’ordinateur fixe en Core i7 en passant par des Mac (bon je triche, là iPXE démarre depuis une clé USB : pas de vrai PXE possible).

Voilà un schéma de ce que je veux :

img

Sur mon FreeNAS, TFTP est activé, les fichiers sont rangés comme ceci :

  • tftp/efi
    • ipxe.efi : le chargeur de démarrage ipxe en mode efi64
    • ipxe_32.efi : le chargeur de démarrage ipxe en mode EFI 32 bits, ce n’est pas très utile normalement mais il arrive encore de trouver des machines efi32 … tftp/bios
    • ipxe.pxe : le chargeur de démarrage ipxe en mode Bios /tftp/c
    • boot.ipxe : le fichier de configuration contenant le menu qu’ipxe appelle lorsqu’il démarre.

configuration du routeur

J’ai donc besoin de configurer dnsmasq sur le routeur pour lui permettre de choisir le bon fichier de démarrage par le réseau en fonction de ma machine cliente.

Je me connecte sont en SSH sur mon routeur, puis j’édite le fichier /etc/dnsmasq.conf comme ci dessous :

# mach arch type for proper pxe Boot
dhcp-match=bios,option:client-arch, 0 
dhcp-match=efi32,option:client-arch, 6  
dhcp-match=efix64,option:client-arch, 7
dhcp-match=efix64,option:client-arch, 9

#Special case : iPXE boot
dhcp-match=ipxe,option:user-class,iPXE                  

# Boot now!                                             
dhcp-boot=tag:bios,bios/ipxe.pxe,srvtech,192.168.10.250 
dhcp-boot=tag:efix32,efi/ipxe.efi,srvtech,192.168.10.250
dhcp-boot=tag:efix64,efi/ipxe.efi,srvtech,192.168.10.250
dhcp-boot=tag:ipxe,c/boot.ipxe,srvtech,192.168.10.250

Le principe est très simple, on colle une étiquette en fonction de l’architecture du client avec l’option dhcp-match. La syntaxe est dhcp-match=tag:[étiquette],option:[option_a_comparer],[valeur_a_comparer].

Cette étiquette servira ensuite au dhcp d’envoyer à la machine client le bon ordre de récupération du fichier de démarrage avec l’option dhcp-boot avec comme syntaxe dhcp-boot=tag:[étiquette],[fichier_de_demarrage],[nom_du_serveur],[adresse_du_serveur].

Étant donné qu’iPXE vient chercher son fichier de configuration lui aussi en mode PXE, notre serveur DCHP attribue à sa demande une étiquette spéciale afin qu’il récupère convenablement celui-ci.

Il suffit ensuite de redémarrer le service dnsmasq avec la commande /etc/init.d/dnsmasq restart.

Il suffit maintenant de tester un démarrage par le réseau mais attention, pensez a désactiver le Secure Boot dans les paramétrages de l’EFI sur vos machines clientes…