PXE : Y a-t-il un bootloader sur l’réseau ?

Graph du réseauComment installer un OS sur une machine sans lecteur CD et sans clé USB ? Comment utiliser le même nunux quelque soit votre PC sur votre réseau ? Comment avoir votre nunux de secours pour dépanner les machines de votre réseau ? C’est simple, le Preboot eXecution Environment est une technique permettant de booter une machine par le réseau.
On pourrait simplifier la chose en disant qu’il s’agit d’une sorte de grub téléchargé et exécuté par le réseau.

Pour démarrer une machine sur le réseau, il faut tout d’abord que son bios supporte cette technologie (c’est le cas de la plupart des machines modernes). Il faut ensuite un serveur DHCP et un serveur TFTP configurés pour fournir un bail spécial ainsi que les fichiers nécessaires au boot. Cet article couvre donc la mise en place d’un système basique. On abordera ensuite le côté esthétique par un petit coup de maquillage, ensuite on ajoutera quelques fonctions parfois utiles et enfin la mise en place d’un système complètement diskless.

Récupération du matos

La grande majorité des serveurs DHCP est à même de faire tourner un PXE. J’aborderai ici Dnsmasq qui a l’avantage d’être très léger et de pouvoir faire office de serveur DNS et TFTP. Nous n’aurons donc qu’un seul et unique serveur pour tout faire.
USE="dhcp tftp" emerge dnsmasq
Il vous faudra également syslinux pour récupérer les précieux fichiers de boot ainsi que quelques petits utilitaires bonus.
Vous trouverez la dernière version sur le très sérieux site de kernel.org:

http://www.kernel.org/pub/linux/utils/boot/syslinux/

Il ne manque plus que la distribution à booter et son kernel. Tout dépendra de ce que vous voulez proposer. Ici on va monter un installeur Debian :
wget ftp://ftp.fr.debian.org/debian/dists/lenny/main/installer-i386/current/images/netboot/debian-installer/i386/linux /var/tftp/distros/debian/lenny/i386/linux
wget ftp://ftp.fr.debian.org/debian/dists/lenny/main/installer-i386/current/images/netboot/debian-installer/i386/initrd.gz /var/tftp/distros/debian/lenny/i386/initrd.gz
wget ftp://ftp.fr.debian.org/debian/dists/etch/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux /var/tftp/distros/debian/lenny/amd64/linux
wget ftp://ftp.fr.debian.org/debian/dists/etch/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz /var/tftp/distros/debian/lenny/amd64/initrd.gz

Configuration du serveur

Je n’aborderai pas la configuration complète de Dnsmasq, uniquement les parties relatives à notre objecif.

/etc/dnsmasq.conf
dhcp-boot=pxelinux.0
enable-tftp
tftp-root=/var/tftp

La première ligne fournit le nom du fichier de PXE, la seconde active le tftp et la troisième déclare le dossier qui sera la racine de notre TFTP. Ça suffit pour obtenir le fonctionnement désiré. Relancez Dnsmasq, désormais on n’y touchera plus.

Mise en place basique

Commençons par créer la racine du tftp et récupérer le fameux pxelinux.0
# mkdir /var/tftp/pxelinux.cfg
# tar xvf syslinux-3.81.tar.gz
# cp syslinux-3.81/core/pxelinux.0 /var/tftp/

Créons maintenant un petit menu tout simple :
/var/tftp/menu.txt
-: PXE BOOT :-

lenny_i386_installer
lenny_i386_expert
lenny_amd64_installer
lenny_amd64_expert

C’est ce menu qui s’affichera. C’est moche mais efficace. Il faut créer le fichier de configuration associé :
/var/tftp/pxelinux.cfg/default
DISPLAY menu.txt

DEFAULT lenny_i386_installer

LABEL lenny_i386_installer
kernel distros/debian/lenny/i386/linux
append vga=normal initrd=debian/lenny/i386/initrd.gz

LABEL lenny_i386_expert
kernel distros/debian/lenny/i386/linux
append priority=low vga=normal initrd=debian/lenny/i386/initrd.gz

LABEL lenny_amd64_linux
kernel distros/debian/lenny/amd64/linux
append vga=normal initrd=debian/lenny/amd64/initrd.gz

LABEL lenny_amd64_expert
kernel distros/debian/lenny/amd64/linux
append priority=low vga=normal initrd=debian/lenny/amd64/initrd.gz

PROMPT 1
TIMEOUT 0
Vous avez maintenant un PXE tout ce qu’il y a de plus simple. C’est assez brut mais ça fonctionne. Maintenant vous pouvez tester. La machine se verra attribé sa config réseau et vous devriez voir s’afficher le contenu de votre boot.txt . Vous n’aurez plus qu’à taper le « label » désiré pour lancer le boot.

