Projet de Systèmes I (licence 2001-2002)

L'auteur de cette page est : Jean-Baptiste Yunes

Généralités

Il s'agit d'implémenter un système de fichiers à la Unix par simulation au-dessus du système de fichiers d'Unix.

Ce projet devra être réalisé en langage C en utilisant les fonctions POSIX étudiées en cours. Il devra impérativement fonctionner sur les machines de l'UFR. Le travail pourra être effectué par groupe de quatre étudiants au plus. Un rapport devra être rédigé et rendu avant la soutenance. Les dates de remise des rapports et soutenance seront précisées ultérieurement.

Le système de fichier MiniFS

Un système de fichiers MiniFS est un ensemble d'objets nommés disques MiniFS. Un disque est un ensemble d'objets nommés noeuds destinés à contenir des données. Il existe deux types de noeuds : les répertoires et les fichiers. Un répertoire est un objet pouvant contenir des noms d'autres noeuds (répertoires ou fichiers). Les répertoires servent donc à nommer les objets.Ceci permet de construire sur un disque un arbre d'objets. Dans un tel arbre, un chemin qui part de la racine est appelé référence. L'arbre du système de fichiers est construit par montage (greffe) de la racine d'un disque sur un répertoire accessible depuis la racine du système (point de montage). Le montage rend visibles les références de la racine du disque monté, relativement au point de montage, et invisibles les références situées sous le point de montage. L'un des disques est distingué des autres et est appellé disque racine; il s'agit du premier disque monté (au démarrage) dont la racine sera la racine absolue du système de fichiers.

La simulation devra utiliser comme support des disques MiniFS un fichier du système hote.

Les disques MiniFS

Chaque disque (fichier Unix pour la simulation) est constitué de blocs de taille fixe (unité de lecture/écriture). Ces blocs étant répartis en trois classes : la zone de description, la zone des noeuds et la zone de données, chacune étant de taille fixe et connue. La zone des noeuds contient la liste des noeuds utilisés ou libres ainsi que les attributs associés aux noeuds; cette zone pouvant etre vue comme un tableau de structure noeud (voir plus bas). La zone de données contient les blocs de données associés aux noeuds voire certaines informations liées aux données (localisation).

#define TAILLE_BLOC             128 /* Unité: octets */
#define TAILLE_ZONE_DESCRIPTION   4 /* Unité: blocs */
#define TAILLE_ZONE_NOEUDS       12 /* Unité: blocs */
#define TAILLE_ZONE_DONNEES     240 /* Unite: blocs */
#define NOM_DISQUE_RACINE       "disk1" /* Nom du fichier Unix contenant les blocs du disque racine */

La zone des noeuds

Constituée de blocs contigus, elle contient la table des noeuds (donc morcelée par blocs).

#define NUMERO_BLOC_DEBUT_ZONE_NOEUDS 2
#define NOEUDS_PAR_BLOCS              (TAILLE_BLOC/sizeof(struct noeud))
#define NOEUD2BLOC(numero_noeud)      (numero_noeud/NOEUDS_PAR_BLOC+NUMERO_BLOC_DEBUT_ZONE_NOEUDS)
#define NOEUDINBLOC(numero_noeud)     (numero_noeud%NOEUDS_PAR_BLOC)

La structure d'un noeud

Un noeud est donc constitué d'attributs et de données. Sa représentation dans la zone des noeuds est de taille fixe et respecte la structure suivante :

struct noeud {
  short etat;
  short type;
  short taille;
  short liens;
  short blocs[12];
};
struct stat {
  short etat;
  short type;
  short taille;
  short liens;
};
typedef struct stat *stat_p;
#define NOEUD_LIBRE    0
#define NOEUD_UTILISE  1
#define EST_LIBRE(pn)  ((pn)->etat==NOEUD_LIBRE)
#define FIC            0
#define REP            1
#define IS_REP(pn)     ((pn)->type==REP)
...

Le champ etat (considéré comme un booléen) permet de déterminer si le noeud est libre ou utilisé (accessible à travers une référence).

Le champ type peut prendre l'une des deux valeurs (au moment de son allocation) : REP (pour un noeud répertoire) ou FIC (pour un noeud fichier).

Le champ taille contient la taille exprimée en octets de l'objet.

Le champ liens contient le nombre de noms associés au noeud.

Le champ blocs contient les numéros des premiers blocs de données associées au noeud. Le douzième entier pointe sur un bloc de données contenant la suite de la liste des blocs du noeud (le dernier entier de ce bloc pointant lui-meme sur un autre bloc de données contenant la suite de la liste ad lib.)

Les répertoires

Les répertoires sont des noeuds dont les données sont à interpréter de façon très particulière : il s'agit d'une liste de couples nom, numéro de noeud permettant d'associer à un noeud particulier (donc non libre) un nom que l'on pourra utiliser comme élément d'une référence. Une entrée de répertoire (couple) possède la structure suivante :

struct entree_repertoire {
  char  nom[30]; /* nom du lien associé au noeud */
  short numero;  /* numero du noeud associé au nom */
};
typedef struct entree_repertoire *entrep_p;

Le champ numéro doit contenir un numero de noeud valide lorsque l'entrée est occupée. Si l'entrée a été effacée, numéro doit être à zéro.

Le champ nom contient une chaine de caractères à la C (terminée par ASCII 0), mais jamais de longueur nulle! De plus les noms ne doivent pas contenir le caractère dit de séparation utilisé pour composer les noms en références.

La zone des données

Constituée de blocs, on peut en distinguer quatre types : les blocs de données des fichiers (sans structure particulière), les blocs de données associés aux répertoires, les blocs de données utilisés pour constituer la liste des blocs d'un noeud et les blocs de données libres.

La réalisation

On devra entres autres :

Les différentes fonctions devront etre conformes à la spécification suivante :

Recommandations

Il est recommandé de procéder avec beaucoup d'attention... Demandez-vous à quoi sert la zone de description d'un disque, ce que l'on y trouvera, où est placé le noeud racine d'un disque, etc. N'hésitez pas à rajouter ce qui semble manquer (à condition d'y réflechir à deux fois).

De plus, il est rappellé que les enseignants sont normalement disposés à répondre à vos questions, profitez-en.

S'il est conseillé d'échanger des informations entre différents groupes de travail, il n'est pas conseillé de copier les uns sur les autres. Le sujet est suffisamment libre d'interprétation pour que chaque groupe trouve une solution originale à chaque problème.