ebauche de document, plus un reminder qu'un vrai howto pour le moment
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)
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
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
Je ne vais pas reprendre ici toute la configuration, mais je vais lister les directives a ajouter par rapport a une configuration “normale” :
# pour le boot reseau allow booting; allow bootp;
#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"; }
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.
cp core/pxelinux.0 /tftpboot/syslinux-3.84/
cp memdisk/memdisk /tftpboot/syslinux-3.84/
cp com32/menu/menu.c32 /tftpboot/syslinux-3.84/
mkdir /tftpboot/img /tftpboot/pxelinux.cfg /tftpboot/menuconf
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
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
Maintenant que tout ca marche, il est temps de mettre a dispostion des images de boot.
Il existe plusieurs formats d'image :
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
cp memtest86+-4.00.bin /tftpboot/img/
img/memtest86+-4.00.bin
cette invite est en qwerty
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.
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”) :
LABEL monImageDeDisquette MENU LABEL Mon image de disquette kernel memdisk append initrd=img/fichier.img
append initrd=images/fichier.img raw
append initrd=images/fichier.img bigraw
append keeppxe initrd=images/fichier.img
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”.
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
mkdir -p /tftpboot/ubuntu-live/10.04_lucid/i386/
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/
# 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.
# pour les liveCD en NFS / PXE /export/ISOs/ubuntu-10.04-desktop-i386 *(ro,no_root_squash,nohide,async,no_subtree_check)
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 :
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.
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
Je vous conseille les lectures suivantes :
Quelques particularités concernant le boot d'un liveCD d'ubuntu 12.04 precise en PXE :
# 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
# 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 :
$ mkdir /tmp/ubuntu_boot $ cd /tmp/ubuntu_boot $ cat /export/ISOs/ubuntu-12.04-desktop-amd64/casper/initrd.lz | lzcat | cpio -i
--- ./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
find . | cpio --quiet --dereference -o -H newc | lzma -c9 > /tmp/initrd_new.lz
# 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/
# 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.
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