15/05/2010

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.

  1. khemael
    | #1

    Et pour ceux qui cherchent la ptite bête qui les empeche de faire correctement un PXE LiveCD Gentoo, c’est par ici :

    http://blog.dastrup.com/?p=12

    A adapter car un peu vieillo.

  2. | #2

    wget ftp://machinblabla.com/truc -qO c’est mieux…sinon ça ne met pas le fichier au bon endroit 😉

  3. | #3

    encore une petite coquille :
    # 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

    on pourrait mettre une version à jour :
    # wget http://www.memtest.org/download/4.10/memtest86+-4.10.bin.gz
    et ceci n’est pas un tar
    gzip -d memtest86+-4.10.bin.gz && cp memtest86+-4.10.bin /var/tftp/tools/memtest

  4. | #4

    encore une petite coquille (désolé, le truc pour éditer ne fonctionne pas très bien…)
    reboot.c32 se trouve (dans la version à jour de syslinux -3.86-) dans syslinux-3.86/com32/modules/reboot.c32

  5. j0ck3r
    | #5

    Génial cet article ! Merci ^^

  6. | #6

    Encore un petit commentaire pour signaler que les manips sont exactement les même pour Ubuntu (étonnant non ?) en utilisant l’initrd.gz et le linux fournis par http://archive.ubuntu.com/ubuntu/dists/lucid/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64/ (pour Lucid Lynx AMD64, je vous laisse le soin de parcourir les répertoires pour les versions i386 et autres distribs)

    Prochaine étape : un PXE pour l’install de Windows ?

  7. | #7

    arghhh quel dommage de ne pas avoir continué le tuto sur la compilation des kernel pour le live nfs…
    je ne suis pas un expert de la compil, encore moins du debootstrap…je suis donc bloqué avec Tiny Core Linux…
    Une MAJ est-elle prévue ? (nb : j’ai remarqué que les suggestions de corrections que j’avais faites n’ont pas été intégrées au site)

  8. Lord
    | #8

    Sn4kY → merci j’ai corrigé pour le reboot.c32 . Par contre, il existe bien une version tarball de syslinux (j’ai pris l’habitude de les préférer).
    Concernant la compil du kernel c’est pas trop difficile, je te conseille ce tuto qui est prévu pour gentoo mais qui devrait passer comme sur des roulettes pour tout noyau nunux : http://www.gentoo.fr/install/configuration-noyau.htm . Il te faudra donc activer le support de root nfs dans les filesystems.
    Concernant Debootstrap, c’est encore plus simple puisqu’il s’agit en fait d’un script qui se charge de créer une arboressence debian ou ubuntu en téléchargeant sur internet tout ce qu’il faut :
    # debootstrap version_de_debian /endroit/ou/l’installer http://miroir.debian.que.tu.veux
    N’hésites pas si tu as encore des soucis (par irc serait plus simple).

  9. | #9

    @ Lord :
    je pense que je vais fortement m’inspirer du tuto pour rédiger le mien (avec des modifs particulières, notamment l’implémentation d’un apt-cacher)
    je mettrai bien sur en source geekfault.

  10. | #10

    OK, je crois que je viens de capter, en fait l’export NFS du debootstrap et le “kernel_perso” que tu décrit ici n’ont rien à voir…J’avais compris qu’on obtenait le “kernel_perso” en compilant je ne sais quoi a partir de debootstrap…d’où mon incompréhension…
    mais ayé, j’ai capté. effectivement, c’est mieux de se refaire un petit noyaux, aux oignons :)

  11. | #11

    Hop hop ! encore un petit feedback, vu que j’ai bien galéré, je vous en fait profiter.
    Pour pouvoir activer THE option “Root File system on NFS” vous devez au préalable activer DHCP et BOOTP (tant qu’à faire) dans “Networking” —> “Networking Options” —> “IP: Kernel level autoconfiguration”
    ensuite ça semble OK, (je pense que le module pour la carte réseau de mon eeePC 900 n’est pas intégré)

  1. | #1
  2. | #2