Petit Guide Unix


2. Le Système de Fichier UNIX



Najib TOUNSI ( ntounsi@emi.ac.ma)
Last update: Oct 1998

PRECEDENT SOMMAIRE SUIVANT


2.1. Un système Arborescent

UNIX se caractérise aussi par un système de fichiers (File System) hiérarchisé. Un fichier est un ensemble d'informations (données, documents, programmes etc...) stockées sur disque. Les fichiers sont groupés en répertoires, qui pouvent eux mêmes êtres regroupés en d'autres répertoires. On a ainsi une hiérarchie de fichiers. En d'autres termes, un répertoire (directory) est une liste de fichiers ou de sous répertoires.

Fig-3, Système de Fichier UNIX.
 

Un système de fichiers UNIX est un arbre à racine unique, appelée root [2] et symbolisée par le signe /. Les feuilles constituent les fichiers et les noeuds les répertoires. On peut distinguer deux types de répertoires: les répertoires systèmes et les répertoires utilisateurs. Les répertoires systèmes existent toujours et contiennent les fichiers systèmes. Leur nom est relativement standard (/usr /bin /usr/ucb...). Les répertoires utilisateurs, sont ceux créés par l'administrateur pour chaque utilisateur, et qui se trouvent normalement sous /usr/users. Sur la figures on peut voir deux répertoires utilisateurs ali et karima.

Il y a une notion importante qui est le répertoire courant (current working directory, noté .). C'est la position actuelle du système pour parcourir l'arbre. Par défaut, c'est le répertoire utilisateur (home directory), là où une personne est ramené après connexion. Pour l'administrateur (root) c'est la racine /. La commande pwd (print working directory) permet d'afficher le répertoire courant, et la commande cd (change directory) permet de changer ce répertoire. Exemple: On passe du répertoire ali au répertoire monRep sous ali par:

$ pwd
/usr/users/ali
$ cd monRep
$ pwd
/usr/users/ali/monRep

2.2. Désignation des Fichiers

Un fichier (ou répertoire) UNIX a un nom et éventuellement une extension (suffixe). Par exemple ali, hello.c etc... Il n'y a pas de règle précise de formation de l'identificateur d'un fichier, et n'importe quel caractère imprimable peut y figurer (sauf certains caractères, dits meta, qui ont un sens particulier pour le shell comme: *, ?, {, }, [, ], ! / etc. Voir Plus loin).

Cela dit, un nom de fichier n'a de sens que par rapport au répertoire courant. Dans la hiérarchie des fichiers UNIX, cela s'avère vite insuffisant car deux fichiers situés à des endroits différents peuvent avoir le même nom. Ce qui nécessite de citer les répertoires intermédiaires.

Un fichier UNIX se désigne par son chemin d'accès dans l'arbre (path). Il y'a deux types de chemins: chemin absolu et chemin relatif.

Un chemin absolu est la référence -unique pour un fichier- donnée à partir de la racine et où les répertoires intermédiaires sont cités nommément, séparés par la caractère /.

Exemples:

/usr/users/ali/hello.c
/usr/users/karima/tonRep/hello.c
/usr/users/karima/tonRep
/usr/bin

sont respectivement les chemins absolus des deux fichiers hello.c situés à des endroits différents, et des deux répertoires tonRep et bin (voir figure). On constatera qu'un chemin est absolu si il commence par /.

Un chemin relatif est une référence donnée par rapport au répertoire courant. Elle ne commence donc pas par /. Soit ali le répertoire courant.

hello.c est le fichier de ce nom sous ali
monRep/adresses est le fichier adresses sous le répertoire monRep sous ali

Une convention UNIX est de désigner le répertoire courant par le caractère point (.) et son parent par deux points (..). Ainsi, et toujours sous le répertoire ali

./hello.c est la même fichier que hello.c
../karima/tels est le fichier tels sous karima

Une erreur de jeunesse (ou mauvaise habitude DOS) est de considérer qu'il suffit de donner le nom d'un fichier pour le trouver (surtout si il s'agit d'une commande UNIX). Sinon on essai d'aller (par cd) vers le répertoire qui le contient - et qui peut être protégé- pour pouvoir l'utiliser. Cette manipulation marche pour des sous répertoires utilisateurs, mais pas pour les autres. On doit prendre l'habitude de désigner un fichier par son chemin.

En pratique, et pour éviter de taper leur chemin complet, le système UNIX offre une aide pour les noms de commandes. Ces noms sont cherchés sous le répertoire courant, sinon dans une liste de répertoire standards qui est donnée par la variable environnement path. Par exemple, si path = (/bin /usr/bin /usr/ucb/bin), alors la commande est cherchée dans les répertoires cités avant le répertoire courant.

2.3. Protection de Fichiers

UNIX offre un mécanisme de protection de fichiers simple et efficace. Toute personne ne peut pas utiliser n'importe quel fichier, et si oui, pas pour faire n'importe quel travail.

On peut accéder à un fichier pour:

Ces accès correspondent à ce qu'on veut faire d'un fichier (le QUOI). Ce sont des privilèges. Pour les droits d'accès à un fichiers (QUI peut accéder), UNIX distingue entre trois catégories d'utilisateurs:

Ces différentes informations constituent ce qu'on appelle le mode d'un fichier. UNIX le mémorise pour chaque fichier sous la forme de trois triplets formés des trois lettres r w oux ( pour read write et execute):

rwx rwx rwx

Dans l'ordre, on a les privilèges associés au propriétaire d'un fichier, ensuite les gens de son groupe et puis les autres. La négation d'un privilège est indiquée par la caractère (-). Par exemple:

rw- r-- r--

