Boot PXE

:!: ebauche de document, plus un reminder qu'un vrai howto pour le moment

Pourquoi ?

Le boot PXE a plein d'avantage : on peut boter a peu pres tout et n'importe quoi, sans lecteur CD, disquette ou disque dur et cela sur n'importe quelle machine pas trop vieille (qui supporte le boot PXE)

Installation du serveur de boot PXE

Configuration du serveur TFTP

Pour servir les images, il faut un serveur TFTP (Trivial File Transfert Protocol) J'utilise tftpd-hpa qui s'installe grace a la commande suivante :

apt-get install tftpd-hpa

Vous avez remarqué que le demon est par défaut désactivé, nous allons le configurer pour démarrer automatiquement

sous debian, le répertoire racine du tftpboot est /var/lib/tftpboot, mais nous utiliserons /tftpboot ici

Activer le démarrage automatique du démon :

sed -i -e 's/RUN_DAEMON="no"/RUN_DAEMON="yes"/'  /etc/default/tftpd-hpa

Changer le repertoire racine :

sed -i -e 's,OPTIONS="-l -s /var/lib/tftpboot",OPTIONS="-l -s /tftpboot",'  /etc/default/tftpd-hpa

Création du répertoire racine :

mkdir /tftpboot

Démarrage du service :

/etc/init.d/tftpd-hpa start

Configuration du serveur DHCP

Je ne vais pas reprendre ici toute la configuration, mais je vais lister les directives a ajouter par rapport a une configuration “normale” :

  • ajouter en global :
    # pour le boot reseau
    allow booting;
    allow bootp;
  • ajouter dans le subnet/shared-network/host de votre choix :
    #next-server is your network boot server
    next-server 192.168.1.40;
    filename "pxelinux.0";

ou “192.168.1.40” est l'IP de votre serveur tftp et “pxelinux.0” le fichier à télécharger. Vous pouvez bien sûr mixer les serveurs tftp et/ou les fichiers a télécharger en fonction des différents réseaux/machines. Vous pouvez également utiliser un nom DNS et non une IP.

Voici par exemple la déclaration complete d'un subnet et celle d'un hote utilisant une configuration différente de celle par défaut :

subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.150 192.168.1.200;
  option routers monrouteur.mondomaine.com;
  option domain-name "mondomaine.com mondomaine.org";
  option domain-name-servers ns.mondomaine.com, ns2.mondomaine.com;
  
  next-server pxeserver.mondomaine.com;
  filename "pxelinux.0";
}

[....]

host athlon2600 {
        hardware ethernet       ab:cd:ef:00:01:02;
        fixed-address           mamachine.mondomaine.com;
        filename "GEEXBOX/boot/pxelinux.0";
}

Mise en place de l'arborescence pour le boot PXE

