3.4. Structure du système de fichiers

Il est nécessaire de définir un peu les termes qui vont être utilisés dans cette section, car les systèmes de fichiers Unix sont très différents des systèmes de fichiers du DOS et de Windows. La connaissance de ce vocabulaire est nécessaire pour la compréhension de la structure du système de fichiers de Linux.

Comme la plupart des systèmes de fichiers, les systèmes de fichiers Unix sont structurés hiérarchiquement, et regroupent les fichiers dans des répertoires. Il existe un répertoire racine qui contient tous les fichiers soit directement, soit indirectement dans ses sous-répertoires. C'est de ce répertoire que débutent tous les chemins possibles dans le système de fichiers. Chaque fichier ou répertoire a un nom qui permet aux utilisateurs du système de l'identifier. Le seul répertoire qui n'a pas de nom est le répertoire racine. Les systèmes de fichiers Unix n'ont pas les mêmes limitations sur les noms que les systèmes de fichiers FAT et FAT32. Les noms des fichiers et des répertoires peuvent être très longs (jusqu'à 256 caractères par nom), et ils prennent en compte la casse des lettres.

Les fichiers contiennent des données au sens large, ce peut être des documents (texte, image, film, son), des programmes, des données utilisées par le système ou tout autre type de donnée imaginable. En fait, les répertoires sont eux-mêmes des fichiers spéciaux, interprétés par le système différemment des autres fichiers. Les données stockées dans les répertoires sont simplement les entrées de répertoires, qui caractérisent et permettent d'avoir accès aux autres fichiers et aux autres répertoires.

Les noms de répertoires et de fichiers sont séparés par un caractère spécial. Ce caractère est traditionnellement, sous Unix, la barre oblique de division (nommée « slash » en anglais) : '/'. Les utilisateurs du DOS et de Windows prendront garde ici au fait que Microsoft a préféré la barre oblique inverse (nommée « backslash » en anglais) '\', rendant ainsi tous ses systèmes incompatibles avec les systèmes Unix, et générant ainsi beaucoup de problèmes supplémentaires là où il n'était pas nécessaire d'en avoir (sincèrement, le coût de cette ânerie, ainsi que celle des marqueurs de fin de ligne dans les fichiers textes, doit atteindre des sommes astronomiques dans tous les projets de portage ou de développement d'applications portables). Comme le répertoire racine n'a pas de nom, il peut être accédé directement avec un simple slash :

/

La qualification complète d'un fichier se fait en précisant le nom du répertoire à chaque niveau et en séparant par des slashes chacun de ces noms. Cette qualification porte le nom de « chemin » d'accès (« path » en anglais). L'exemple suivant vous montre l'allure d'un chemin d'accès typique sous Unix :

/home/dupond.jean/lettres/professionnelles/marketing/ventes1999.sdw

La longueur maximale d'un chemin d'accès est de 4 ko dans le système de fichiers EXT2.

Les utilisateurs du DOS et de Windows constateront ici que les chemins d'accès Unix ne comportent pas de spécification de lecteur. Les systèmes de fichiers Unix sont dits mono-têtes, ce qui signifie qu'ils n'ont qu'un seul point de départ : le répertoire racine (alors que les systèmes Microsoft sont multi-têtes, puisqu'ils ont un point de départ par lecteur et par partition). Le fait de n'avoir qu'un seul point de départ est beaucoup plus simple et permet, encore une fois, d'écrire les programmes plus simplement et donc avec moins de bogues potentiels. Je sens tout de suite venir la question de la part des habitués du DOS : « Mais alors, comment spécifie-t-on le lecteur que l'on veut utiliser ? ». Cette question a deux réponses. Premièrement, on n'accède pas aux lecteurs, mais aux systèmes de fichiers. Les utilisateurs du DOS devront donc réapprendre qu'un lecteur représente un périphérique physique, et qu'il est possible qu'il contienne plusieurs systèmes de fichiers. Ils devront également se rendre compte qu'un système de fichiers n'est pas nécessairement stocké sur un lecteur : il peut être stocké dans un fichier (c'est le cas par exemple pour les images disques de CD-ROM), accessible par le réseau (c'est le cas des systèmes de fichiers réseau, « Network File System » en anglais), ou encore généré par un composant du système (c'est le cas des systèmes de fichiers virtuels du noyau). La question n'a donc pas beaucoup de sens telle quelle. Cependant, le problème de l'accès aux systèmes de fichiers se pose malgré tout. La réponse à ce problème-ci est cette fois la suivante : pour accéder à un système de fichiers, il faut réaliser une opération que l'on nomme le « montage ». Cette opération associe le répertoire racine de ce système de fichiers à l'un des répertoires de l'arborescence existante. Ce répertoire est couramment appelé « point de montage ». Par exemple, il est courant de monter le lecteur de disquette dans le répertoire /floppy/. Ainsi, si la disquette contient le fichier ventes1999.sdw, ce fichier sera accessible grâce au chemin suivant :

