IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

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 :

  1. Démarrage de la machine et récupération d'un noyau (Linux lors de ce tutoriel)
  2. Démarrage avec ce noyau
  3. 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 :

  1. fai_init
  2. task_confdir
  3. task_setup
  4. task_defclass
  5. task_defvar
  6. task_partitions
  7. task_mountdisks
  8. task_extrbase
  9. task_mirror
  10. task_updatebase
  11. task_instsoft
  12. task_configure
  13. task_finish
  14. task_chboot
  15. 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 :

  1. Charge le fichier /etc/fai.conf
  2. 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.
  3. 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.
  4. 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)

Informations Valeurs
Localisation de la fonction subroutines-linux
Scripts utilisés get-boot-info
create_resolv_conf
Fonctions utilisées define_fai_flags
get_fai_dir
get_fai_cvs
Tâches réalisées :

  1. 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
  2. Charge le fichier boot.log. Ainsi, les variables comme l'IP de la machine sont utilisables
  3. 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
  4. 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
  5. 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
  6. 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 :

  1. Charge le fichier subroutines se situant dans le répertoire $FAI/hooks/ s'il est présent
  2. Configure l'horloge en utilisant les commandes rdate ou ntpdate
  3. 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.
  4. Crée deux terminaux virtuels pour se connecter au client
  5. Lance un serveur SSH pour une connexion à distance
  6. 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 :

  1. Appelle le script-shell fai-class pour récupérer la liste des classes du client.
Pour plus informations sur le sujet, veuillez vous référer au chapitre consacré au système de classe.

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 :

  1. 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
  2. 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
  3. 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 :

  1. 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
  2. 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 :

  1. Active les partitions de swap en utilisant la variable $SWAPLIST
  2. 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 :

  1. 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
  2. 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 :

  1. 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 :

  1. 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 :

  1. 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.
  2. 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 :

  1. 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 :

  1. Affiche les informations sur le paramétrage réseau et les disques durs
  2. Désactive les partitions swap définies dans $SWAPLIST pour le nouveau système
  3. 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 :

  1. 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 :

  1. Attend la fin des processus en cours d'exécution
  2. Redémarre la machine sans devoir taper sur la touche entrée si la fonction define_fai_flag a défini $reboot
  3. Synchronise les disques durs
  4. Démonte les partitions
  5. 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é :

  1. Fichier DEFAULT
  2. 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.
  3. Fichier avec un nom identique à celui de la machine
  4. 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.