Si comme moi vous utilisez un routeur open source avec le firmware TomatoUSB, c'est pour profiter de fonctionnalités non présentes dans les box et routeurs grand public.
Aujourd'hui je vous propose d'activer PXE, dans le but d'utiliser plus tard PXELINUX avec un NAS Synology.
Chacun son rôle
Le routeur Tomato est en charge de la distribution des IP sur mon réseau, il fait donc office de serveur DHCP. Lorsqu'une machine démarre sur le réseau à l'aide de PXE la première chose qu'elle reçoit c'est sa configuration IP ainsi que les différentes options associées.
Nous devons ajouter deux options DHCP présentes dans les RFC2132 :
- option 66 "Server-Name" : l'IP du serveur TFTP
- option 67 "Bootfile-Name" : le nom du fichier de boot (avec son chemin s'il n'est pas à la racine)
Le serveur TFTP sera assuré par un NAS Synology et un second billet y sera consacré, je ne m'attarde pas dessus. Ce NAS doit disposer d'une adresse IP fixe ou pseudo-statique car il est assimilable à un serveur et on ne met jamais de DHCP sur un serveur.
Les fichiers de boot seront donc stockés sur le NAS Synology et nous utilisons PXELINUX. Le fichier pxelinux.0 est déposé à la racine du partage TFTP, quand c'est simple c'est bien.
Paramétrage de dnsmasq
C'est donc le paquet dnsmasq qui va se charger de diffuser les deux options DHCP qui nous intéressent, ça tombe bien car il est présent nativement.
Se rendre dans le menu Advanced > DHCP/DNS > Dnsmasq Custom Configuration et ajoutez :
### PXE configuration ### dhcp-boot=pxelinux.0,,192.168.0.12
- pxelinux.0 correspond au premier fichier appelé par la carte réseau (stocké sur le NAS)
- 192.168.0.12 correspond à l'IP du NAS
Attention : la double virgule ",," doit être présente, ce n'est pas une erreur
Faites Save, et c'est finit.
... et pour Linux ?
Si vous avez un serveur GNU/Linux faisant office de DHCP, voici les directives à placer dans dhcpd.conf
filename "pxelinux.0"; next-server 192.168.0.12;
Néanmoins vous pouvez tout de même utiliser dnsmasq si le coeur vous en dit, il faut simplement installer le package et la configuration sera alors identique à celle de mon routeur Tomato.
... et pour Windows Server ?
Si vous avez un serveur Windows faisant office de DHCP, aller dans dhcpmgmt.msc puis nom_serveur > IPv4 > étendue [x.x.x.x] > Options de serveur > clic droit > Configurer les options. Ajoutez les options 66 "nom d'hôte du serveur de démarrage" et 67 "nom du fichier de démarrage", puis relancez le service.
Et voilà, à vous les boot Acronis et PartedMagic direct depuis le LAN. Plus besoin d'empiler les CD ou clés USB bootables.
MàJ : j'ajoute cette documentation particulièrement instructive
Auteur : Mr Xhark
Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter
22 commentaires
Hello,
Sympa l'article, 2 petites questions cependant :
-Pourquoi ne jamais mettre de DHCP sur un serveur ?
- dnsmasq permet un mode proxy " The PXE support is full featured, and includes a proxy mode which supplies PXE information to clients whilst DHCP address allocation is done by another server. ". Ça ne devrait pas gêner du coup ?
@fmr: un serveur délivre un service (dns, fichier, web, etc). Mettre du dhcp c'est simplement du suicide. Zones dns, ip reverse, clé ssh, log, cache... et surtout ça n'a aucun intérêt, sinon celui d'économiser 30 secondes pour définir l'IP, que ce soit sous Windows ou GNU/Linux. Une IP fixe par serveur, dans l'idéal dans une plage différente de la plage dhcp.
Concernant le mode proxy dont tu parles, je me suis documenté, je pense que c'est quand tu as un serveur DHCP et un serveur PXE sur deux machines différentes, je doute que ce ne soit ton cas 😉
Je suis adepte de PXE depuis des années.
Je substitue IPXE (http://ipxe.org/) à PXE : cela permet notamment d'utiliser HTTP à la place de TFTP très lent et d'utiliser les scripts
A partir d'IPXE, via un menu je peux utiliser pxelinux (pour le monde Linux) ou WIMBOOT (http://ipxe.org/howto/winpe) pour les images Windows PE le tout à la vitesse de l'éclair grâce au protocole HTTP.
Il faut utiliser lpxelinux.0 et non pxelinux.0 pour le support natif des transferts FTP et HTTP
Pour mon installation, je me suis inspiré de l'exemple : https://gist.github.com/robinsmidsrod/2234639
@boubou1964: je me suis intéressé un peu à IPXE (la suite de gPXE) mais je n'ai pas trouvé de tuto clair... c'est assez le bordel. Premièrement il faut un serveur web si j'ai bien compris ? Dans l'idée j'aimerai booter un iso direct via NFS et il me semble que IPXE le peut, tu confirmes ?
Oui TFTP est lent, je l'utilise donc avec des outils de max 300 mo sinon... trop long.
@Mr Xhark:
Oui d'accord pour la doc c'est un peu le bordel : je viens essayer de rédiger un tuto clair dès que j'aurai un moment de libre.
J'utilise le serveur TFTP et le serveur Web du Synology
Je confirme également le support de HTTPS et NFS dans iPXE
On peut utiliser le site https://rom-o-matic.eu/ pour créer le fichier bootstrap d'iPXE, j'ai choisi :
- advanced, for experienced user
- output format : PXE bootstrap loader keep method 1
- NIC Type : UNDIONLY
- choisir les différents protocoles supportés
Ensuite copier le fichier kpxe obtenu dans le répertoire racine du serveur TFTP du Synology (chez moi /volume1/opt/tftpboot)
Dans mon fichier DNSMASQ (Routeur ASUS RT-N66U), j'ai rajouté les lignes :
(ça devrait marcher avec NFS)
Cela permet de charger iPXE puis de lancer le script qui permettra de presenter un menu pour lancer lpxelinux.0 ou WIMBOOT
@boubou1964: avec plaisir, d'ailleurs si tu veux rédiger le billet en tant qu'invité t'es le bienvenue.
J'avais vu le site rom-o-matic.eu mais j'ai pris peur quand j'ai vu le nombre d'options... le tout sans doc potable ! L'option dhcp-match dans ton cas elle sert à quoi, est-elle obligatoire ?
Quand j'aurai publié mon billet sur PXELINUX j'essaierai de le convertir en iPXE, mais j'aurai besoin de ton aide pour ça car bcp de questions !
Des options DHCP pour iPXE ont été ajoutées dans DNSMASQ :
Pour plus de détails, se référer à ce fil de discussion : http://forum.ipxe.org/showthread.php?tid=6077
@boubou1964: si j'ai bien compris, c'est dnsmasq qui envoie le tag 175 lorsqu'un client demande une IP (dhcprequest) pour ensuite envoyer le boot ipxe, on pourrait presque s'en passer si tout le réseau est censé booter sur iPXE.
Par contre quelle est la différence entre :
et :
net, tag et "#" et "!" mais encore ?
Je pense que l'on taggue le client uniquement pour éviter de boucler sur le chargement du bootstrap
Le # ou le ! désigne le NOT ce qui signifie que si la requête DHCP ne provient pas d'iPXE, on charge iPXE
Le # et le :net sont l'ancienne syntaxe, le ! et le :tag la nouvelle syntaxe dans DNSMASQ
@boubou1964: de mon côté j'ai avancé, j'ai mis en place iPXE avec un chainage depuis PXELINUX. Par contre j'ai sorti le script du kpxe car je trouve ça bête de le figer. J'ai encore quelques bizarreries, impossible de mettre le fond d'écran par exemple, etc. Tout comme c'est long de tout recocher sur rom-o-matic, il n'existe pas un moyen de sauvegarder sa configuration (via get ou autre) sur ce site ?
Merci pour l'info sur le # et les ":" 🙂
Je n'utilise pas les scripts embarqués dans le noyau kpxe.
Un exemple de script simple pour charger lpxelinux :
Début du fichier default du répertoire pxelinux.cfg :
Pour le fond d'écran, utilise le module pxelinux vesamenu.c32
Attention aux dépendances entre modules http://www.syslinux.org/wiki/index.php/Library_modules#All_Syslinux_variants_need_an_additional_ldlinux_module
certains sont obligatoires comme ldlinux.c32
Pour rom-o-matic, je ne sais pas
Pour les tests, j'utilise une vmware --> http://ipxe.org/howto/vmware
@boubou1964: ce que je ne saisis pas, ton fichier .ipxe il est stocké où ?
Dans DNSMASQ pour booter direct sur iPXE j'ai :
bm.ipxe = mon script ipxe
Si au contraire je configure DNSMASQ pour tomber sur PXELINUX (comme je l'explique dans mon billet), alors je met dans /pxelinux.cfg/default :
J'ai tronqué le reste car c'est plus long (conf graphique etc).
Concernant le fond d'écran ça fonctionne bien dans PXELINUX, mais c'est sous iPXE que je n'y arrive pas, j'ai pourtant bien coché IMAGE_PNG, CONSOLE_VESAFB, CONSOLE_CMD,HTTP pour générer mon ipxe.lkrn, puis dans le script iPXE :
@Mr Xhark:
- TFTP ne sert que pour charger undionly.kpxe, pour le reste on fonctionne en HTTP (grace au stack iPXE, le stack PXE a été déchargé)
- Les scripts iPXE sont dans un répertoire de ton serveur web avec lpxelinux.0 , les modules, le répertoire pxelinux.cfg,etc. dans DNSMASQ tu devrais avoir :
- Je n'ai pas testé le fonds d'écran sur iPXE
- C'est quoi l'intérêt de passer de pxelinux à iPXE ?
Moi, je passe directement la main à un script iPXE qui m'aiguille vers le loader de mon choix pxelinux, WIMBOOT etc
@boubou1964: pour l'instant je n'ai pas de serveur HTTP sur mon réseau local, je ne voulais pas activer celui du synology juste pour ça, je sais que je pourrai stocker le fichier à l'extérieur mais je n'en voyais pas l'intérêt étant donné que le PXE est interne only.
Du coup j'ai à ma dispo: tftp et NFS, tous les deux hébergés sur le Synology.
Concernant pxelinux.0 effectivement je viens de le remplacer par lpxelinux.0 qui supporte HTTP et ça avance bien plus vite que TFTP, 20 secondes pour un ISO de 500mo :
(sauf que pmagic n'est pas prévu pour donc ensuite il ne boot pas à cause de vmalloc mais c'est pas le sujet)
Donc toi si j'ai bien compris tu utilises iPXE direct, avec la conf de pxelinux ? donc c'est totalement rétrocompatible ?
Comme j'ai du mal à personnaliser le menu iPXE et que mon menu pxelinux était finalisé je me suis dit que j'allais booter sur pxelinux pour les trucs light (memtest) et j'ai une entrée iPXE dans mon menu qui boot sur ipxe.krnl pour le boot NFS de gros fichiers ISO. Je ne sais pas si je suis très clair... ^^
@Mr Xhark:
Jusqu'à présent, j'utilisais lpxelinux à partir d'iPXE mais ce n'est pas forcément nécessaire...
Regarde ici http://labalec.fr/erwan/?p=1231, tu as de bons exemples de ce que tu peux faire directement depuis iPXE
J'ai réussi à utilisé un fond d'écran avec iPXE, dans ROM O MATIC, il faut cocher :
- IMAGE_PNG, PNG image support
- CONSOLE_CMD, Console command
- CONSOLE_VESAFB, VESA framebuffer console
Dans ton menu iPXE, tu ajoutes :
console --x 1024 --y 768
console --picture ${boot-url}ipxe.png --left 32 --right 32 --top 32 --bottom 48
attention à la résolution de l'image qui doit correspondre à ce que tu as définie dans console
Fonctionne en VM, mais le chargement de lpxelinux.0 plante en réel, pas de problème avec WIMBOOT
@boubou1964:
J'ai un peu avancé. J'ai modifié la rom de la carte réseau virtuelle de ma VM sous VirtualBox pour lui mettre iPXE nativement (car il y a un bug de dhcp sinon qui ralentit le process). Du coup je me suis aperçu que la VM ignore complètement le undionly.kpxe car elle estime qu'elle en dispose nativement... sauf que nativement il manque des modules par rapport au kpxe que j'ai crée sur rom-o-matic. J'ai mis un moment avant de comprendre le phénomène, avec des "sleep", etc.
Pour l'image c'est ce que j'avais mis et ça ne marchait pas, donc il faut que je rééssaie.
Je n'arrive pas à chainer iPXE vers PXELINUX, ça reste bloqué sur le boot "peter anvin" puis rien ensuite. Là encore, pas compris pourquoi.
Sinon sur rom-o-matic PXE support => je pense que ça doit assurer la compatibilité avec le menu "default" de pxelinux, à tester.
J'avais une question, je n'ai pas vu de doc sur les différents paramètres de génération du kpxe (method1, 2 et 3), tu sais à quoi ça correspond ? Quelle différence aussi entre undi et undionly ?
Pour finir, j'ai la franche impression que iPXE est clairement fait pour fonctionner en HTTP pour accéder à ses menus, le tftp c'est pas trop son truc, impossible de booter en NFS avec le kernel memedisk en tftp par ex :
@Mr Xhark:
L'option PXE support n'est pas très claire : peut-être le support de la pile PXE native ?
les différents paramètres de génération du kpxe et l'explication sur l'explication sur le pilote UNDI :
http://www.fogproject.org/wiki/index.php/IPXE#What_are_the_differences_between_the_different_PXE_files.3F
PXELINUX est parfois buggé, çà peut être aussi un problème du pilote UNDI de la carte réseau : il faut être persévérant
Et le HTTP çà pose un problème de sécurité ? Sinon pourquoi pas du NFS de bout en bout ?
Bon courage
@boubou1964: merci pour ta réponse, j'ai ouvert un topic sur le forum ipxe, il a l'air assez actif on verra ce que ça donne.
Si tu rédiges ton tuto n'hésites pas à venir poster l'URL ici 🙂
A propos de l'utilisation du dhcp sur des serveurs, il parait prématuré de dire que le gain de temps est négligeable face à "fiabilité" que cela apporte. Lorsqu'on gère un grand parc de machines et notamment installées automatiquement, attribuer manuellement une ip fixe à chaque serveur se révèle souvent très exigeant et mène à beaucoup d'erreur.
Le dhcp est un système conçu pour résoudre ces problèmes tout en apportant un certain nombre de garanties (notamment sur la durée des baux).
Un bon articule sur le sujet : http://brugidou.github.io/2013/07/28/dhcp-in-the-data-center/
@kamaradclimber: tu peux tout à fait faire en sorte d'utiliser un déploiement qui fixe l'IP de tes serveurs. Pour le PXE tu peux faire un VLAN dédié. Concernant le DHCP il faut faire attention car si quelqu'un allume un DHCP sur le réseau... alors tes serveurs vont récupérer la mauvaise IP, le temps de t'en apercevoir tout est down... les zones DNS sont foirées, etc.
Chacun a ses préférences, de mon côté c'est : aucun DHCP pour les serveurs et DHCP pour les desktop. Même avec quelques centaines de serveurs c'est tout à fait gérable (c'est mon cas).