/floppy/ventes1999.sdw

Cette solution permet d'accéder à tous les systèmes de fichiers de la même manière, à partir d'un seul répertoire racine, que ces systèmes de fichiers soient EXT2, FAT, ISO9660, NTFS ou Amiga... En pratique, c'est nettement plus simple.

L'opération de montage peut réaliser bien plus d'opération qu'une simple association d'un système de fichiers à un point de montage. En effet, elle peut générer les opérations suivantes :

On prendra en particulier garde à toujours démonter les systèmes de fichiers pour les lecteurs amovibles. Linux utilise en effet des zones de la mémoire que l'on appelle les tampons (« buffers » en anglais), pour y stocker les données des systèmes de fichiers montés, et il n'écrit ces données que lorsque c'est nécessaire. Ce mécanisme permet d'accélérer les lectures et les écritures sur les disques, mais a l'inconvénient de nécessiter une requête de vidange des tampons (opération que l'on appelle « sync ») avant de retirer le lecteur ou avant d'éteindre le système. Si on ne le fait pas, des données seront certainement perdues. Le système effectue le sync lorsqu'il s'arrête (par l'une des commandes halt, shutdown ou reboot), mais il ne le fait pas si on coupe le courant brutalement. C'est pour cela qu'il faut toujours arrêter le système proprement. De manière similaire, Linux empêche l'éjection des CD-ROM tant qu'ils sont montés. En revanche, il ne peut rien faire pour les lecteurs de disquettes, c'est à l'utilisateur de prendre garde à les démonter avant de retirer la disquette.

Deux derniers points auxquels les utilisateurs de DOS et Windows devront faire attention :

Nous allons à présent nous intéresser à l'organisation du système de fichiers de Linux. Ce système de fichiers contient un certain nombre de répertoires et de fichiers standards, qui ont chacun une fonction bien définie. Cette structure standard permet de gérer tous les systèmes Linux de manière homogène : les programmes savent où trouver ce dont ils ont besoin. Ils sont donc portables d'un système à un autre, et les utilisateurs ne sont pas dépaysés lorsqu'ils changent de machine (en fait, cette structure est à peu près la même pour tous les systèmes Unix, ce qui donne encore plus de poids à l'argument précédent).

Cette organisation standard du système de fichiers a été conçue de telle manière que les données et les programmes sont placés chacun à leur place, et qu'ils puissent être facilement intégrés dans un réseau. L'intégration dans un réseau sous-entend que les fichiers des programmes peuvent être partagés par les différentes machines de ce réseau, ce qui permet d'économiser beaucoup de place. De plus, il est possible d'accéder à la plupart des ressources du système grâce à une interface uniforme. En particulier, il est possible d'accéder à tous les périphériques installés sur l'ordinateur par l'intermédiaire de fichiers spéciaux, et on peut récupérer des informations sur le système mises à disposition par le noyau simplement en lisant des fichiers générés par un pseudo système de fichiers. Le tableau suivant décrit les principaux éléments de l'arborescence du système de fichiers de Linux.

