Fonctionnement de FAI
Date de publication :
10/12/2004
Date de mise a jour :
Par
nyal (Home page)
Ce tutoriel a été écrit dans le cadre du projet FANI. Il décrit le fonctionnement du système FAI.
1. Introduction à FAI
2. Fonctionnement global de FAI
3. Les étapes de l'installation
3.1. L'étape init (fai_init)
3.2. L'étape confdir (task_confdir)
3.3. L'étape setup (task_setup)
3.4. L'étape defclass (task_defclass)
3.5. L'étape defvar (task_defvar)
3.6. L'étape partitions (task_partitions)
3.7. L'étape mountdisks (task_mountdisks)
3.8. L'étape extrbase (task_extrbase)
3.9. L'étape mirror (task_mirror)
3.10. L'étape updatebase (task_updatebase)
3.11. L'étape instsoft (task_instsoft)
3.12. L'étape configure (task_configure)
3.13. L'étape finish (task_finish)
3.14. L'étape chboot (task_chboot)
3.15. L'étape faiend (task_faiend)
4. Principe du système de classes
4.1. Introduction
4.2. L'étape defclass en détail (task_defclass)
4.3. Comment définir des classes selon les clients ?
5. Les limitations de FAI
6. Bibliographie
7. Conclusion
1. Introduction à FAI
FAI est un ensemble de scripts (script shell, Perl). Ces scripts réalisent
l'installation de clients automatiquement. Il permet ainsi de déployer des
parcs de machines rapidement. Le système FAI ne va pas utiliser d'image. Ainsi,
FAI permet d'installer un même système pour des clients avec des matériels différents
Nous allons nous placer au moment de l'installation. C'est à dire, après
que la machine cliente ait effectuée les tâches suivantes :
- Démarrage de la machine et récupération d'un noyau (Linux lors de ce tutoriel)
- Démarrage avec ce noyau
- Utilisation pour partition racine d'un répertoire nfs du serveur
(ce répertoire n'est pas pris au hasard. Il contient les fichiers nécessaires pour l'installation)
Ce tutoriel va donc expliquer en détail le processus d'installation
et configuration de FAI pour permettre à un administrateur de :
- Comprendre FAI pour une meilleure installation et une configuration
des machines clientes
- Utiliser les possibilités de FAI
- Connaître les limitations de FAI
 |
Ce tutoriel nécessite de bonnes connaissances en script-shell et Linux en général.
|
2. Fonctionnement global de FAI
Le script qui démarre l'installation est rcS_fai. Ce script se situe
dans le répertoire /etc/init.d/ pour qu'il soit exécuté automatiquement
par le processus init. (Il est renommé rcS sinon il ne sera pas exécuté)
Le script rcS_fai utilise différents fichiers :
- fai.conf : Ce fichier se situe dans le répertoire /etc/fai/.
Il définit des variables comme le type du système d'exploitation
(sunos, linux,...), le répertoire contenant des fichiers pour l'installation,...
- subroutines : Ce fichier se situe dans le répertoire
/usr/share/fai/. Il définit des fonctions qui seront appelées.
- subroutines-linux, subroutines-sunos, ...: Ces fichiers
se situent dans le répertoire /usr/share/fai/. Ils définissent eux
aussi des fonctions qui seront appelées.
Le script rcS_fai va d'abord récupérer les fonctions du fichier subroutines,
puis ceux du fichier correspondant au type du système client.
Ainsi, des fonctions définis dans subroutines pourront être surchargées
(remplacées) par des fonctions spécifiques au système.
Par exemple, le partitionnement peut se passer de manière différentes
que l'on soit sous Linux ou Solaris. Il sera donc nécessaire de
surcharger la fonction réalisant l'opération de partitionnement.
 |