Maquillage

Bon c’est bien gentil mais d’une part c’est moche et d’autre part c’est pas vraiment super pratique. On va donc faire un menu ressemblant à un bon vieux GRUB.
Tout d’abord on va tenter de faire les trucs proprement donc on va créer un petit dossier /var/tftp/tools qui contiendra les petits binaires et un autre /var/tftp/menu pour les menus.

On a donc cette arborescence :
/var/tftp
/distros

/menu
/tools
/pxelinux.0
/pxelinux.cfg
/default

Il faut récupérer le binaire permettant de faire afficher un beau menu. Celui-ci se trouve dans syslinux.
# cp syslinux-3.81/com32/menu/vesamenu.c32 /var/tftp/tools
Il nous faut maintenant modifier le fichier pxelinux.cfg/default pour utiliser ce binaire et faire un truc plus classe :
DEFAULT tools/vesamenu.c32 menu/design.conf ~

MENU TITLE Mon PXE

LABEL Lenny I386
MENU LABEL Installer Lenny I386
KERNEL distros/debian/lenny/i386/linux
APPEND vga=normal initrd=distros/debian/lenny/i386/initrd.gz

LABEL Lenny I386 Expert
MENU LABEL Installer Lenny I386 en mode Expert
KERNEL distros/debian/lenny/i386/linux
APPEND priority=low vga=normal initrd=distros/debian/lenny/i386/initrd.gz

LABEL Lenny amd64 linux
MENU LABEL Installer Lenny AMD64
KERNEL distros/debian/lenny/amd64/linux
APPEND vga=normal initrd=distros/debian/lenny/amd64/initrd.gz

LABEL Lenny amd64 expert
MENU LABEL Installer Lenny AMD64 en mode Expert
KERNEL distros/debian/lenny/amd64/linux
APPEND priority=low vga=normal initrd=distros/debian/lenny/amd64/initrd.gz

TIMEOUT 0
La première ligne appelle le binaire en lui fournissant en argument le fichier design.conf que l’on va créer de ce pas.
/var/tftp/menu/design.conf
MENU WIDTH 80
MENU MARGIN 10
MENU ROWS 12
MENU TABMSGROW 18
MENU CMDLINEROW 12
MENU ENDROW 24
MENU TIMEOUTROW 20
MENU PASSWORDMARGIN 3
MENU PASSWORDROW 11

menu background menu/background.png
L’image de background doit être en png 24bits en 640*480 ce qui laisse pas mal de choix de fond d’écran.

Vous pouvez maintenant tester votre nouveau PXE tout en couleurs et bien plus fonctionnel. Vous avez maintenant un PXE ressemblant à un bon petit grub.

Ajouts de nouvelles fonctions

Il est possible d’ajouter quelques fonctionnalités bien pratiques comme par exemple le fameux Memtest permettant de tester ses barettes de RAM ou bien ajouter HDT qui vous permettra d’obtenir de nombreuses informations concernant la machine sans même booter un OS.

Un sous-menu

Pour créer un sous-menu, il suffit de refaire appel à vesamenu.c32 et lui indiquer un autre fichier de conf :
/var/tftp/pxelinux.cfg/default
LABEL Outils systèmes
MENU LABEL Outils systèmes >>
KERNEL tools/vesamenu.c32
APPEND menu/design.conf menu/systemes.conf

/var/tftp/menu/systemes.conf
MENU TITLE Outils Systèmes

LABEL retour_menu
MENU LABEL <- Retour menu principal
KERNEL tools/vesamenu.c32
APPEND menu/design.conf ~

LABEL
Le ~ correspond au menu par défaut.

MemTest

On le récupère
# wget http://www.memtest.org/download/4.00/memtest86+-4.00.bin.gz
tar xvf memtest86+-4.00.bin.gz
# cp memtest86+-4.00/precomp.bin /var/tftp/tools/memtest

/var/tftp/menu/systemes.conf
LABEL memtest
MENU LABEL ^MemTest 4.0
KERNEL tools/memtest

Et voilà MemTest est désormais intégré.

HDT

HDT fait partie de syslinux donc il faut le récupérer :
# cp syslinux-3.81/com32/hdt/hdt.c32 /var/tftp/tools
Il faut récupérer le fichier pci.ids qui se trouve sur sourceforge et le placer dans notre dossier /var/tftp/tools et enfin récupérer le fichier /lib/modules/`uname -r`/modules.pcimap à copier dans le même dossier.
Maintenant que tout est en place éditons, le fameux
/var/tftp/menu/systemes.conf
LABEL HDT
MENU LABEL ^Hardware Detection Test
KERNEL tools/hdt.c32
APPEND modules=tools/modules.pcimap pciids=tools/pci.ids memtest=tools/memtest