Tableau 3-2. Hiérarchie standard du système de fichiers

RépertoireSignification
/

Répertoire racine. Point de départ de toute la hiérarchie du système de fichiers. Le système de fichiers contenant ce répertoire est monté automatiquement par le noyau pendant l'amorçage du système. Ce système de fichiers est appelé système de fichiers racine (« root » en anglais).

/boot/

Répertoire contenant le noyau de Linux et ses informations de symboles. Ce répertoire est parfois le point de montage d'un système de fichiers de très petite taille, dédié au noyau. Dans ce cas, il est recommandé que le système de fichiers correspondant soit monté en lecture seule. On notera que sur certains systèmes, le noyau reste placé dans le répertoire racine. Cette technique n'est pas recommandée, car on ne peut pas monter en lecture seule la partition racine en utilisation normale du système.

/boot/vmlinuz

Noyau comprimé de Linux. Les noyaux comprimés se décompriment automatiquement lors de l'amorçage du système. Sur certains systèmes, le noyau est encore placé dans le répertoire racine du système de fichiers.

/boot/System.map

Fichier système contenant la liste des symboles du noyau. Ce fichier est utilisé par certains programmes donnant des renseignements sur le système. En particulier, il est utilisé par le programme « top » (programme qui indique la liste des principaux processus actifs) afin de donner le nom de la fonction du noyau dans lequel un processus se trouve bloqué lorsqu'il est en attente de la fin d'une opération que le noyau doit exécuter pour lui.

/dev/

Répertoire contenant tous les fichiers spéciaux permettant d'accéder aux périphériques. Sous Linux, la plupart des périphériques sont accessibles au travers de fichiers spéciaux, grâce auxquels l'envoi et la réception des données vers les périphériques peuvent être réalisés de manière uniforme. Il existe un tel fichier pour chaque périphérique, et ils sont tous placés dans ce répertoire. Les distributions installent souvent dans ce répertoire les fichiers spéciaux pour la plupart des périphériques, même s'ils ne sont pas physiquement présents dans la machine. Dans ce cas, les opérations sur les fichiers spéciaux des périphériques non installés seront tout simplement refusées par le noyau. Une autre possibilité est d'utiliser un système de fichiers virtuel, géré directement par le noyau. Le répertoire /dev/ ne contient dans ce cas que les fichiers spéciaux des périphériques pour lesquels le noyau dispose d'un gestionnaire intégré ou chargé dynamiquement. Quelle que soit la technique utilisée, ce répertoire doit être impérativement placé dans le système de fichiers racine.

/sbin/

Répertoire contenant les commandes systèmes nécessaires à l'amorçage et réservées à l'administrateur. Ce répertoire doit être impérativement placé dans le système de fichiers racine. En général, seul l'administrateur utilise ces commandes.

/bin/

Répertoire contenant les commandes systèmes générales nécessaires à l'amorçage. Ce répertoire doit être impérativement placé dans le système de fichiers racine. Tous les utilisateurs peuvent utiliser les commandes de ce répertoire.

/lib/

Répertoire contenant les bibliothèques partagées (« DLL » en anglais, pour « Dynamic Link Library ») utilisées par les commandes du système des répertoires /bin/ et /sbin/. Ce répertoire doit être impérativement placé dans le système de fichiers racine.

/lib/modules/

Ce répertoire contient les modules additionnels du noyau. Les modules sont des composants logiciels du noyau, mais qui ne sont pas chargés immédiatement pendant la phase d'amorçage du système. Ils peuvent en revanche être chargés et déchargés dynamiquement, lorsque le système est en fonctionnement. Il est fortement recommandé que ce répertoire soit placé dans le système de fichiers racine.

/etc/

Répertoire contenant tous les fichiers de configuration du système. Ce répertoire doit être impérativement placé dans le système de fichiers racine.

/etc/X11/