L'ensemble des fichiers de boot PXE seront stockés dans le repertoire /tftpboot comme vu plus haut. Si tel n'etait pas le cas chez vous, il faudrait bien sur adapter les chemins dans la suite.

  • decompresser certains (ceux utiles dans notre cas) fichiers de l'archive, puis les copier en place :
    • cp core/pxelinux.0 /tftpboot/syslinux-3.84/
    • cp memdisk/memdisk /tftpboot/syslinux-3.84/
    • cp com32/menu/menu.c32 /tftpboot/syslinux-3.84/
  • Créer les répertoires suivants :
    • /tftpboot/img (contiendra les images de disquettes)
    • /tftpboot/pxelinux.cfg (contiendra la configuration)
    • /tftpboot/menuconf (contiendra la configuration d'éventuels sous-menus)
 mkdir /tftpboot/img /tftpboot/pxelinux.cfg /tftpboot/menuconf
  • Création des liens symboliques (pour faciliter les eventuelles mises a jour de syslinux) :
    cd /tftpboot/
    ln -s syslinux-3.84 syslinux
    ln -s syslinux/* /tftpboot/

Vous devriez avoir dans le repertoire /tftpboot quelque chose qui ressemble à :

# ls -l /tftpboot/
total 26876
drwxr-xr-x  2 root  root          4096 jan  7 00:16 img
lrwxrwxrwx  1 root  root            26 jan  6 23:47 memdisk -> syslinux/memdisk
lrwxrwxrwx  1 root  root            27 jan  6 23:47 menu.c32 -> syslinux/menu.c32
drwxr-xr-x  2 root  root          4096 jan  7 00:16 menuconf
lrwxrwxrwx  1 root  root            29 jan  6 23:47 pxelinux.0 -> syslinux/pxelinux.0
drwxr-xr-x  2 root  root          4096 jan  7 00:16 pxelinux.cfg
lrwxrwxrwx  1 root  root            13 jan  6 23:45 syslinux -> syslinux-3.84
drwxr-xr-x  2 root  root          4096 jan  7 00:15 syslinux-3.84
Les chemins des liens symboliques doivent etre en chemin “relatif” et et non en “absolu” sinon cela ne fonctionne pas : il ne faut pas avoir “pxelinux.0 → /tftpboot/syslinux/pxelinux.0” mais “pxelinux.0 → syslinux/pxelinux.0” par exemple.

Test du transfert TFTP

Test de transfert de fichier :

Depuis un autre poste sur le réseau (ca marche meme sous windows ;p) ou depuis le serveur lui-même :

tftp monserveurtftp.mondomaine.com GET pxelinux.0

ou bien :

tftp 192.168.0.1 GET pxelinux.0

devrait donner quelque chose de similaire a :

Transfert réussi : 13454 octets en 1 seconde, 13454 octets/s
Le service TFTP utilise le port 69 en UDP, il faut l'autoriser dans le firewall du serveur (et/ou sur les firewall intermediaires) si besoin est.

Maintenant que tout ca marche, il est temps de mettre a dispostion des images de boot.

Mise a disposition d'une image de boot

Il existe plusieurs formats d'image :

  • images binaires
  • images de disquettes
  • images ISO de CDROM

Fichiers images (binaires)

Ca tombe bien c'est les plus simples car elles sont directement bootables :-) : Par exemple nous allons proposer le boot de l'utilitaire MemTest86+ qui permet de tester la RAM d'une machine et qui peut s'avérer tres utile ;-)

  • Allez sur le site http://www.memtest.org/#downiso et téléchargez la derniere version du “Pre-Compiled Bootable Binary” (en .gz ou .zip, comme vous préférez)
  • Décompresser l'archive obtenue et placez le fichier .bin obtenue dans le repertoire 'img' a la racine du serveur TFTP (/tftpboot) :
    cp memtest86+-4.00.bin /tftpboot/img/
  • Nous pouvons maintenant booter sur MemTest+ depuis un client PXE en tapant au prompt de boot :
    img/memtest86+-4.00.bin

:!: cette invite est en qwerty :!:

Images de disquettes

Les images de disquettes ne sont pas directement bootables, il faut donc utiliser l'image binaire “memdisk” à laquelle nous passerons en argument le nom du fichier image (disquette) a démarrer. Les images pouvant être passées à ce module peuvent être de tous les formats standards, même si l'ordinateur client ne dispose pas de ce type de lecteur disquette, voir pas de lecteur disquette du tout.

  • Placer l'image de votre disquette test.img dans le repertoire img, et vous pouvez ensuite booter dessus depuis un client PXE en tapant au prompt de boot :
    memdisk initrd=img/test.img

Entrée de menu nécessaire pour démarrer une image disquette (stockée dans le répertoire “img” des images et nommée “fichier.img”) :

  • Entrée de menu classiques pour les disquettes :
    LABEL monImageDeDisquette
    	MENU LABEL Mon image de disquette
    	kernel memdisk
    	append initrd=img/fichier.img
  • Ou pour certaines images de disquette ne fonctionnant pas totalement, ajouter “raw” fin de ligne append :
    append initrd=images/fichier.img raw
  • Ou encore :
    append initrd=images/fichier.img bigraw
  • Ou enfin pour une image de disquette Ghost, nécessitant le driver UNDI :
    append keeppxe initrd=images/fichier.img

Images ISO de liveCD/DVD

Toutes les ISOs de CD/DVD ne sont pas bootables en utilisant cette technique, cependant c'est le cas de toutes les images de liveCD / installateurs d'ubuntu “récente” (>= 10.04 lucid lynx) utilisant casper, comme dans l'exemple qui suit.

Pour cela vous allez avoir besoin :

  • de l'ISO du liveCD (ici ubuntu 10.04 version 32 bits)
  • un serveur NFS préconfiguré

Admettons que vous ayez l'ISO dans “/export/iso/linux/ubuntu/10.04-Lucid_Lynx_LTS/ubuntu-10.04-desktop-i386.iso”.

  • Il faut tout d'abord monter l'ISO en loop (ce point montage devra ensuite etre accessible et exporté en NFS ) :
    mkdir /export/ISOs/ubuntu-10.04-desktop-i386
    mount -o loop,ro /export/iso/linux/ubuntu/10.04-Lucid_Lynx_LTS/ubuntu-10.04-desktop-i386.iso /export/ISOs/ubuntu-10.04-desktop-i386
  • Création de l'arborescence tftpboot :
    mkdir -p /tftpboot/ubuntu-live/10.04_lucid/i386/
  • Il ensuite faut copier les fichier noyau et initrd pour pouvoir les distribuer en PXE :
    cp /export/ISOs/ubuntu-10.04-desktop-i386/casper/initrd.lz /tftpboot/ubuntu-live/10.04_lucid/i386/
    cp /export/ISOs/ubuntu-10.04-desktop-i386/casper/vmlinuz /tftpboot/ubuntu-live/10.04_lucid/i386/
  • Il faut ensuite ajouter les lignes suivantes a votre fichier “/tftpboot/pxelinux.cfg/default” (ou autre : voir plus haut pour les subtilités) :
    # Ubuntu Lucid Lynx 10.04 LTS liveCD
    label lucid-i386-liveCD
            menu label Ubuntu 10.04 Lucid Lynx i386 Live^CD
            kernel ubuntu-live/10.04_lucid/i386/vmlinuz
            append boot=casper netboot=nfs nfsroot=10.31.192.28:/export/ISOs/ubuntu-10.04-desktop-i386/ initrd=ubuntu-live/10.04_lucid/i386/initrd.lz --

ou “10.31.192.28” est l'IP de votre serveur NFS distribuant l'image ISO montée dans “/export/ISOs/ubuntu-10.04-desktop-i386/” : adaptez les chemins le cas échéant.

  • Voici pour info la ligne correspondant à l'export NFS (à ajouter dans le fichier /etc/exports du serveur correspondant) :
    # pour les liveCD en NFS / PXE
    /export/ISOs/ubuntu-10.04-desktop-i386	*(ro,no_root_squash,nohide,async,no_subtree_check)

Industrialisation de la chose

C'est quand meme un peu lourd de devoir taper le nom des images a lancer sur une console, qui plus est en qwerty, non ? ;-)

Nous allons donc créer et organiser un menu de boot :

  • Fichier de configuration de PXE Linux
    • Pour créer un fichier de configuration propre à chaque machine, deux choix de création s'offrent à nous :
      • 01-00-26-54-42-b1-d3-d4 (“01-” suivi de l'adresse MAC de la carte reseau, donc la machine)
      • C0A80003 (qui correspond a l'IP de la machine “192.168.0.3” en hexadecimal)
    • Il faut bien sur privilégier le premier, car 'adresse IP peut ne pas etre fixe (attribution d'adresse via DHCP sans réservation par exemple) alors que l'adresse MAc est quant a elle fixe et unique.
    • On pourrait créer un fichier de configuration propre au réseau 192.168.0.0/24 :
      • C0A800 (réseau “192.168.0” en hexadecimal)
    • Ou une configuration par défaut :
      • Créer un fichier texte nommé : “default” dans le répertoire “pxelinux.cfg”, et contenant :
        DEFAULT menu.c32
        
        TIMEOUT 50
        ALLOWOPTIONS 0
        PROMPT 0
        
        MENU TITLE Kiwi Menu
        
        LABEL BootNormal
             MENU LABEL ^Boot Normal
             MENU DEFAULT
             LOCALBOOT 0
        
        LABEL test
             MENU LABEL Dis^quette de test
             kernel memdisk
             append initrd=images/test.img

Ceci est la version la plus simple d'affichage d'un menu au démarrage, meme si nous aurions pu réaliser un menu graphique.

La syntaxe de ce fichier de configuration est décrite dans le fichier “syslinux.doc” de l'archive de SysLinux.

Noter les touches de raccourcis des différentes entrées de ce menu ( caractere ^ devant la lettre correspondante )

Un sous menu n'est rien d'autre qu'un autre “menu.c32” appelé avec comme argument le fichier de configuration de ce sous menu, comme par exemple :

LABEL sysUtils
	MENU LABEL > Utilitaires ^systemes
	KERNEL menu.c32
	APPEND menuconf/sysutil.conf

Et en créant un fichier “menuconf/sysutil.conf” analogue au précédent

Références

Aller plus loin

liveCD ubuntu 12.04 en PXE

Quelques particularités concernant le boot d'un liveCD d'ubuntu 12.04 precise en PXE :

  • Par defaut la commande nfsmount utilisée pour monter le / utilise maintenant NFSv4 et non plus NFSv3. Si comme moi vous voulez continuer a utiliser un serveur NFSv3 pour ca, lisez la suite.
  • L'initrd du liveCD de la version i386 (la version amd64 n'a pas ce probleme) ne fonctionne pas : certainement a cause d'un probleme de génération de l'initrd pour les noyaux “-generic-pae”, voir suite pour regénérer un initrd fonctionnel (sans le support du PAE donc)

Faire fonctionner un boot de liveCD PXE ubuntu 12.04 en NFSv3

  • comme d'habitude récupérer l'image iso du liveCD
  • il faut ensuite la monter et rendre ce point de montage accessible en NFS comme ci dessus :
    • # mkdir /export/ISOs/ubuntu-12.04-desktop-amd64
      # mount -o loop,ro /export/iso/linux/ubuntu/12.04_precise/ubuntu-12.04-desktop-amd64.iso /export/ISOs/ubuntu-12.04-desktop-amd64
    • ajouter l'export NFS :
      # echo "/export/ISOs/ubuntu-12.04-desktop-amd64	*(ro,no_root_squash,nohide,async,no_subtree_check)" >> /etc/exports
      # /etc/init.d/nfs-kernel-server reload

Voila pour la partie facile, maintenant il va falloir extraire l'initrd, et en modifier le contenu pour appeler la commande “mount -f nfs” au lieu de la commande “nfsmount” et ainsi utiliser le NFSv3 au lieu du NFSv4 :

  • décompression de l'initrd fourni :
    $ mkdir /tmp/ubuntu_boot
    $ cd /tmp/ubuntu_boot
    $ cat /export/ISOs/ubuntu-12.04-desktop-amd64/casper/initrd.lz | lzcat | cpio -i
  • modifier le script en applicant le patch suivant :
    --- ./scripts/casper.orig	2012-05-15 15:22:04.000000000 +0200
    +++ ./scripts/casper	2012-05-15 15:24:45.000000000 +0200
    @@ -223,11 +223,11 @@ do_nfsmount() {
             NFSOPTS=""
         fi
    
    -    [ "$quiet" != "y" ] && log_begin_msg "Trying nfsmount -o nolock -o ro ${NFSOPTS} ${NFSROOT} ${mountpoint}"
    +    [ "$quiet" != "y" ] && log_begin_msg "Trying mount -t nfs -o nolock -o ro ${NFSOPTS} ${NFSROOT} ${mountpoint}"
         # FIXME: This while loop is an ugly HACK round an nfs bug
         i=0
         while [ "$i" -lt 60 ]; do
    -        nfsmount -o nolock -o ro ${NFSOPTS} "${NFSROOT}" "${mountpoint}" && rc=0 && break
    +        mount -t nfs -o nolock -o ro ${NFSOPTS} "${NFSROOT}" "${mountpoint}" && rc=0 && break
             sleep 1
             i="$(($i + 1))"
         done

    ou encore :

    sed -i -e 's/nfsmount -o nolock/mount -t nfs -o nolock/' /tmp/ubuntu_boot/scripts/casper
  • Recompresser l'initrd :
    find . | cpio --quiet --dereference -o -H newc | lzma -c9 > /tmp/initrd_new.lz
  • Rendre ce nouvel initrd ainsi que le noyau accessible en tftp en les copiant a la racine du serveur tftp :
    # mkdir -p /tftpboot/ubuntu-live/12.04_precise/amd64/
    # cp /tmp/initrd_new.lz /tftpboot/ubuntu-live/12.04_precise/amd64/
    # cp /export/ISOs/ubuntu-12.04-desktop-amd64/casper/vmlinuz /tftpboot/ubuntu-live/12.04_precise/amd64/
  • Il faut ensuite ajouter les lignes suivantes a votre fichier “/tftpboot/pxelinux.cfg/default” (ou autre : voir plus haut pour les subtilités) :
    # Ubuntu Precise Pangolin 12.04 liveCD
    label precise-amd64-liveCD
        menu label Ubuntu 12.04 ^Precise Pangolin amd64 LiveCD
        kernel ubuntu-live/12.04_precise/amd64/vmlinuz
        append boot=casper netboot=nfs nfsroot=10.31.192.28:/export/ISOs/ubuntu-12.04-desktop-amd64/ initrd=ubuntu-live/12.04_precise/amd64/initrd_nfsmount.lz -- debian-installer/locale=fr_FR keyboard-configuration/layoutcode=fr keyboard-configuration/variantcode=oss

ou “10.31.192.28” est l'IP de votre serveur NFS distribuant l'image ISO montée dans “/export/ISOs/ubuntu-12.04-desktop-amd64/” : adaptez les chemins le cas échéant.

La même chose mais pour un liveCD i386

Pour la version i386, l'initrd présent sur le cdrom ne fonctionne pas (en tous cas chez moi :p) : il n'arrive pas a charger les modules lors du boot , comme par exemple le fichier /lib/modules/3.2.0-23-generic/modules.dep.

Il a donc fallu générer un nouvel initrd en utilisant le noyau linux-image-3.2.0-23-generic-generic et non pas le linux-image-3.2.0-23-generic-pae d'origine avant de réaliser les opérations décrites ci dessus.

Pour ce faire, il faut prendre une machine ubuntu 12.04 i386 (dans mon cas une simple VM utilisant l'iso du liveCD 12.04 i386) et :

# apt-get install linux-image-3.2.0-23-generic
# /usr/sbin/mkinitramfs -o /tmp/initrd_3.2.0-23-generic.lz -c lzma 3.2.0-23-generic

Il ne restait donc ensuite plus qu'a en extraire le contenu, patcher le script scripts/casper pour utiliser le NFSv3 et recompresser

sysadmin/boot_pxe.txt · Dernière modification: 2012/09/21 17:31 par james
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0