Les systèmes de fichiers
Vision globale de l’organisation des disques
Pour l’utilisateur, le système de fichiers Unix apparaît comme une arborescence de répertoires dont la racine se nomme /.
Cette arborescence globale est très fréquemment constituée de plusieurs sous-arborescences qui sont rassemblées, lors du démarrage du système, par une opération dite de montage.
Une sous-arborescence est baptisée filesystem. Nous conserverons par la suite ce terme qui est bien ancré dans le vocabulaire des unixiens et plus précis qu’une traduction du style système de fichiers.
Selon les versions, les administrateurs système disposent de deux types d’organisation des disques. Il s’agit, d’une part, des partitions et, d’autre part, des volumes logiques. Un filesystem correspond concrètement à une structure physique qui occupe l’espace disque correspondant, soit à une partition, soit à un volume logique. Plusieurs types de filesystems sont disponibles selon les versions.
L’organisation physique des disques doit être complètement transparente pour les utilisateurs et les programmes. Sa maîtrise constitue une compétence essentielle de l’administrateur système.
Dans tous les cas, Unix requiert une région disque complémentaire baptisée historiquement zone de swap mais nommée plus souvent aujourd’hui espace de pagination. Cet espace permet l’implémentation de la mémoire virtuelle. Il est géré directement par le noyau et ne comporte pas, bien entendu, de structure de filesystem.
Signalons enfin que certaines sous-arborescences peuvent parfois se trouver physiquement sur une autre machine. L’opération de montage se fait alors à travers le réseau grâce notamment à l’application NFS (Network FileSystem), standard de fait TCP/IP pour le partage de fichiers.
Dans le cadre de cet ouvrage destiné à l’utilisateur du système, nous allons simplement présenter rapidement les concepts associés à l’organisation des disques.
1. Organisation classique en partitions
Dès l’installation du système lui-même ou lors d’un ajout ultérieur, un disque est divisé en partitions baptisées...
Panorama des différents types de filesystems
Pour que les partitions ou les volumes logiques puissent être utilisés comme des arborescences, il est nécessaire d’y créer une structure de filesystem.
La structure physique d’un filesystem peut se résumer ainsi :
-
des blocs de gestion
-
une table des inodes
Nous faisons à nouveau ici une référence en avant. La notion d’inode est précisée dans la suite de ce chapitre. Dans le répertoire où il se trouve, chaque fichier Unix est associé à un numéro d’inode. La dimension de la table des inodes correspondra au nombre maximum de fichiers du filesystem.
-
la zone des fichiers
L’espace disque est alloué par blocs. Les blocs disque occupés par un fichier sont retrouvés grâce aux informations d’adressage situées dans son inode. D’autre part, les blocs de gestion du filesystem permettent d’allouer rapidement des blocs libres.
Le détail de cette structure physique et les mécanismes d’allocation de l’espace disque se sont perfectionnés en termes de sécurité et de performance au fur et à mesure des années.
Dans un ordre chronologique, nous pouvons distinguer trois types de filesystems :
-
Type System V : cette première famille est obsolète aujourd’hui.
-
Type Berkeley : par rapport à la génération précédente, on dispose de meilleures performances (blocs disque plus grands, meilleurs algorithmes d’allocation...) et d’une plus grande fiabilité (redondance des blocs de gestion).
-
Type journalisé : il s’agit de la dernière génération et il correspond au type par défaut sur la majorité des versions Unix et Linux actuelles. Les performances en écriture sont meilleures et le mécanisme de journalisation accélère grandement les opérations de vérification lors du démarrage du système....
Types et désignations des fichiers
Un fichier Unix possède un type.
Nous pouvons énumérer quatre types principaux de fichiers :
Fichier ordinaire
Le noyau Unix considère un fichier comme une simple suite d’octets et ne distingue pas les types de contenu (texte, binaire...). Pour identifier la nature de ce contenu, il sera nécessaire de recourir à une commande qui lit le début du fichier (commande file, présentée dans le chapitre Sélection de commandes utiles).
Répertoire
De par le concept même d’arborescence, tout fichier, quel que soit son type, appartient à un répertoire.
Fichier spécial
Un fichier spécial est le nom d’un périphérique. Une des particularités des systèmes Unix consiste en effet à désigner les périphériques par l’intermédiaire de noms de fichiers situés dans le répertoire /dev. Le fait de désigner un fichier spécial, dans une commande appropriée, active implicitement le programme de gestion (driver) de ce périphérique.
Lien symbolique
Un lien symbolique contient le nom d’un autre fichier et joue le rôle de pointeur vers cet autre emplacement. Les liens symboliques sont apparus notamment pour permettre les évolutions de l’arborescence Unix en préservant la compatibilité avec les arborescences...
Parcours et visualisation de l’arborescence Unix
1. Commandes de base (pwd, cd, ls)
Pour découvrir concrètement l’organisation de l’arborescence Unix, nous allons introduire trois premières commandes de base :
pwd |
Nom complet du répertoire courant. |
cd |
Changement de répertoire courant. |
ls |
Affichage du contenu d’un répertoire. |
Exemples
$ pwd
/home/michel
$
Utilisation d’un chemin absolu :
$ cd /usr
$ pwd
/usr
$
Sans argument, la commande cd nous repositionne dans le répertoire de connexion.
$ cd
$ pwd
/home/michel
$
Utilisation d’un chemin relatif :
$ cd ../stage1
$ pwd
/home/stage1
$
La commande ls visualise, de façon plus ou moins détaillée, le contenu d’un répertoire donné en argument. Sans paramètre, elle traite le répertoire courant.
De nombreuses options sont disponibles.
Nous pouvons citer, parmi les plus intéressantes :
-l |
Affichage détaillé. |
-d |
Caractéristiques du répertoire lui-même (au lieu de lister son contenu). |
-i |
Affichage du numéro d’inode. |
-t |
Tri par date de modification. |
-u |
Affichage de la date de consultation (au lieu de la date de modification). |
-r |
Tri par ordre décroissant. |
-a |
Affichage des fichiers dont le nom commence par un . (point). |
-R |
Liste récursive de tous les sous-répertoires. |
Avec l’option -l, les renseignements affichés sont, de gauche à droite :
Type (sur une position)
d Répertoire
- Fichier ordinaire
l Lien symbolique
b ou c Fichier spécial (type bloc ou caractère)
Droits d’accès (sur 9 positions)
Il s’agit de trois combinaisons de trois permissions (r w x) correspondant respectivement au propriétaire, au groupe et aux autres (les comptes n’appartenant pas au groupe). La sémantique de ces droits d’accès sera détaillée à la fin de ce chapitre.
Nombre de liens
La notion de lien est également détaillée...
Commandes essentielles de manipulation des fichiers
Nous présentons maintenant quelques commandes essentielles concernant la manipulation des fichiers.
1. Visualiser le contenu de fichiers de texte (cat, pg, more, less)
La commande cat visualise le contenu des fichiers sans marquer de pause.
Les commandes pg, more ou less permettent une visualisation écran par écran en offrant diverses possibilités de défilement. Elles sont assez équivalentes en termes fonctionnel et l’utilisation de l’une ou l’autre dépend surtout des préférences de l’utilisateur.
Le développement parallèle de plusieurs familles de systèmes, lors des premières années de l’histoire d’Unix, explique parfois l’existence de diverses commandes assez équivalentes pour réaliser telle ou telle fonctionnalité.
a. La commande pg
Au bas de chaque écran, on obtient le caractère : (deux points) avec de nombreuses possibilités de défilement. Chaque action doit être validée par la touche [Entrée] du clavier. Les actions les plus usuelles sont :
+n |
Avancée de n écrans (le seul caractère [Entrée] provoque l’affichage de l’écran suivant). |
-n |
Remontée de n écrans. |
n |
Affichage de l’écran n. |
$ |
Affichage du dernier écran. |
/expr |
Recherche d’une expression vers le bas. |
?expr |
Recherche d’une expression vers le haut. |
!cde |
Exécution d’une commande du système. |
h |
Aide en ligne. |
q |
Fin de la commande. |
La commande peut être lancée avec des options :
-c |
Affichage par effacements successifs. |
-p%d |
Affichage du numéro de page au lieu du caractère :. |
+n |
Affichage à partir de la ligne de numéro n. |
+/expr |
Affichage à partir de la première apparition d’une expression. |
b. La commande more
Au bas de chaque écran, on obtient le message More suivi du pourcentage de fichier déjà affiché. Il existe alors de nombreuses possibilités de défilement qui n’ont pas besoin d’être validées par la touche [Entrée] du clavier. Les actions les plus usuelles sont :
Entrée |
Avancée d’une ligne. |
Espace |
Avancée d’un écran. |
b |
Remontée... |
Droits d’accès
1. Sémantique des permissions Unix
a. Permissions de base
Un fichier Unix, quel que soit son type, possède neuf permissions de base.
En effet, il faut considérer, vis-à-vis d’un fichier, trois catégories d’utilisateurs qui sont respectivement le propriétaire, le groupe et les autres (comptes n’appartenant pas au groupe).
Trois permissions seront éventuellement accordées à chacune de ces trois catégories. Il s’agit de la lecture (r), de l’écriture (w) et de l’exécution (x).
Ces permissions sont visualisées via l’option -l de la commande ls.
Exemple
$ ls -l fic
-rwxr-x--- 1 michel eni 3053 Dec 13 14:43 fic
$
Nous constatons, dans cet affichage, que le fichier ordinaire fic appartient au compte michel et au groupe eni. Son propriétaire possède les droits de lecture, d’écriture et d’exécution. Les membres du groupe eni possèdent les droits de lecture et d’exécution, mais pas celui d’écriture. Les comptes n’appartenant pas au groupe eni ne possèdent aucun droit.
La sémantique des permissions de base dépend du type de fichier.
En ce qui concerne les liens symboliques, nous pouvons dire que les permissions ne sont pas significatives. En effet, si nous positionnons des droits sur un lien symbolique, ces droits seront, en fait, attribués au fichier lié.
Par tradition, la commande ls fait apparaître, pour un lien symbolique, un masque virtuel avec des permissions complètes :
$ ls -l *toto
lrwxrwxrwx 1 michel eni 4 Sep 20 15:59 ltoto -> toto
-rw-r--r-- 1 michel eni 1727 Sep 20 15:59 toto
$
Les fichiers spéciaux représentent, quant à eux, des noms de périphériques. La lecture et l’écriture ont leur sémantique naturelle tandis que le droit d’exécution n’est pas significatif. Ces fichiers spéciaux ont, en général, pour propriétaire des comptes et des groupes système. L’utilisateur ordinaire se retrouve donc la plupart du temps dans la catégorie dite des autres. L’administrateur a toute latitude pour accorder ou non des droits aux utilisateurs pour certains périphériques externes tels que les lecteurs de bandes....
Récapitulatif des commandes à approfondir dans la documentation de référence
cat |
Affichage ou concaténation de fichiers. |
cd |
Changement de répertoire courant. |
chmod |
Gestion des permissions d’un fichier. |
cp |
Copie de fichiers. |
head |
Affichage des premières lignes. |
less |
Affichage page par page. |
ln |
Création de liens. |
ls |
Affichage du contenu d’un répertoire. |
mkdir |
Création de répertoires. |
more |
Affichage page par page. |
mv |
Changement de nom ou déplacement de fichiers. |
pg |
Affichage page par page. |
pwd |
Nom du répertoire courant. |
rm |
Suppression de fichiers. |
rmdir |
Suppression de répertoires vides. |
tail |
Affichage des dernières lignes d’un fichier. |
touch |
Modification de la date d’un fichier avec création éventuelle. |
umask |
Choix des droits par défaut. |
wc |
Nombre de lignes, de mots et de caractères. |
Quelques exercices
Pour cet enchaînement de commandes, se placer dans son répertoire de connexion et ne plus en bouger.
1) Modifier le masque de permissions par défaut afin que le groupe et les "autres" n’aient plus aucun droit.
2) Créer une hiérarchie de répertoires essai1/essai2/essai3.
3) Copier dans un fichier fic1 le fichier /etc/passwd (quelles vont être ses permissions ?).
4) Afficher le nombre de lignes de ce fichier.
5) Changer l’heure système de ce fichier (8h30 ce jour).
6) Créer un lien physique fic2 sur fic1.
7) Dupliquer fic2 en fic3.
8) Visualiser les numéros d’inodes des fichiers.
9) Déplacer tous ces fichiers dans essai1.
10) Supprimer fic1.
11) Visualiser le contenu de fic2.
12) Renommer fic2 en fic1.
13) Changer les permissions de fic1 pour qu’il ne soit accessible qu’en lecture et uniquement par son propriétaire.
14) Supprimer fic1 sans demande de confirmation.
15) Changer les permissions de essai1 pour que le groupe puisse y accéder mais sans pouvoir ni créer ni supprimer de fichiers dans ce répertoire.
16) Supprimer en une seule commande le répertoire essai1 et tout son contenu.
Solutions
1) Modifier le masque de permissions par défaut afin que le groupe et les "autres" n’aient plus aucun droit.
umask 077
2) Créer une hiérarchie de répertoires...