Répertoire contenant les fichiers de configuration de l'environnement graphique XWindow. Dans certaines distributions, ces fichiers sont placés directement dans le répertoire /etc/, mais ce n'est pas une technique recommandable.

/etc/opt/

Répertoire contenant les fichiers de configuration des applications.

/tmp/

Répertoire permettant de stocker des données temporaires. En général, /tmp/ ne contient que des données très éphémères. Il est préférable d'utiliser le répertoire /var/tmp/. En effet, le répertoire /tmp/ ne dispose pas nécessairement de beaucoup de place disponible.

/usr/

Répertoire contenant les fichiers du système partageables en réseau et en lecture seule.

/usr/bin/

Répertoire contenant la plupart des commandes des utilisateurs.

/usr/sbin/

Répertoire contenant les commandes systèmes non nécessaires à l'amorçage. Ces commandes ne sont normalement utilisées que par l'administrateur système.

/usr/lib/

Répertoire contenant les bibliothèques partagées de tous les programmes de /usr/bin/ et /usr/sbin/ et les bibliothèques statiques pour la création de programmes.

/usr/include/

Répertoire contenant les fichiers d'en-têtes du système pour le compilateur C/C++. Les fichiers de ce répertoire sont utilisés pour réaliser des programmes dans les langages de programmation C et C++.

/usr/X11R6/

Répertoire contenant X11R6 et ses applications. Ce répertoire contient des sous-répertoires bin/, lib/ et include/, où se trouvent les exécutables de XWindow, les bibliothèques et les fichiers d'en-têtes pour créer des programmes pour XWindow en C et C++.

/usr/src/

Répertoire contenant les fichiers sources du noyau et des applications de la distribution. Normalement, ce répertoire ne doit contenir que le code source des applications dépendantes de la distribution que vous utilisez.

/usr/src/linux/

Sources du noyau de Linux. Il est vivement recommandé de conserver les sources du noyau de Linux sur son disque, afin de pouvoir changer la configuration du système à tout moment.

/usr/local/

Répertoire contenant les programmes d'extension du système indépendants de la distribution. Ce n'est toutefois pas le répertoire d'installation des applications, que l'on installera en général dans le répertoire /opt/. « local » ne signifie pas ici que les programmes qui se trouvent dans ce répertoire ne peuvent pas être partagés sur le réseau, mais plutôt que ce sont des extensions du système qu'on ne trouve donc que localement sur un site donné. Ce sont donc les extensions qui ne font pas partie de la distribution de Linux utilisée, et qui doivent être conservées lors des mises à jour ultérieures de cette distribution. Ce répertoire contient les sous-répertoires bin/, lib/, include/ et src/, qui ont la même signification que les répertoires du même nom de /usr/, à ceci près qu'ils ne concernent que les extensions locales du système, donc indépendantes de la distribution.

/var/

Répertoire contenant toutes les données variables du système. Ce répertoire contient les données variables qui ne pouvaient pas être placées dans le répertoire /usr/, puisque celui-ci est normalement accessible en lecture seule.

/var/tmp/

Répertoire contenant les fichiers temporaires. Il est préférable d'utiliser ce répertoire plutôt que le répertoire /tmp/.

/var/opt/

Répertoire contenant les données variables des applications.

/var/log/

Répertoire contenant les traces de tous les messages système. C'est dans ce répertoire que l'on peut consulter les messages d'erreurs du système et des applications.

/var/spool/

Répertoire contenant les données en attente de traitement. Les travaux d'impression en cours, les mails et les fax en attente d'émission, les travaux programmés en attente d'exécution sont tous stockés dans ce répertoire.

/var/locks/

Répertoire contenant les verrous sur les ressources système. Certaines ressources ne peuvent être utilisées que par une seule application (par exemple, un modem). Les applications qui utilisent de telles ressources le signalent en créant un fichier de verrou dans ce répertoire.

/var/cache/

