Notre solution est contituée de deux principaux composants :
Le premier composant est FAIL (pour FAult Injection Language) qui est un
lan-gage qui permet de décrire facilement des scénarios de fautes (voir chapitre
précédent). Le langage FAIL est un langage abstrait de haut niveau permettant
de dénir des scénarios de fautes grâce à des machines à états qui modélisent les
occurences de fautes. Il décrit également l'association entre ces machines à états et
un ordinateur (ou un groupe d'ordinateur) du réseau.
Le second composant est FCI (pour FAIL Cluster Implementation) qui est une
plat-forme distribuée d'injection de fautes congurée à partir d'un scénario de fautes
décrit dans le langage FAIL.
Ces deux composants sont développés dans le cadre du projet GriD eXplorer qui a
pour but l'émulation de réseaux à grande échelle sur des clusters ou des grilles plus petites.
Décomposition de la plate-forme FCI. La plate-forme FCI (voir gure 5.1) est
décomposée de la manière suivante :
Le compilateur de FCI : Le scénario écrit en FAIL doit être enregistré dans un
chier portant l'extention . Il doit alors être précompilé par le compilateur de
FCI qui génère alors du code C++ ainsi que des chiers de conguration par défaut.
Un chier .cpp et un chier .h sont générés pour chaque automate déni
dans le scénario. Ces chiers contiennent la dénition d'une classe correspondant à
chaque automate. Un chier .cpp et un chier .h sont générés pour chaque
déclaration de machine et de groupe. Ces chiers contiennent la dénition d'une
classe correspondant à l'injecteur de fautes.
La bibliothèque de FCI : Toutes les classes générées lors de la compilation du
scé-nario de fautes dérivent de classes principales contenues dans la bibliothèque FAILD.
Cette bibliothèque contient également les classes modules qui sont des outils
four-nissant chacune des fonctions du langage FAIL.
Les chiers générés et la bibliothèque FAILD sont alors copiés sur les diérentes
machines du réseau suivant les chiers de conguration dénis par l'utilisateur et ensuite
compilés localement pour générer un programme exécutable faild (le code source
des chiers générés par le compilateur et de la bibliothèque FCI est compilé sur chaque
machine pour permettre le support des clusters hétérogènes). C'est l'exécution de ce
programme sur chacune des machines qui créera les démons FCI.
Les démons FCI. Quand l'expérience débute, l'application distribuée testée est
exé-cutée à travers les démons FCI installés sur tous les ordinateurs pour leur permettre de
l'instrumenter et de la contrôler suivant le scénario de fautes déni. Le démon FCI associé
à un ordinateur particulier consiste en :
1. une machine à états implantant le scénario de fautes,
2. un module pour communiquer avec les autres démons (i.e. pour injecter des fautes
basées sur l'état global du système),
3. un module pour gérer le temps (i.e. pour permettre l'injection de fautes à un instant
donné),
4. un module pour l'instrumentation de l'application testée (en contrôlant un débogueur),
5. et un module pour gérer les événements (pour déclencher les fautes).
L'utilisation d'un débogueur. FCI est un injecteur de fautes de type
Debugger-based car l'injection de fautes et l'instrumentation de l'application testée sont faites
grâce à l'utilisation d'un débogueur logiciel. Ceci permet de ne pas avoir à modier
le code source de l'application testée tout en ayant la possibilité d'injecter des fautes
arbitraires (modication du program counter ou des variables locales pour simuler une
attaque de type buer overow , etc). Comme le débogueur parallèle Mantis [54], FCI
communique avec le débogueur à travers des tubes unix. Mais contrairement à Mantis,
les communications avec le débogueur doivent être minimisées pour permettre un faible
surcoût de la plate-forme d'injection de fautes (dans notre approche, le débogueur est
utilisé uniquement pour déclencher et injecter les fautes). L'application testée peut ainsi
être interrompue quand elle appelle une fonction particulière ou avant d'exécuter une
ligne particulière de son code source. Son exécution peut être reprise suivant le scénario
de fautes considéré. L'implantation actuelle de FCI intègre le support de deux débogueurs
diérents : gdb, l'environment de debogage séquenciel de la fondation Free Software pour
la prise en charge de programmes natifs et jdb, le débogueur Java pour la prise en charge
de programmes Java.
Comparatif avec les autres approches. Du point de vue de l'utilisateur, il est
su-isant d'écrire un scénario de fautes FAIL pour dénir une expérience. Le code source des
démons d'injection de fautes est automatiquement généré. Ces démons communiquent
entre eux explicitement suivant le scénario de fautes déni par l'utilisateur. Ceci permet
l'injection de fautes basée sur l'état global du système ou sur un mécanisme plus complexe
impliquant plusieurs machines (i.e. une injection de fautes en cascade).
De plus, l'architecture complètement distribuée des démons FCI facilite le passage
à l'échelle de l'outil, ce qui est nécessaire dans le contexte de l'émulation de systèmes
distribués à grande échelle.
L'utilisation d'un débogueur pour le déclenchement des fautes permet également de
limiter l'intrusion de l'injecteur de fautes pendant l'expérience. En eet, le débogueur
place des points d'arrêt correspondant au scénario de fautes déni par l'utilisateur et
exécute alors l'application testée. Tant qu'aucun point d'arrêt n'est atteint, l'application
s'exécute normalement et le débogueur reste inactif.
Grande expressivité non oui non oui
Langage de haut niveau non non oui oui
Pas de modication du code source oui non non oui
Passage à l'échelle oui non oui oui
Scénario probabiliste oui oui non oui
Injection selon un état global non oui oui oui
Fig. 5.2 Comparatif des systèmes d'injection de fautes
Les diérences essentielles entre notre approche et les travaux précédents sont
ré-sumées dans la gure 5.2.
Dans le document
INJECTION DE FAUTES DANS LES SYSTEMES DISTRIBUES
(Page 74-78)