Table des matières

, , , , , , ,

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” :

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.

 mkdir /tftpboot/img /tftpboot/pxelinux.cfg /tftpboot/menuconf

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 :

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 ;-)

:!: 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.

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”) :

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 :

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

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.

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 :

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

Je vous conseille les lectures suivantes :

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 :

Faire fonctionner un boot de liveCD PXE ubuntu 12.04 en NFSv3

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 :

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