{{tag>pxe sysadmin tftp serveur boot howto liveCD NFSroot}} ====== 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. * Télécharger le dernier SysLinux à l'adresse suivante : http://www.kernel.org/pub/linux/utils/boot/syslinux/ (il s'agit de la version 3.84 a l'heure ou j'ecris ces lignes) * 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 [[http://www.memtest.org/|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 ===== Je vous conseille les lectures suivantes : * http://www.gentilkiwi.com/documentations-s11-t-pxe.htm * http://www.isalo.org/wiki.debian-fr/index.php?title=PXE * http://www.syslinux.org/wiki/index.php/PXELINUX (anglais) * http://www.syslinux.org/wiki/index.php/MEMDISK#EXTLINUX.2FISOLINUX.2FPXELINUX.2FSYSLINUX * http://random.kakaopor.hu/ubuntu-12-04-live-nfspxe-boot-diskless-casper-kept ===== Aller plus loin ===== * http://drbl.sourceforge.net/ (Diskless Remote Boot in Linux) * http://ipxe.org/start (iPXE permet de booter en iSCSI, AoE, http, .... et peut s'utiliser avec chainloader ) ===== 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