signifie droits de lecture/écriture pour le propriétaire et seulement le droit de lecture pour le groupe et les autres.

rwx r-x r-x

signifie tous les droits, lecture/écriture/exécution pour le propriétaire et seulement les droits de lecture/exécution pour le groupe et les autres.

La première configuration est souvent par défaut pour des fichiers non exécutables, alors que la seconde l'est pour des fichiers commandes exécutables. Les fichiers systèmes ont d'ailleurs ces deux configurations et leur propriétaire est l'administrateur root.

La commande UNIX "ls -l" permet d'afficher ces informations (entre autres).

$ ls -l hello.c
- rw-r--r--   1   tounsi   37   Feb 23 1996  hello.c

et la commande chmod (change mode) permet de changer les protections associées à un fichier. Un utilisateur qui fait

$ chmod g+w hello.c

donne à son groupe le privilège w sur le fichier hello.c (On y reviendra au [[section]]5.2 gestion des fichiers)

Maintenant que signifie lecture/écriture/exécuter pour un répertoire? Quand on fait "ls répertoire" par exemple, c'est pour lire un répertoire. Cela correspond à afficher son contenu, i.e. la liste des fichiers qu'il contient. Ecrire dans un répertoire par contre, signifie y rajouter un fichier (ou en supprimer un). Exécuter un répertoire signifie y rentrer (faire cd répertoire par exemple). On peut noter que l'absence du privilège x sur un répertoire, interdit d'ailleurs d'y lire ou d'y écrire quoi que ce soit (car il faut y entrer d'abord).

2.4. Typologie des Fichiers UNIX

IL y a plusieurs façons de classer ou de considérer les fichiers. Un fichier est flot d'octets ou ensemble d'enregistrements, texte ou binaire, exécutable ou non, régulier ou spécial etc. En fait, la distinction varie selon le contexte du discours (e.g. fichiers régulier du point de vue du système ou texte du point de vue utilisation...)

Fichiers Textes vs Fichiers Binaires

L'utilisateur peut classer ses fichiers avec des extensions appropriées comme .c .txt .c.old etc... . Certaines sont d'ailleurs exigées comme .c pour des programme écrits en C. C'est en générale une classification juste intuitive pour s'y retrouver dans la jungle des fichiers d'un répertoire. Une autre distinction, significative, entre fichiers c'est de considérer les fichiers textes (affichables et éditables) et les fichiers binaires (contenant une codification). Les fichiers textes sont dits aussi fichiers ASCII. Indépendamment de ce fait, un fichier est dit exécutable s'il peut tenir lieu de commande. Texte, c'est un fichier script contenant des commandes UNIX (voir section6.) et binaire, c'est un code machine reconnu par un processeur. La table suivante résume un peu la situation:
 

Fichiers Exécutables 

Fichiers Données 

Fichiers Binaires

Commandes
Binaires

Données 
Utilisateur

Fichiers ASCII 

Commandes 
Script Shell

Textes 
Utilisateur

Fig-4, Taxonomie des Fichiers.
 

La commande UNIX file distingue les fichiers de cette façon. Elle va même plus loin pour distinguer entre différents fichiers textes (ASCII, programme C etc...) et différents fichiers binaires (code exécutable ou fichiers données binaires).

$ file hello.c
hello.c: c program text
$ file adresses
adresses: ASCII text
$ file tonRep/data
data: data

Fichiers Réguliers vs Fichiers Spéciaux

Une autre typologie, plus orientée système d'exploitation, c'est fichier régulier, fichier spécial. En fait, et c'est là une bonne décision de conception, UNIX traite de la même façon tous les dispositifs externes d'entrées/sorties. Tous les échanges avec l'extérieur se font en terme de fichiers. Voire en flots d'octets. En particulier un terminal est vu comme constitué de deux fichiers, l'un fournissant des données en séquence et c'est le clavier, et l'autre sortant des données en séquence, et c'est l'écran. Ces fichiers sont dits spéciaux, par oppositions aux fichiers habituels, qui sont dits réguliers.

Les fichiers réguliers sont indiqués par un tirait (-), le premier caractère (avant le mode) quand on fait ls -l

$ ls -l hello.c
-rw-r--r-- 1 tounsi 37 Feb 23 1996 hello.c

Pour un répertoire il est remplacé par la lettre d, et pour un lien (voir plus loin), par l.

drwxr-xr-x 2 tounsi 512 Feb 23 1996 monRep

Les fichiers spéciaux sont indiqués par les lettres b ou c, selon le mode de transferts utilisé; par blocs (cas d'un support magnétique en général) ou caractère par caractère (cas d'un terminal par exemple). On trouve aussi s (socket) pour un port, et p (pipe) pour un tube. En voici quelques exemples (tirés du répertoire système /dev qui contient la liste des dispositifs d'entrées/sorties)

crw-rw-rw- 1 root 20, 2 Mar 21 16:38 /dev/ttyp2
crw-rw-rw- 2 root 54, 2 Mar 11 11:47 /dev/rfd0c
crw-rw-rw- 1 root 37, 69 Mar 15 1995 /dev/audio
srwxrwxrwx 1 root 0 Feb 9 10:15 /dev/printer
brw-r----- 1 root 7 , 0 Jul 27 1991 /dev/sd0a

Fichiers Standards d'Entrées/Sorties

Sous Unix, les entrées/sorties habituelles se font à travers deux fichiers logiques qui sont appelés fichiers standards E/S. Ils correspondent en générale (i.e. sauf indication contraire) au clavier et l'écran du terminal utilisateur. Nous y reviendrons plus loin (section 4.1).

PRECEDENT SOMMAIRE SUIVANT