Répertoire contenant les données de résultats intermédiaires des applications. Les applications qui doivent stocker des résultats intermédiaires doivent les placer dans ce répertoire.

/opt/

Répertoire contenant les applications. C'est dans ce répertoire que les applications qui ne font pas réellement partie du système doivent être installées. Les applications graphiques devraient être installées dans ce répertoire. C'est en particulier le cas des gestionnaires de bureau. Les seules applications graphiques considérées comme faisant partie du système sont les applications de X11, qui sont donc stockées dans /usr/X11R6/. Il est recommandé que ce répertoire soit placé sur un système de fichiers en lecture seule, et que les applications utilisent le répertoire /var/opt/ pour travailler.

/home/

Répertoire contenant les répertoires personnels des utilisateurs. Il est bon de placer ce répertoire dans un système de fichiers indépendant de ceux utilisés par le système.

/root/

Répertoire contenant le répertoire personnel de l'administrateur. Il est donc recommandé que le répertoire personnel de l'administrateur soit placé en dehors de /home/ pour éviter qu'un problème sur le système de fichiers des utilisateurs ne l'empêche de travailler. Toutefois, il est important que l'administrateur puisse travailler même si les répertoires /root/ et /home/root/ ne sont pas présents. Dans ce cas, son répertoire personnel sera le répertoire racine.

/mnt/

Répertoire réservé au montage des systèmes de fichiers non-permanents (CD-ROM, disquettes, etc.). Ce répertoire peut contenir plusieurs sous-répertoires pour chaque périphérique amovible, afin de permettre d'en monter plusieurs simultanément. Notez qu'il est assez courant de disposer de liens symboliques dans la racine référençant les principaux systèmes de fichiers, afin d'en simplifier l'accès. Par exemple, il est courant d'avoir un répertoire /floppy/ référençant le lecteur de disquette et un répertoire /cdrom/ référençant le lecteur de CD-ROM.

/lost+found/

Répertoire contenant les données récupérées lors de la réparation d'un système de fichiers endommagé. Ces données sont écrites par les utilitaires de vérification et de réparation des systèmes de fichiers lorsqu'ils trouvent des informations qui ne peuvent être rattachées à aucun fichier existant, ainsi, il est possible de récupérer ces informations si elles ne sont pas dans un état de détérioration trop avancé.

/proc/

Répertoire contenant le pseudo système de fichiers du noyau. Ce pseudo système de fichiers contient des fichiers permettant d'accéder aux informations sur le matériel, la configuration du noyau et sur les processus en cours d'exécution.

Note : Les informations données ici peuvent ne pas être correctes pour votre distribution. En effet, certaines distributions utilisent une structure légèrement différente. Les informations données ici sont conformes à la norme de hiérarchie de systèmes de fichiers version 2.0 (« FHS » en anglais). Vous pouvez consulter ce document pour une description exhaustive du système de fichiers de Linux.

Vous avez pu constater que les répertoires bin/, lib/, include/ et src/ apparaissent régulièrement dans la hiérarchie du système de fichiers. Cela est normal : les répertoires sont classés par catégorie d'applications et par importance. Les répertoires bin/ contiennent en général les programmes, et les répertoires lib/ les bibliothèques partagées par ces binaires. Cependant, les répertoires lib/ peuvent aussi contenir des bibliothèques statiques, qui sont utilisées lors de la création de programmes. En général, tous les systèmes Unix fournissent en standard un compilateur pour réaliser ces programmes. Dans le cas de Linux, ce compilateur est « gcc » (pour « GNU C Compiler »). La création d'un programme nécessite que l'on dispose des fichiers sources, qui contiennent le programme écrit dans un langage de programmation, des fichiers d'en-têtes, qui contiennent les déclarations de toutes les fonctions utilisables, et des fichiers de bibliothèques statiques, contenant ces fonctions. Ces différents fichiers sont stockés respectivement dans les répertoires src/, include/ et lib/. Les notions de sources et de compilation seront décrites en détail dans le Chapitre 7.