Title: Démarrage PXE avec Openwrt, Dnsmasq et FreeNAS
Date: 2016-03-09 15:14
Category: sysadmin
Tags: réseau, TFTP, OpenWRT, pl-fr
Status: published

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][l_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][l_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][l_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]({attach}images/plan_reseau.png)

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][l_secure-boot] dans les paramétrages de l'EFI sur
vos machines clientes...


[l_openwrt]:https://openwrt.org/
[l_ipxe]:http://ipxe.org/
[l_dnsmasq]:http://www.thekelleys.org.uk/dnsmasq/doc.html
[l_secure-boot]:https://fr.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface#Lancement_s.C3.A9curis.C3.A9_.28secure_boot.29
