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) :
-
taille en blocs du volume ;
- nombre total de i-noeuds ;
- premier i-noeud libre dans la liste chaînée des
i-noeuds libres. Initialement, cette liste est vide ;
- premier i-noeud libre dans la zone contiguë des
i-noeuds libres, initialement c'est le 2 (avant création
de la root) ;
- premier bloc libre dans la liste chaînée des bloc libres.
Initialement, cette liste est vide ;
- premier bloc libre dans la zone contiguë des bloc libres.
Cette zone s'étend depuis depuis ce bloc jusqu'au bloc N-1
du volume. Initialement c'est le bloc k+1 (avant création du
répertoire root) ;
- un numéro magique pour s'assurer qu'au montage d'un volume
on a bien à faire à un système de fichiers.
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