Précédent Remonter

5  Structure physique du système de fichiers

Le système de fichiers utilise les blocs du volume sur lequel il réside de la manière suivante :
Bloc 0 : bloc de boot
Dans notre cas il est inutilisé.

Bloc 1 : super bloc
Il contient les informations générales du système. En particulier c'est le super bloc qui connaît l'état d'allocation des blocs et des i-noeuds : la zone des blocs libres est formée de deux sous-zones : une liste chaînée et une zone contiguë. Au départ, la zone contiguë contient tous les blocs libres et la liste chaînée est vide (la même technique est utilisée pour la zone des i-noeuds libres). Voici les informations que contient le super bloc ; ces informations sont organisées dans une structure de type SUPER_BLOC (figure 7) :
Lors de l'allocation d'un bloc ou d'un inoeud, on tente d'abord de l'allouer dans la zone contiguë. Si elle est vide alors on tente l'allocation depuis la liste chaînée. Une libération d'un bloc ou d'un inoeud est toujours faite dans la liste chaînée.

Le super bloc doit bien entendu tenir sur un seul bloc.

typedef u_short INOMBRE ;

typedef struct SUPER_BLOC {
   u_short    nb_blocs ;
   u_short    nb_inoeuds ;
   INOMBRE    i_contigu ; /* a partir de ce i_nombre, tous les i_noeuds sont libres */
   INOMBRE    i_chaine  ;
   NUM_BLOC   b_contigu ; /* a partir de ce bloc, tous les blocs sont libres */
   NUM_BLOC   b_chaine  ;
   char       magique [20] ; /* signature du systeme de fichier */
} SUPER_BLOC ;

typedef struct INOEUD_LIBRE {
   INOMBRE i_suiv ;  /* liste chainee des inoeuds libres */
} INOEUD_LIBRE ;

typedef union { /* definition complete */
   INOEUD_OCCUPE occupe ;
   INOEUD_LIBRE  libre ;
} INOEUD ;

typedef struct BLOC_LIBRE {
   NUM_BLOC b_suiv ; /* liste chainee des blocs libres */
} BLOC_LIBRE ;
 

Figure 7 : Définitions de types pour le super bloc




Blocs 2 à k : table des i-noeuds
Le nombre de i-noeuds est fixé une fois pour toutes à la création du système de fichiers. Chaque bloc de cette table contient un nombre entier de i-noeud (quitte à ce qu'il y ait de la place inutilisée dans ces blocs ; figure 8).

Un i-nombre est un indice dans cette table (à partir de 0). Le i-nombre 0 représente l'absence de i-noeud (ceci permet en particulier de marquer les entrées libres de répertoire), historiquement, le i-noeud 1 était utilisé pour mémoriser la liste des secteurs défectueux du disque, enfin le i-nombre 2 correspond toujours au répertoire racine. Après la création d'un système de fichiers, le premier i-nombre libre est donc toujours 3.

/* Nombre de inoeuds par bloc */
#define INOEUDS_PAR_BLOC (BLOC_SIZE/sizeof (INOEUD [1]))

Figure 8 : Définition complémentaire pour la table des i-noeuds (voir figure 3)




Blocs k+1 à N-1 : blocs restants
Ces blocs contiennent les informations utiles des fichiers ainsi que les blocs d'indirections.

En particulier, les répertoires sont rangés dans ces blocs selon la définition de type de la figure 9. Remarquez que la taille d'une entrée de répertoire, 16 octets, est un sous-multiple de celle d'un bloc.

#define LONGMAXNOM 14 

typedef struct ENTREE {
   INOMBRE i_nombre ;      /* NUM_NULL indique une entree libre */
   char nom [LONGMAXNOM] ;
} ENTREE ;

/* Nombre d'entrees de repertoire par bloc */
#define ENTREES_PAR_BLOC (BLOC_SIZE / sizeof(struct ENTREE [1]))

Figure 9 : Définition de type pour les entrées de répertoire


La définition du type BLOC unifie les différentes utilisations possibles des blocs (figure 10).

#define BLOC_SIZE 64
typedef char VOL_BLOC [BLOC_SIZE] ;

/* Nombre d'entrees de repertoire par bloc */
#define ENTREES_PAR_BLOC (BLOC_SIZE / sizeof(struct ENTREE [1]))

typedef union BLOC {
   VOL_BLOC opaque ;   /* fixe la taille du BLOC */
   BLOC_LIBRE bloc_libre ;
   SUPER_BLOC super_bloc ;
   INOEUD inoeuds [INOEUDS_PAR_BLOC] ;
   ENTREE entrees [ENTREES_PAR_BLOC] ;
   NUM_BLOC blocs [NUMEROS_PAR_BLOC] ;
} BLOC ;

Figure 10 : Définitions de types pour les blocs



Question 11   Il est dit que « le super bloc doit bien entendu tenir sur un seul bloc. » Donner une expression C qui assure que cette affirmation est vraie.

Question 12   Expliquez la définition du type union BLOC (figure 10). Donnez la fonction du bloc lors de l'utilisation de chacun des champs de l'union.

Question 13   On considère la commande ffs (faire fs) de création d'un système de fichiers. Quelles sont les informations à passer à cette commande. Donnez le fonctionnement de principe de la commande. Donnez un schéma d'un système de fichier juste créé.

Question 14   La commande df affiche un état de l'utilisation d'un volume. Elle reporte en particulier le nombre de blocs libres sur le volume. L'option df -i reporte le nombre d'inoeuds libres.

Question 15   La macro-définition IBLOC(i_nombre) retourne le numéro logique de bloc contenant le inoeud i_nombre. La macro-définition INDICE(i_nombre) retourne l'indice physique du i_nombre dans son bloc.

Question 16   Les entrées libres d'un répertoire sont identifiées par une valeur nulle (NUM_NULL) du champ i_nombre. Pourquoi est-il nécessaire d'identifier des entrées libres ?

Question 17   Étant donné le répertoire courant, la commande du -s retourne le nombre de blocs (ou d'octets, option -b) effectivement occupés par le répertoire et l'ensemble de ses entrées. (Voir la question 4.)

Question 18   Vérifiez que tout bloc est soit libre, soit alloué à un i-noeud. Vérifiez qu'un bloc n'est pas alloué à plusieurs inoeuds.

Question 19   Vérifiez que toute entrée dans la table des i-noeuds est soit libre soit affectées à une entrée dans le système de fichiers.

Question 20   Étant donné un i-nombre, listez toutes les entrées du système de fichiers qui lui sont associées.

Question 21   Vérifiez la cohérence du compteur de liens d'un répertoire.

Question 22   Reconstruire la liste des blocs libres, idem pour les i-noeuds


Précédent Remonter