PXE avec PXELINUX

Comment mettre en place un service PXE, comment partager une image de disquette bootable, comment charger un linux à distance.

Pour qu'un service PXE fonctionne, il faut :

  • un serveur TFTP
  • un serveur DHCP, qui donne en plus l'adresse du serveur TFTP
  • un logiciel capable de fournir un menu de boot
  • des clients qui boot en PXE

Configuration DHCP

Le serveur DHCP distribue les adresses réseaux aux clients : il fournit l'adresse du client, l'adresse de la passerelle et du serveur de noms. Il peut donner d'autres informations aux clients, en l'occurrence on veut qu'il donne l'adresse du serveur TFTP et le nom du fichier que le client devra télécharger. Il suffit d'ajouter à la configuration du serveur les options suivantes :

filename "pxelinux.0";
server-name "192.168.0.2";

Dans notre exemple le serveur TFTP aura l'IP 192.168.0.2.

Installation du serveur TFTP

Les serveur TFTP fourni les fichiers nécesaires aux clients pour demarrer un OS (par exemple le noyau et l'initrd pour linux). Il fourni également un petit executable qui sera chargé par la carte réseau afin d'initier l'environnement avant le demarrage de l'OS. Le partage par TFTP est très simple (voir trivial :), il suffit d'indiquer le répertoire à partager à l'installation :

apt-get install atftpd

Ensuite on choisi le répertoire /tftpboot. Généralement ce répertoire n'existe pas, il suffit de le créer, cependant on peut le mettre où l'on souhaite et jouer avec les liens symboliques...

mkdir /tftpboot

Pour information la configuration de atftpd se trouve dans /etc/default/atftpd.

PXELINUX

L'éxécutable qui sera téléchargé par les clients se nomme pxelinux.0, c'est un petit programme qui va lire un fichier de configuration, puis afficher un prompt pour que l'utilisateur choisisse son OS. Ce programme fait partie du projet SYSLINUX.

Il suffit de télécharger SYSLINUXi, l'archive contient les sources et les executables. Il suffit d'aller piocher les executables nécessaires à ce que l'on souhaite faire. En l'occurence on a juste besoin de pxelinux.0 qu'on copiera dans /tftpboot.

La configuration de PXELINUX est très souple : il est possible d'avoir un menu de boot différent pour chaque machine ou groupe de machine en fonction de leur adresse MAC, IP ou classe d'adresse IP. Mais nous nous contenterons d'un menu unique.

L'executable ira chercher inconditionnellement sa configuration dans le répertoire pxelinux.cfg (à créer sous /tftpboot). Le fichier par défaut se nomme default ; pour tester on peut y mettre :

LABEL local
  localboot 0
LABEL linux
  kernel vmlinuz
  append initrd=initrd.gz

Cela permet de booter en local, et sur un linux au cas où l'on a un noyau linux qui traîne avec son initrd (juste pour tester).

MEMDISK

Un interêt de PXELINUX est de pouvoir booter des images de disquettes. Le logiciel Ghost (TM) permet de déployer des images de disque dur sur des machines par le réseau. Le démarrage des machines cibles se fait par disquettes, nous allons voir comment mettre ses disquettes sur le boot PXE.

Pour booter une image de disquette il faut un autre exécutable qui se trouve dans l'archive de SYSLINUX : memdisk. Il suffit de le copier à côté de pxelinux.0. Il faut également faire une image de la disquette qu'on veut booter, et de modifier le fichier de configuration :

LABEL ghost
  kernel memdisk
  append initrd=ghost/ghost288.IMA

Le paramètre kernel prend pour valeur l'exécutable memdisk et l'initrd l'image de la disquette (à la base c'est prévu pour Linux d'où le nom des paramètres).

Pour que ce soit vraiment utile il faut générer une disquette multicarte avec la console Ghost. Cela nécessite 2 disquettes, ensuite il faut utiliser WinImage (un shareware sous Windows) pour les joindre sur une image de disquette de 2.88 Mo.

  • Installer WinImage (version d'évaluation disponible)
  • Générer les 2 disquettes de boot (driver + ghost) à partir de la console Ghost
  • Ouvrir la première disquette (driver) avec WinImage
  • Enregistrer la première disquette au format ima sur le disque dur
  • Idem 2eme disquette
  • Ouvrir la première image et changer le format en 2.88 : menu "Image" -> "Change format" -> 2'88
  • Sauvegarder la disquette sous un autre nom
  • Ouvrir la deuxième image et extraire ghost.exe sur le disque dur
  • Copier (glisser/déposser) le fichier ghost.exe dans le répertoire ghost de la disquette 2'88
  • Extraire les fichiers autoexec.bat et config.sys
  • Modifier autoexec.bat : après echo chargement taper goto GHOSTFND
  • Modifier config.sys : ne laisser que la section [COMMON], retirer tout ce qui est au dessus
  • Supprimer les fichier autoexec.bat et config.sys de la disquette
  • Injecter les fichiers modifiés
  • Sauvegarder la disquette

L'image finale est une disquette au format 2.88Mo bootable, qui peut être utilisé avec un serveur PXE.

Menu

Une fois qu'on a plein d'option, on se rend compte que c'est long de taper le nom de l'image qu'on veut booter, qu'à cela ne tienne, on va mettre un menu. Dans l'archive de SYSLINUX se trouve un exécutable nommé menu.c32 qui dote PXELINUX d'un menu graphique utilisable avec les flèches. On le copie à côté des autres et on modifie le fichier de configuration :

DEFAULT menu.c32
PROMPT 0
TIMEOUT 100
NOESCAPE 1

MENU SHIFTKEY 1
MENU TITLE PXE Boot Menu en TEST

LABEL local
        MENU LABEL Local Boot
        MENU DEFAULT
        localboot 0

LABEL b
        MENU LABEL Ubuntu NFS
        kernel vmlinuz
        append boot=caspernfs initrd=initrd.gz ramdisk_size=1048576
        root=/dev/ram nfsroot=172.16.20.12:/tftpboot/fs/ rw 
        debian-installer/locale=fr kbd-chooser/method=fr-latin9 --

LABEL ghost
        MENU LABEL Ghost
        kernel memdisk
        append initrd=ghost/ghost288.IMA

Il faut ajouter en haut du fichier l'appel à menu.c32, puis pour chaque LABEL on ajoute un MENU LABEL qui sera affiché à l'écran. Pour de plus amples informations il faut consulter la documentation de SYSLINUX.

Protection par mot de passe

L'archive SYSLINUX contient un exécutable nommé sha1pass (c'est un script Perl) qui génère les mot de passe au bon format. Pour l'utiliser sous Debian il faut le module Perl qui va bien :

apt-get install libdigest-sha1-perl

Ensuite on exécute la commande avec le mot de passe en paramètre et il nous donne la chaîne à coller dans le fichier de configuration. Par exemple pour protéger Ghost :

LABEL ghost
        MENU LABEL Ghost
        MENU PASSWD $4$jfoBirJg$rSDbzznCZtmJAES9RH/lC92/3Rs$
        kernel memdisk
        append initrd=ghost/ghost288.IMA

Passer le clavier en français

Par défaut le clavier est en qwerty, pour avoir l'azerty il faut copier le fichier fr.kbd (trouvable sur toute bonne distribution LiveCD) à côté de pxelinux.0. La configuration est à adapter, il faut ajouter la ligne :

KBDMAP fr.kbd

Au cas où vous auriez du mal à trouver le fichier fr.kbd, en voici un qui fonctionne : fr.kbd