Table des matières
Client : PXE fait une requête DHCP au(x) serveurs(s) à l'écoute (Broadcast) : paquet de type DHCPDISCOVER
Serveur : S'il est concerné, le serveur répond par un paquet DHCPOFFER (offre d'adresse IP)
Client : le client sélectionne parmi les réponses, une réponse qui lui convient et refait une requête DHCPREQUEST au serveur qu'il a choisi.
Serveur : Le serveur répond par un paquet DHCPACK
Client : Dans les divers paquets DHCP, le client trouve : une IP, l'IP du serveur TFTP, un FILENAME... Le client, qui maintenant a une IP, fait une requête TFTP pour obtenir le fichier FILENAME qui va lui servir de programme de démarrage (chargé en 0x7C00, comme le serait un bootsecteur) : il est appelé NBP dans la spécification PXE d'Intel, i.e Network Bootstrap Program. Ce NBP va pouvoir utiliser l'API PXE pour effectuer d'autres actions. L'API PXE fournit les services suivants : TFTP API, UDP API et UNDI API.
![]() |
|---|
Au boot du client via PXE : Le client obtient, via DHCP, son IP et le FILENAME '/tftpboot/revoboot/bin/revoboot.pxe' qu'il charge et exécute...
Exécution du Linbox BootLoader (revoboot.pxe) Le Scan Hardware a lieu (périphériques PCI, la détection de mémoire et du CPU, les partitions des disques) et les infos sont envoyées vers le serveur, port 1001 (type HwPacket).
"getClientResponse" reçoit ce paquet UDP et exécute une mise-à-jour des infos Hardware (dans ./log) et une mise à jour du fichier de configuration (s'il existe, ce qui n'est pas le cas si la station est nouvelle, donc inconnue).
puis, getClientResponse effectue ses vérifications...
Le LBL cherche un fichier de configuration Il cherche successivement un fichier /tftpboot/revoboot/cfg/IP, /tftpboot/revoboot/cfg/MAC, /tftpboot/revoboot/cfg/default . IP et MAC sont respectivement l'adresse IP et l'adresse MAC exprimée en hexadécimal (ex. C0A80080, 0010DCB049F8)
Et il exécute les instructions de ce fichier.
Les instructions situées en dehors d'un champ "title" sont immédiatement exécutées (ex. "color", "timeout", "default"...).
Les instructions situées dans un champ "title" sont exécutées lorsqu'on choisi ce titre en particulier, dans le menu qui est construit à partir de la liste des "title"s rencontrés dans le fichier de configuration.
Lorsqu'une station est ajoutée dans la liste, il est automatiquement créé une nouvelle entrée dans le répertoire /tftpboot/revoboot/images (le nom est l'adresse MAC exprimée en hexadécimal. Par exemple : "0010DCB049F8".) ainsi qu'un fichier de configuration dans /tftpboot/revoboot/cfg (toujours nommé d'après l'adresse MAC en hexadécimal). Le contenu du répertoire et du fichier de configuration est créé en fonction de ce qui est contenu dans le répertoire /tftpboot/revoboot/imgskel (squelette contenant des liens, des répertoires vides pour stockage et un fichier "header.lst").
On distingue 4 types de commandes dans un fichier de configuration et 2 types d'images :
Pour les commandes :
Les commandes de restauration ("partcopy").
Les commandes de sauvegarde (via le boot d'un noyau linux + initrd).
Les commandes de gestion du système LRS ("inc","identify" etc...).
Les commandes du bootloader sous-jacent, i.e. GRuB ("root (x)","chainloader +1",...).
Pour les images :
Les images propres à la machine, stockées dans son propre répertoire : images "locales".
Les images disponibles par toutes les machine, stockées dans /tftpboot/revoobt/imgbase : images "de base", utilisées pour du déploiement, par exemple.
Les images sont créées lors de l'exécution d'une commande de type "backup", qui lance un noyau Linux sur la machine à sauvegarder. Les partitions disponibles sur le disque sont examinées l'une après l'autre et selon le type de filesystem (FAT,NTFS,EXT2,REISERFS), un utilitaire est exécuté pour créer les fichiers qui seront utilisés pour la reconstruction. La sauvegarde est faite dans le répertoire passé comme paramètre au noyau (revosave=/xxxx/xxxx/xxx/xxx) qui est monté via NFS. Les fichiers créés auront une taille maximale de 86Mo (pour des limitations liées à TFTP) et le contenu d'une partition sera donc scindé en plusieurs fichiers de type partX_YYY, où X est le numéro de la partition sur le disque et YYY va de 000 à 999 ou plus suivant la taille de la partition.
Lors de la reconstruction, l'instruction "partcopy" ira chercher via TFTP les divers fichiers nécessaires à la reconstruction du disque et mettra à jour la table de partition en fonction de la taille des données reçues. Il est possible de reconstruire des partitions qui ont été créées sur des disques différents, à condition que les nouveaux disques soient plus grands que ceux d'origine. Il est aussi possible de ne restaurer qu'un sous-ensemble des partitions qui ont été sauvées (il est nécessaire d'aller retoucher les fichiers conf.txt, ou header.lst "à la main" dans l'arborescence /tftpboot/revoboot/images, dans ce cas).
Lors du premier boot le fichier de commandes "/tftpboot/revoboot/cfg/default" est utilisé. On y trouvera :
timeout 20 default 1 title boot-disk root (hd0) chainloader +1 title identify-station identify reboot
Ce qui permet d'exécuter une commande 'identify' automatiquement, mais laisse à l'utilisateur la possibilité de booter sur le disque dur, malgré tout.
Explications :
timeout 20 : démarrer automatiquement après 20 secondes
default 1 : le menu par défaut sera le "1" (on
numérote à partir de "0"!!!)
title boot-disk : titre du menu 0 = "boot-disk"
root (hd0) : le disque "racine" est le disque 0 (on pourrait
aussi avoir "root (hd0,0)", ce qui signifie que la racine est la
première partition du disque 0).
chainloader +1 : équivaut à "chainloader 0+1",
ce qui signifie charger le ("1") secteur 0 à partir de la
racine ( "(hd0)" ou "(hd0,0)" ).
title identify-station : menu 1, titre "identify-station"
identify : la commande "identify" demande un nom de station
et un ID d'administrateur et envoie un packet au démon
"getClientResponse".
reboot : redémarre la station.
Dans ce cas, c'est getClientResponse qui répond à la requête identify : Il créé le répertoire de la station d'aprés le squelette contenu dans /tftpboot/revoboot/imgskel, le fichier de configuration de la station, alloue une adresse IP à la station, met à jour le fichier /etc/dhcpd.conf, relance le service "dhcpd" sur le serveur et ajoute la machine à la liste des machines reconnues par le LRS (fichier /tftpboot/revoboot/etc/ether)...
Après le premier reboot, un fichier de commande plus utile est créé dans /tftpboot/revoboot/cfg, et dont le nom est basé sur l'adresse MAC du client. Ce fichier est lui-même généré à partir du fichier header.lst. On peut avoir, par exemple la configuration suivante :
timeout 10 color 7/1 15/3 default 0 hiddenmenu title Disque Dur Local desc Demarrage sur disque dur local root (hd0) chainloader +1 title Disquette desc Demarrage sur le lecteur de disquette root (fd0) chainloader +1 title Creation Image (Locale) desc Sauvegarde DD -& Image Locale kernel (nd)/tftpboot/revoboot/bin/bzImage.initrd revosavedir=/images/0010DCB037CF/Copy-1 initrd (nd)/tftpboot/revoboot/bin/initrd.gz inc COPY title Creation Image (Base) desc Sauvegarde DD -& Image de Base kernel(nd)/tftpboot/revoboot/bin/bzImage.initrd revosavedir=/imgbase/Base-2 initrd (nd)/tftpboot/revoboot/bin/initrd.gz inc BASE title MBR Fix desc Restauration du MasterBootRecord root (hd0) mbr (nd)/tftpboot/revoboot/bin/mbr446.bin pause title Utilitaire : Test memoire desc Utilitaire de test de la RAM du PC kernel (nd)/tftpboot/revoboot/bin/memtest.bin title Win98 Base desc Image de base Win98 partcopy (hd0,0) 63 /tftpboot/revoboot/images/0010DCB037CF/Base-1/part1_ parttype (hd0,0) 12 root (hd0,0) chainloader +1
Explications : (nouvelles commandes)
color xx/yy tt/zz : fixe la couleur à xx/yy (caractère/fond) pour les
caractères "normaux" et tt/zz pour les caractères en
"surbrillance".
hiddenmenu : n'affichera le menu que si l'utilisateur appuie
sur "shift-alt-shift", sinon on attend le timeout...
desc XXXX : description du menu (est affichée sous le
menu lorsqu'il est selectionné)
root (fd0) : idem "root (hd0)", pour le floppy ( (hdX,Y)=disque X,partition Y,
(fdX)=floppy X, (nd)=network device)
kernel FILE ARGS : pour charger un noyau (ou equivalent) et
lui fournir ses arguments.
initrd FILE : pour charger un "initrd", i.e. un disque-compressé sur
lequel bootera le noyau (fonctionnement en diskless,par ex.)
inc, mbr : cf description des commandes.
partcopy, parttype ... : dans l'exemple ci-dessus, on reconstruit la partition 0 du disque
0 (i.e. C:\) à partir des fichiers contenus dans
"/tftpboot/revoboot/images/0010DCB037CF/Base-1/", le premier
secteur de cette partition étant le secteur 63 (on aurait
pû mettre -first à la place.). On fixe le type de
partition à 12 (FAT32,LBA) et on boote sur son bootsecteur
(secteur 0 de la partiton 0, disque 0).
Le fichier de configuration a été obtenu à partir des informations qui sont dans le fichier "header.lst" du répertoire local appartenant à la station bootée. Il est le suivant :
[header] item=timeout 10 item=color 7/1 15/3 item=default DEFNUM item=hiddenmenu [menu1] def=yes visu=yes image=Local-Disk include=Local-Disk/conf.txt [menu2] def=no visu=yes image=Local-Floppy include=Local-Floppy/conf.txt [menu3] def=no visu=yes image=Backup-L include=Backup-L/conf.txt [menu4] def=no visu=yes image=Backup-B include=Backup-B/conf.txt [menu5] def=no visu=yes image=Util-Mbr include=Util-Mbr/conf.txt [menu6] def=no visu=yes image=Util-MemTest include=Util-MemTest/conf.txt [menu7] def=no visu=yes image=Base-1 include=Base-1/conf.txt
Ce fichier ne contient pas les commandes de type "partcopy","parttype",... : il est avant tout destiné à contenir les informations liées au status de type "visible oui/non" ou "defaut oui/non". Les commandes qui formeront le fichier de configuration sont contenues dans des fichiers nommés "conf.txt" dans les répertoires où sont réellement stockées les images. Pour comprendre, voici par exemple le contenu du répertoire de la machine presentée :
. |-- Backup-B | `-- conf.txt |-- Backup-L | `-- conf.txt |-- Base-1 -> ../../imgbase/Base-1 |-- COPYNUM |-- Copy-1 | |-- conf.txt | |-- part1_000 | `-- part1_idx |-- Copy-2 |-- Local-Disk -> ../../imgbase/Local-Disk |-- Local-Floppy -> ../../imgbase/Local-Floppy |-- Util-Mbr -> ../../imgbase/Util-Mbr |-- Util-MemTest -> ../../imgbase/Util-MemTest `-- header.lst
Les répertoires Backup-B, Backup-L, Copy-1, Copy-2 sont locaux et propres à cette machine : ils servent d'emplacement de stockage pour les images "locales". Les répertoires Local-Disk, Local-Floppy, Util-Mbr, Util-MemTest sont en fait des liens symboliques vers des répertoires de /tftpboot/revoboot/imgbase/xxx qui contiennent uniquement un fichier conf.txt, puisque ces menus ne concernent pas des images à proprement parler (on utilise des instruction de type "kernel", "mbr"...). Le contenu de Base-1 (lien symbolique vers /tftpboot/revoboot/imgbase/Base-1) est différent. On y trouve :
total 161392 -rw-r--r-- 1 root root 128 déc 19 17:23 conf.txt -rw-r--r-- 1 root root 36605958 déc 10 13:13 part1_000 -rw-r--r-- 1 root root 38500328 déc 10 13:15 part1_001 -rw-r--r-- 1 root root 38938023 déc 10 13:17 part1_002 -rw-r--r-- 1 root root 33404765 déc 10 13:18 part1_003 -rw-r--r-- 1 root root 17316535 déc 10 13:19 part1_004 -rw-r--r-- 1 root root 77 déc 10 13:19 part1_005 ... -rw-r--r-- 1 root root 77 déc 10 13:19 part1_112 -rw-r--r-- 1 root root 78 déc 10 13:19 part1_113 -rw-r--r-- 1 root root 33778 déc 10 13:19 part1_idx
Ce qui représente les données de l'image de base Win98. C'est une image d'un système de base d'environ 350Mo (160Mo compressé) sur une partition de 9Go (114 parties de 86Mo).
Le fichier "conf.txt" contient les données suivantes :
title Win98 Base desc Image de base Win98 partcopy (hd0,0) 63 PATH/part1_ parttype (hd0,0) 12 root (hd0,0) chainloader +1
On retrouve la série de commandes qui est à la fin du fichier de configuration présenté en début de chapitre (exception faite de la partie "PATH" qui sera substituée par le PATH complet du fichier lors de la mise à jour du fichier de configuration). Les autres champs "substituables" sont : PATH : remplacé par "/tftpboot/revoboot/images/MACADDR/" MAC : remplacé par "MACADDR" COPYNUM : remplacé par le contenu de "/tftpboot/revoboot/images/MACADDR/COPYNUM" BASENUM : remplacé par le contenu de "/tftpboot/revoboot/imgbase/BASENUM" (où MACADDR représente l'adresse MAC exprimé en hexadécimal de la station concernée).
"partcopy" : syntaxe "partcopy PART START FILEPREFIX" :
Copie sur la partition PART (notation Grub, type (hd0,0)) qui débute sur le secteur START, les fichiers images FILEPREFIX000 à FILEPREFIXxxx (leur nombre exact est dans l'entête du premier fichier, ie 000). START peut être remplacé par "-first" pour débuter sur le premier secteur du second cyl/head (devrait être le numéro 63 si la géométrie est de type CHS XXX/YY/63). START peut être remplacé par "-next" pour débuter sur le 1er secteur du cyl/head suivant la partition précédente.
"parttype" : syntaxe "parttype PART TYPE" :
Assigne le type TYPE à la partition PART. Attention, ceci n'est pas fait automatiquement par partcopy !
"mbr" : syntaxe "mbr FILE"
Copie le mbr qui est contenu dans FILE dans le MasterBootRecord (ie secteur 1 du disque courant) Attention : on ne lit que 512 octets au maximum ! Attention : on écrase le MBR courant (y compris la table de partition si la taille du mbr chargé est > 446 octets) Attention : on agit sur le disque COURANT : effectuer un "root (hd0)" AVANT !
"pciscan" : syntaxe "pciscan"
La version interactive de la commande exécutée automatiquement au démarrage.
"identify" : syntaxe "identify"
Demande un NOM de machine et un ID administrateur, puis envoie un paquet UDP de type ID"NOM":"ADMIN" vers le serveur sur port 1001 (IdPacket).
"identifyauto" : syntaxe "identifyauto"
Idem "identify", mais le nom et l'ID sont remplacés par "+":"+" automatiquement, donc on ne demande rien à l'utilisateur (pour ajout automatique dans le cadre de la LNA ou de machines dans un cluster).
"inc" : syntaxe "inc BASE|COPY"
Envoi d'un packet "inc" vers getClientResponse pour la gestion des répertoires de sauvegarde (image de base ou image locale (Copy)).
"setdefault" : syntax "setdefault NUMBER"
Envoi un paquet (UDP, port 1001) au serveur, pour modifier l'entrée par défaut de grub au prochain reboot ('0' étant la 1ere entreé). Après chaque sauvegarde, l'entrée par défaut redevient la 1ere.
Le backup est effectué en bootant un noyau Linux (2.4.x) et en démarrant sur un RAM-disk (contenu dans un fichier de type initrd.gz).
Le noyau monte le ram-disk en tant que root-filesystem (/)
La carte réseau est reconnue en testant chaque pilot listé dans le fichier /etc/modules (/etc/modules.full est utilisé si le mot-clé 'revofull' a été spécifié dans les paramètres de boot du noyau).
Les paramètres réseau sont obtenus via DHCP, par le programme "pump"
Si le mot-clé 'revodebug' est présent dans les paramètres de boot du noyau, alors, la sauvegarde ne sera pas lancée, et vous allez pouvoir vous loguer en 'root'. Dans ce mode 'debug', vous pouvez lancer 'floppysave' pour écrire les fichiers de log de boot sur une disquette formatée MSDOS, dans l'hypothèse où la carte réseau ne s'initialise pas et donc si vous ne pouvez pas obtenir les logs via l'interface Webmin.
Une liste des disques/partition à sauvegarder est obtenue en lisant le fichier /proc/partitions.
La sauvegarde se déroule dans le répertoire /revosave qui est en fait un point de montage pour le répertoire monté par NFS et dont le chemin est fourni en paramètre noyau (revosavedir=/xxx/xxx).
Le script principal de sauvegarde s'appelle "/bin/autosave". Il appelle successivement les programmes "image_fat","image_ntfs","image_ext2" et "image_reiserfs" jusqu'à ce que l'un d'eux retourne un code erreur non nul, ce qui signifie que les tests qu'il a effectués sur le filesystem se sont bien passés. Ce programme est ensuite lancé une deuxième fois, mais cette fois pour sauvegarder les données de la partition dans /revosave.
A la fin, le noyau reboote le PC.
Le fichier de configuration du noyau peut être trouvé sur ftp://ftp.linbox.com/pub/lrs/misc/source (Fichier : dotconfig.x.x.xx). Pour recompiler un noyau, il suffit de placer ce fichier dans le répertoire des sources du noyau (/usr/src/linux), de le renommer en fichier ".config" et de lancer la commande "make oldconfig". On peut alors recompiler le noyau via "make clean && make dep && make bzImage && make modules && make modules_install". Suivant les modifications effectuées, il faudra sans doute non seulement recopier le nouveau noyau obtenu (./arch/i386/boot/bzImage) dans le répertoire /tftpboot/revoboot/bin (sous le nom bzImage.initrd) et effectuer un "rdev" dessus (avec un device ayant pour major/minor 0/255, par exemple, en créant un /dev/boot255, via "mknod /dev/boot255 b 0 255"). Mais il sera peut-être nécessaire de modifier le contenu du fichier "initrd.gz" (pour y insérer un nouveau module de carte éthernet, par exemple) : nous contacter, dans ce cas. (Nécessite de "monter" initrd.gz en loopback, copier le module, éditer un script de démarrage, recompresser initrd...)