Ce système pose un problème. Pour installer un système sun, il sera
nécessaire de démarrer le client avec un système sunos. On ne pourra
pas utiliser un système linux pour réaliser l'installation de
solaris ou windows. De plus, subroutines-linux a été développé pour
un système Debian. Il ne sera donc pas possible non plus, d'installer
une distribution fedora, red-hat, slackware sans modifier FAI.
|
 |
J'affirme catégoriquement ces limitations. Cela est fait sciemment.
On verra qu'il sera possible d'outrepasser ces problèmes avec le
système de classe. Cependant, cela est déconseillé car on utilise
la flexibilité d'une partie de FAI pour combler le manque d'une
autre.
|
3. Les étapes de l'installation
Lors de l'installation, FAI appelle dans l'ordre les fonctions suivantes :
- fai_init
- task_confdir
- task_setup
- task_defclass
- task_defvar
- task_partitions
- task_mountdisks
- task_extrbase
- task_mirror
- task_updatebase
- task_instsoft
- task_configure
- task_finish
- task_chboot
- task_faiend
Nous allons décrire le fonctionnement de FAI pour un OS linux.
C'est à dire le fonctionnement de base de FAI.
3.1. L'étape init (fai_init)
Informations |
Valeurs |
Localisation de la fonction |
rcS_fai |
Scripts utilisés |
|
Fonctions utilisées |
|
Tâches réalisées :
- Charge le fichier /etc/fai.conf
- Charge le fichier subroutines, ainsi que le
fichier subroutines-ostype correspondant à l'OS du client.
(Si ce fichier existe). Il utilise pour cela la variable
$OS_TYPE définie dans fai.conf grâce à la commande uname.
- Définit le répertoire de log ($LOGDIR).
Si cette variable n'est pas défini dans /etc/fai.conf, il
utilise par défaut le répertoire /tmp/fai/ qui est en écriture.
- Definition des variables contenant le chemin vers
des fichiers du répertoire de log. Ces variables seront
utilisées lors des étapes suivantes.
3.2. L'étape confdir (task_confdir)
Tâches réalisées :
- Récupére des information grâce au script
get-boot-info (script shell). Ce script va récupérer les
informations comme l'IP de la machine ($IPADDR), l'IP du
serveur ($SERVER), l'adresse de broadcast ($BROADCAST),... Il
stocke ces informations dans un fichier boot.log se situant
dans le répertoire $LOGDIR
- Charge le fichier boot.log. Ainsi, les variables
comme l'IP de la machine sont utilisables
- Appelle de la fonction define_fai_flags. Cette fonction
utilise la variable $FAI_FLAGS (FAI_FLAGS=flag1,flag2,flag3,..).
La fonction va récupérer les noms séparés par des virgules
puis créer des variables shell avec pour valeur 1.
Ces variables pourront être dés lors utilisées
- Appelle le script shell create_resolv_conf.
Ce script va créer le fichier resolv.conf et le copier dans
/tmp/etc/resolv.conf. Il va utiliser une variable definie
dans fai.conf ($DNSSRVS). Si elle n'existe pas,
il va alors prendre le fichier /etc/resolv.conf-installserver
- Appelle de la fonction get_fai_dir. Cette fonction
va monter le répertoire contenant les scripts pour les autres
étapes.
Si la variable $FAI_LOCATION est initialisée dans le
fichier fai.conf, FAI va monter le répertoire distant
se trouvant sur le serveur (utilisation de nfs) sur le
répertoire spécifié par la variable $FAI (défini dans le
fichier fai.conf).
Si $FAI_LOCATION n'est pas défini, FAI va appeler la
fonction get_fai_cvs. Cette fonction utilise la variable
$FAI_CVSROOT (défini dans fai.conf) et va récupérer le
repository cvs
- Vérifie le fonctionnement du serveur sndmon
(port 4711). FAI utilise la fonction sndmon. Cette fonction
essaye d'envoyer un message avec la commande nc (netcat)
au serveur. S'il ne réussit pas, il affecte la valeur 0 à
la variable $faimond.
3.3. L'étape setup (task_setup)
Informations |
Valeurs |
Localisation de la fonction |
subroutines |
Scripts utilisés |
|
Fonctions utilisées |
define_fai_flags |
Tâches réalisées :
- Charge le fichier subroutines se situant dans le
répertoire $FAI/hooks/ s'il est présent
- Configure l'horloge en utilisant les commandes
rdate ou ntpdate
- Appelle de la fonction define_fai_flags. Cette
fonction utilise la variable $FAI_FLAGS
(FAI_FLAGS=flag1,flag2,flag3,...). La fonction va récupérer
les noms séparés par des virgules, puis créer des variables
shell avec pour valeur 1. Ces variables pourront être dés lors
utilisées.
- Crée deux terminaux virtuels pour se connecter au client
- Lance un serveur SSH pour une connexion à distance
- Sauvegarde la date de démarrage de l'installation.
La valeur est stockée dans la variable $FAI_RUNDATE.
3.4. L'étape defclass (task_defclass)
Informations |
Valeurs |
Localisation de la fonction |
subroutines |
Scripts utilisés |
fai-class |
Fonctions utilisées |
|
Tâches réalisées :
- Appelle le script-shell fai-class pour récupérer
la liste des classes du client.
3.5. L'étape defvar (task_defvar)
Informations |
Valeurs |
Localisation de la fonction |
subroutines |
Scripts utilisés |
|
Fonctions utilisées |
|
Tâches réalisées :
- Parcours les classes définies pour le client.
FAI charge les fichiers ayant un nom de classe et l'extension .var.
FAI effectue cette recherche sur le répertoire $FAI/class/.
Ce répertoire contient aussi les définitions de classes
- Charge le fichier $LOGDIR/additional.var. Ce fichier
peut contenir les définitions des variables des scripts
exécutés dans l'étape précédentes
- Copie l'ensemble des variables définies pour le client
dans le fichier $LOGDIR/variables.sh.
3.6. L'étape partitions (task_partitions)
Informations |
Valeurs |
Localisation de la fonction |
subroutines-linux |
Scripts utilisés |
setup_harddisks |
Fonctions utilisées |
|
Tâches réalisées :
- Appelle le script Perl setup_harddisks. Ce script
va créer les partitions en utilisant un fichier du répertoire
$FAI/disk_config/ et le programme sfdisk.
Les fichiers de ce répertoire ont des noms de classe. Ainsi,
le script choisira le fichier selon sa liste de classes.
Le script va alors ajouter dans le fichier $LOGDIR/disk_var.sh
des informations. De plus, il va générer le fichier fstab et
le placer dans le répertoire $LOGDIR
- Charge le fichier $LOGDIR/disk_var.sh.
Ainsi, les variables $SWAPLIST, $BOOT_PARTITION, $ROOT_PARTITION,
$BOOT_DEVICE sont definies.
3.7. L'étape mountdisks (task_mountdisks)
Informations |
Valeurs |
Localisation de la fonction |
subroutines |
Scripts utilisés |
mount2dir |
Fonctions utilisées |
|
Tâches réalisées :
- Active les partitions de swap en utilisant la variable $SWAPLIST
- Monte les partitions. Les partitions sont montées à partir
du répertoire specifié par la variable $FAI_ROOT.
Si la variable n'est pas définie dans le fichier fai.conf,
la valeur /tmp/target/ lui est assignée. Il utilise le script
shell mount2dir et le fichier $LOGDIR/fstab pour réaliser les montages.
3.8. L'étape extrbase (task_extrbase)
Informations |
Valeurs |
Localisation de la fonction |
subroutines-linux |
Scripts utilisés |
|
Fonctions utilisées |
|
Tâches réalisées :
- Décompresse le fichier /var/tmp/base.tgz dans le
répertoire $FAI_ROOT. Ce fichier contient le système de base.
Par défaut, FAI crée ce fichier avec la commande debootstrap.
Elle permet de créer une archive avec les fichiers de base pour
le fonctionnement d'une distribution debian
- Copie le fichier fstab du répertoire $LOGDIR
dans le répertoire $FAI_ROOT/etc/.
3.9. L'étape mirror (task_mirror)
Informations |
Valeurs |
Localisation de la fonction |
subroutines-linux |
Scripts utilisés |
|
Fonctions utilisées |
|
Tâches réalisées :
- Monte par nfs un mirroir debian sur le client.
Cette fonctionnalité n'est pas trés utilisée. Le client va
plutôt utiliser le fichier /etc/apt/sources.list pour choisir
son mirroir debian.
3.10. L'étape updatebase (task_updatebase)
Informations |
Valeurs |
Localisation de la fonction |
subroutines-linux |
Scripts utilisés |
prepare_apt |
Fonctions utilisées |
|
Tâches réalisées :
- Met à jour la liste des paquets pour le système de
base décompressé lors de l'étape extrbase. Cette mise à jour est faite
par le script shell prepare_apt.
3.11. L'étape instsoft (task_instsoft)
Informations |
Valeurs |
Localisation de la fonction |
subroutines-linux |
Scripts utilisés |
install_packages |
Fonctions utilisées |
|
Tâches réalisées :
- Installe les packages en utilisant le
répertoire $FAI/package_config/. Cette fonction va appeler
le script Perl install_package pour réaliser l'installation
des packages selon les classes definies du client.
Le script install_packages utilise une librairie perl externe.
Cette librairie est présente dans le package libapt-pkg-perl.
- Copie le résultat du script install_packages
dans le fichier $LOGDIR/software.log.
 |