Et voili voilou

Reboot

Une petite option pour reboot pour le fun :
# cp syslinux-3.81/com32/modules/reboot.c32 /var/tftp/tools/reboot.c32

/var/tftp/menu/systemes.conf
LABEL reboot
MENU LABEL ^Reboot
KERNEL tools/reboot.c32

Boot Local

Ajoutons une option pour tout de même booter sur son disque dur.
# cp syslinux-3.81/com32/samples/localboot.c32 /var/tftp/tools/localboot.c32

/var/tftp/menu/systemes.conf
LABEL LocalBoot
MENU LABEL ^Boot Local
KERNEL tools/localboot.c32

On a au final ces deux écrans :

PXE main menu

Image du menu principale


Menu des fonctionnalités

Menu des fonctionnalités

Et maintenant que nous avons un PXE fonctionnel, pratique et regardable passons au choses sérieuses : un vrai linux par le réseau.

Du diskless par distribution « live »

Concrètement qu’est-ce qu’il nous manque pour avoir du vrai diskless et non juste un installeur ? Il nous faut un kernel qui puisse récupérer son root (pas l’utilisateur mais son système de fichier) soit par le réseau soit par un initrd. Je vais commencer par la seconde possibilité avec Tiny Core Linux. Ce qu’on va faire c’est booter un kernel et lui fournir un initrd qui lui servira de racine. Les changements ne seront pas conservés après reboot, comme une distribution sur LiveCD.

On va donc faire ce système avec Tiny Core Linux. Il s’agit d’une toute petite distro avec interface graphique qui tient dans 10 Mo. Ça se récupère ici. Et ça s’intègre en moins de deux sur votre PXE. Mettez le bzImage et le tinycore.gz dans (par exemple) /var/tftp/distros/tinycore et ajoutez ces quelques lignes à votre menu :
LABEL Tiny_Core_Linux
MENU LABEL Tiny Core Linux
KERNEL distros/tinycore/bzImage
APPEND initrd=distros/tinycore/tinycore.gz max_loop=256

Et c’est bootable. Cette distrib est pratique quand on veux un shell vite fait. C’est juste dommage de ne pas avoir de client SSH pré-installé mais c’est une autre histoire.

Un linux vrai de vrai avec root en nfs

Maintenant au lieu de se limiter à un kernel et un initrd, on va fournir l’arborescence complète. En fait la racine sera un export NFS. Le système sera donc utilisable comme un nunux classique. Mieux encore, vous pourrez l’utiliser sur plusieurs PC (non simultanément). Allez c’est parti pour se monter une petite Debian en mois de deux.

D’abord on installe les paquets nécessaires :
# emerge debootstrap nfs-utils
Debootstrap est un script recréant une debian (ou ubuntu) à partir d’un miroir. Si vous voulez monter une autre distrib, pas la peine de le prendre. Nfs-utils apporte quelques outils pour la mise en place du serveur NFS. Il faut que votre kernel possède le module nfs-server.

Maintenant créons la Debian de toute pièce :
# mkdir /var/exports/debian/lenny
# debootstrap lenny /var/exports/debian/lenny

Après une pause bien méritée, noyautons cette petite. Soit vous vous faites votre kernel aux petits oignons, soit vous prenez celui de la Debian qu’il faudra installer par chroot. Bien évidemment, le mieux est de le compiler soi-même en n’oubliant surtout pas filesystems/network file systems/root filesystems on nfs. vous placerez ce kernel non pas dans l’export NFS (enfin ce n’est pas indispensable) mais dans le tftp /var/tftp/distros/debian/kernel_perso.

Créez l’export NFS dans le fichier
/etc/exports
/var/exports/debian/lenny 10.0.0.0/8(rw,async,no_subtree_check,no_root_squash,no_all_squash)

Donc là je déclare tout le dossier contenant la lenny visible pour tout mon réseau local (en 10/8) avec des droits de lecture/écriture.
Il ne reste plus qu’à ajouter une entrée dans le menu du PXE.
LABEL Debian
MENU LABEL Debian NFS
KERNEL distros/debian/kernel_perso
APPEND ip=dhcp root=/dev/nfs nfsroot=10.0.0.1:/var/exports/debian/lenny

Et il ne reste plus qu’à booter et rebooter !

What else ?

Bon voilà vous avez vu comment monter votre joli PXE. Vous pouvez donc installer ure distrib sur ce petit EeePC sans lecteur CD. Vous pouvez réparer ce grub que vous venez de dégommer sans sortir votre clé USB bootable. Pour aller plus loin, sachez qu’il est possible par mesure de sécurité (ou commodité) de proposer un PXE différent pour chaque machine en fonction de sa MAC.

Vus : 2186
Publié par Geekfault : 45