Le script install_packages n'est capable d'installer que des
packages debian. Il ne gére pas les packages rpm, yum,...
|
3.12. L'étape configure (task_configure)
Informations |
Valeurs |
Localisation de la fonction |
subroutines-linux |
Scripts utilisés |
fai-do-scripts |
Fonctions utilisées |
|
Tâches réalisées :
- Appelle les scripts du repertoire $FAI/scripts/
pour chaque classe définie du client. Cette étape permet de
réaliser la configuration du système avant la fin de
l'installation. Vous pouvez utiliser differents types de
scripts : Perl, shell, cfengine, expect. Pour réaliser des
traitements dans un script selon une classe définie, vous
avez à disposition des fonctions. Par exemple, FAI définit
la fonction ifclass en shell pour vous permettre de savoir
si la classe est définie.
3.13. L'étape finish (task_finish)
Informations |
Valeurs |
Localisation de la fonction |
subroutines-linux |
Scripts utilisés |
|
Fonctions utilisées |
|
Tâches réalisées :
- Affiche les informations sur le paramétrage réseau
et les disques durs
- Désactive les partitions swap définies dans $SWAPLIST
pour le nouveau système
- Démonte la partition proc du nouveau système.
3.14. L'étape chboot (task_chboot)
Informations |
Valeurs |
Localisation de la fonction |
subroutines-linux |
Scripts utilisés |
fai-chboot |
Fonctions utilisées |
|
Tâches réalisées :
- Change le système de démarrage du client en modifiant
des fichiers du serveur. Si le démarrage s'est effectué en
PXE, FAI appelle le script Perl fai-chboot pour effectuer ce changement.
Pour connaître le type de démarrage, FAI utilise la commande dmesg et
cherche si c'est un démarrage en BOOTP.
3.15. L'étape faiend (task_faiend)
Informations |
Valeurs |
Localisation de la fonction |
subroutines |
Scripts utilisés |
|
Fonctions utilisées |
|
Tâches réalisées :
- Attend la fin des processus en cours d'exécution
- Redémarre la machine sans devoir taper sur la touche
entrée si la fonction define_fai_flag a défini $reboot
- Synchronise les disques durs
- Démonte les partitions
- Redémarre le client.
4. Principe du système de classes
4.1. Introduction
FAI intègre un système de classes pour personnaliser l'installation d'une machine.
C'est à dire que grâce à ce système de classes, on pourra réaliser des tâches comme :
- Choisir des packages à installer
- Configurer des logiciels
- Réaliser vos tâches les plus folles ;)
Ce système de classes est présent dans le répertoire défini par
la variable $FAI.
Ce répertoire contient les répertoires :
- class/
- disk_config/
- files/
- hooks/
- package_config
- scripts
4.2. L'étape defclass en détail (task_defclass)
L'étape task_defclass va utiliser le répertoire class.
Les fichiers de ce répertoire vont permettre de récupérer
la liste des classes pour un client. Une classe est répresentée
par un nom.
Exemple de fichiers du répertoire class DEFAULT
01alias
09file.source
70partitions
HOSTNAME
LAST
L'étape task_defclass va permettre de récuperer une liste
de classe en parcourant ces fichiers qui ont des formats
differents.
Les fichiers DEFAULT, HOSTNAME et LAST ont pour format :
# un commentaire
MA_CLASSE1
UNE_AUTRE_CLASSE
#Mes classes pour installer XFREE
XFREE4
XFREE_GOODIES
Ces fichiers seront simplement lus pour récuperer les noms
des classes.
Les fichiers préfixés par un numéro sans extension .source
sont considérés comme des shell script.
Des opérations peuvent être effectuées dans ces fichiers.
Ces fichiers peuvent définir des classes en affichant sur
sa sortie standard le nom de la classe voulue.
L'étape task_defclass va récupérer la sortie de ces scripts
exécutés.
Les fichiers préfixés par un numéro avec l'extension .source
sont eux aussi des scripts shell. Mais ils sont chargés.
Ainsi, si des variables sont définies dans ces fichiers,
ils seront utilisables par d'autres scripts.
Cela pourra permettre de créer des systèmes de dépendances.
Ces fichiers peuvent aussi définir des classes en remplissant
la variable $newclasses (et non en affichant sur sa sortie le
nom de la classe).
La lecture de l'ensemble des fichiers se fait dans cet ordre de priorité :
- Fichier DEFAULT
- Fichiers préfixés par un numéro.
Ces fichiers sont exécutés dans l'ordre numérique. Si un
fichier 01alias.source et 01alias existe, 01alias.source est
exécuté avant 01alias.
- Fichier avec un nom identique à celui de la machine
- Fichier LAST.
Une fois que l'étape defclass a fini de récupérer la liste des classes.
Elle rajoute automatiquement les classes DEFAULT, le nom de la machine
et LAST à la liste.
4.3. Comment définir des classes selon les clients ?
Tout les clients vont utiliser le même répertoire class pour
définir ses classes. (Il est possible d'en utiliser un autre.
Il faut pour cela surcharger la tâche task_confdir et
monter un répertoire contenant d'autres classes par exemple).
Pour définir des classes selon le client, vous pouvez :
- Utiliser le nom de la machine. Ainsi, un fichier HOSTNAME
spécifique sera lu
- Utiliser dans les scripts des informations propre à
une machine comme l'IP, le réseau,...
- Jouer sur les dépendances.
Je ne le conseille pas pour garder une architecture la plus simple possible.
Cette liste de classe permettra ainsi aux étapes suivantes de réaliser
différentes opérations.
5. Les limitations de FAI
6. Bibliographie
Voici ci-dessous les liens utiles sur les points importants énoncés dans ce document.
7. Conclusion
Ce tutoriel est terminé. Je vous remercie de l'avoir lu.
Ce tutoriel ne se veut pas un guide de référence sur FAI et des erreurs ont pu se glisser dedans.
Je vous prie donc de m'envoyer les points imprécis ou éronnés sur nyal at redaction-developpez dot net. Des mise à jour seront
effectuées, ainsi que des ajouts de chapitre pour détailler certaines parties.
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur.
La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.
|