next up previous contents
Next: 2.3 Utilisateurs : droits et devoirs [YB] Up: 2. Premières courses Previous: 2.1 Notions d'architecture matérielle [YB]

Sous-sections

2.2 Le système de fichiers de Linux en détail

Nous détaillons ici quelques aspects importants du système de fichier de Linux. Il n'est pas utile de parfaitement maîtriser toutes les notions abordées ici (notamment celles de la section 2.2.5, assez technique sur les profondeurs du système de fichiers, qui n'est présente que pour votre culture), mais au moins nous vous recommandons d'en avoir une connaissance générale.

2.2.1 Accès aux périphériques, au matériel2.13 [YB]

Comme nous l'avions évoqué au début de cet ouvrage, les systèmes Unix - et donc Linux - accèdent aux éléments matériels de la machine par l'intermédiaire de fichiers spéciaux.

Sous Linux, ces fichiers sont tous regroupés dans le répertoire /dev (comme device, périphérique en français). Le principe de fonctionnement de ces fichiers est un peu particulier, et leurs noms sont (plus ou moins) normalisés. Un fichier spécial du répertoire /dev est caractérisé par deux nombres, les numéros majeur et mineur2.14. Considérons l'affichage suivant :

[yves@kafka yves]$ ls -l /dev/hda

brw-rw-- 1  root  disk  3,   0  May  5  1998 /dev/hda

[yves@kafka yves]$ ls -l /dev/ttyS1

crw-r-r- 1  root  root  4,  65  Apr 23 13:39 /dev/ttyS1

Les numéros majeurs et mineurs apparaissent juste avant la date. Décrivons-les.

Le numéro majeur correspond à un périphérique donné : par exemple, 03 correspond au premier port IDE sur la carte mère, et les disques associés sont désignés par des fichiers dont le nom commence par hda pour le disque maître, hdb pour le disque esclave. Ainsi, le fichier /dev/hda est un accès direct au premier disque dur, pris dans sa globalité, en tant que suite ininterrompue d'octets pratiquement non structurée. Inutile de préciser qu'il vaut mieux éviter d'écrire dans ce fichier ! Le début est notamment la Table des Partitions, à manier avec délicatesse... Voir la section 2.1.3.1 page [*] pour plus de détails concernant les partitions des disques.

Le numéro mineur correspond à une subdivision du périphérique. Dans le cas du port IDE évoqué plus haut, les mineurs à partir de 1 numérotent les partitions du premier disque (le disque maître), les mineurs à partir de 65 numérotent les partitions du second disque (le disque esclave). Par exemple, /dev/hda5 (dont on note les caractéristiques par 03:05) désigne la première partition logique du disque dur maître sur le premier port IDE, tandis que /dev/hdb2 (dont on note les caractéristiques par 03:66) désigne la deuxième partition primaire du disque dur esclave sur le premier port IDE.

Sauf situation assez exceptionnelle, vous n'aurez que très rarement à utiliser directement ces fichiers spéciaux. Un exemple d'une telle situation est lorsque le besoin de prendre une image d'une disquette se présente, par exemple pour la dupliquer.

Le fichier spécial correspondant au premier lecteur de disquette est /dev/fd0 (02:00). Pour dupliquer une disquette en conservant très précisément sa structure (notamment s'il s'agit d'une disquette de démarrage), la première étape consiste à prendre une image de la disquette :

cp /dev/fd0 disk.img

Cette commande (notez l'utilisation de la commande usuelle cp) va lire la disquette octet par octet (ou plutôt secteur par secteur), sans s'occuper de sa structure et encore moins du système de fichier qu'elle contient (qu'il soit de type Linux, MS-DOS, ou autre). Le résultat est placé dans le fichier disk.img dans le répertoire courant. Ce fichier est ce qu'on appelle une image de la disquette (d'où son extension).

La seconde étape (après avoir changé la disquette dans le lecteur !) est exactement symétrique de la première :

cp disk.img /dev/fd0

... va écrire le fichier image sur la disquette dans le lecteur, vous aurez alors une copie absolument exacte de la disquette originale, au bit près.

Ceci peut évidemment se généraliser aux disques durs ou CDROMs. Mais attention ! Si vous avez une partition désignée par exemple par /dev/hda7, d'une taille de 900 Mo, la commande :

cp /dev/hda7 disk.img

... va vous créer un fichier de 900 Mo dans le répertoire courant ! Donc prenez garde à avoir la place...

Enfin et pour finir, Linux effectue une distinction entre les périphériques de caractères (character devices) et les périphériques par blocks (block devices). La différence apparaît dans l'exemple plus haut sur le premier caractère de la ligne résultant du ls : 'c' pour caractères, 'b' pour blocs. Les périphériques de caractères ont comme caractéristique de transmettre et recevoir les informations octet par octet : c'est par exemple le cas des ports séries ou parallèles, des modems, etc. Par contre, les périphériques par blocks transmettent ou reçoivent les informations sous forme de paquets d'octets, d'une taille fixe : c'est par exemple le cas des supports de mémoire de masse (disquettes, disques durs...). Ainsi, un même couple majeur/mineur peut désigner deux périphériques différents, selon que l'on considère un périphérique de caractères ou un périphérique par blocks.

Pour plus d'informations concernant les fichiers spéciaux du répertoire /dev, consultez le fichier devices.txt qui se trouve normalement dans le répertoire /usr/src/linux/Documentation. A titre indicatif, voici quelques fichiers avec les périphériques associés dans le tableau 2.1. La colonne B/C indique s'il s'agit d'un périphérique de caractères ou un périphérique par blocks.


 
Tableau 2.1: Quelques fichiers spéciaux et les périphériques associés

Fichier Majeur Mineur B/C Périphérique
/dev/mem 1 1 c accès direct à la mémoire centrale
/dev/fd0 2 0 b premier lecteur de disquettes
/dev/hda 3 0 b disque maître sur le premier port IDE
/dev/hda2 3 2 b seconde partition primaire sur ce disque
/dev/hdb 3 64 b disque esclave sur le premier port IDE
/dev/hdb5 3 69 b première partition logique sur ce disque
/dev/tty1 4 1 c première console virtuelle
/dev/lp0 6 2 c troisième port parallèle (imprimante)
/dev/sda 8 0 b premier disque dur SCSI
/dev/sda3 8 3 b troisième partition sur ce disque
/dev/sdb 8 16 b deuxième disque dur SCSI
/dev/psaux 10 1 c port PS/2 (souris)
/dev/kdb 11 0 c accès direct au clavier
/dev/scd0 11 0 b premier CD-ROM SCSI
/dev/sequencer 14 1 c séquenceur de la carte son
/dev/hdc 22 0 b disque maître sur le second port IDE
/dev/video0 81 0 c Acquisition vidéo

et ainsi de suite... la liste complète occuperait plusieurs pages !


  
2.2.2 L'arborescence unique et les systèmes de fichiers : notion de montage [YB]

Affirmons-le encore une fois : sous système Unix, et donc sous Linux, tout est fichier. Notamment, toutes les informations auxquelles accède le système sont incluses dans une arborescence unique, qu'elles soient sur le même support physique que le système ou sur des supports différents (autres partitions, disques, CD-ROMs, etc.)

D'où la notion de système de fichier : un système de fichier, en gros, désigne une partition sur un support physique quelconque. Dans le cas d'une disquette ou d'un CD-ROM, cela désigne en général tout le disque. Cette notion peut être rapprochée de celle évoquée en début d'ouvrage, dans la section 1.2 (page [*]) : une partition donnée applique en général un seul système de fichier (au sens de la section 1.2, donc FAT16, EXT2FS, ...), donc la confusion des deux notions est possible - et très souvent effectuée.

Lorsque l'on désire accéder aux informations d'un support donné (par exemple, un CD-ROM), il est nécessaire, en quelque sorte, <<d'accrocher>> le système de fichier qu'il contient à un point de l'arborescence, c'est-à-dire un répertoire (de préférence prévu à cet effet). Cette opération s'appelle le montage2.15 du support en question. Une fois cette opération effectuée, les fichiers et répertoires du support apparaissent comme se trouvant dans le répertoire sur lequel le support a été monté.

Par exemple, vous possédez un CD-ROM contenant à sa racine le fichier liste.txt, ainsi que le répertoire Images. Si vous montez le CD-ROM sous le répertoire /mnt, l'accès au fichier se fera par /mnt/liste.txt, l'accès aux répertoire par /mnt/Images, l'accès aux fichiers du répertoire Images par /mnt/Images/nom_de_fichier, et ainsi de suite.

Notez bien que si le répertoire /mnt contenait des fichiers avant le montage, ceux-ci deviennent absolument inaccessibles une fois le montage effectué. Prenons un exemple. Supposons un répertoire /mnt, qui contient des fichiers :

[root@kafka /root]$ ls /mnt

cdrom dos1 dos2 eit floppy iomega nfs 

Montons un CD-ROM sur ce répertoire (la commande utilisée est mount, elle sera détaillée par la suite), et examinons le contenu du répertoire :

[root@kafka /root]# mount /dev/hdd /mnt

mount: block device /dev/hdd is write-protected, mounting read-only

[root@kafka /root]# ls /mnt

3DFx           GTK1.2            Koffice       Sound 

Alien          Gnome1.0_Sources  Lisezmoi.txt  Themes

ContribSuite   Java1.2_pre1      Noyaux        docs

Dev_Graphique  Jeux              Revue         kde

EnVrac         KDE1.1            SciTech 

On constate bien que les fichiers qui se trouvaient dans /mnt ont comme <<disparus>>.

Mais que faire lorsque l'on souhaite changer le CD-ROM ? Il existe l'opération inverse du montage, il s'agit - vous l'aurez deviner - du démontage2.16 des systèmes de fichiers (avec umount, détaillée plus tard). Si le point de montage contenait des fichiers avant le montage, ceux-ci redeviennent visibles :

[root@kafka /root]# umount /mnt

[root@kafka /root]# ls /mnt

cdrom dos1 dos2 eit floppy iomega nfs 

Prenons un exemple réel. Il est assez commun, sur un système Linux, de répartir les différents éléments du système sur différents systèmes de fichiers, pas nécessairement sur le même disque. Dans le schéma 2.5, les éléments sur un même système de fichiers sont entourés, le tout constituant un système Linux complet (l'arborescence est ici simplifiée).


  
Figure 2.5: Différents systèmes de fichiers pour un système Linux

\includegraphics{images/rep_syst_fichiers.eps}


Les raisons d'un tel partage apparaîtront dans le chapitre 6 consacré à l'installation, page [*].

Pour finir, disons simplement qu'il est usuel de réserver plusieurs sous-répertoires dans le répertoires /mnt pour les montages temporaires, tels que disquettes et CD-ROMs, par exemple, /mnt/cdrom, /mnt/floppy, etc.

Deux commandes sont dédiées aux opérations de montage et démontage, les commandes mount et umount, exposées dans la section 2.6.7 page [*].

  
2.2.3 Mécanisme des liens2.19 [YB]

Les principes de fonctionnement du système de fichiers de Linux comporte la notion de liens. Pour être simple, un lien est un point d'accès à un fichier, ce point d'accès prenant la forme d'un nom dans un répertoire - la notion de fichier ne représente qu'une suite de caractères quelque part sur un disque. Quelle différence alors, entre le nom de fichier tel qu'exposé au début de cet ouvrage, et le lien ? En fait, le nom de fichier est un élément du lien, qui comporte de nombreuses informations concernant le fichier (droits d'accès, taille, date de création...). De plus, nous avions évoqué une sorte d'équivalence entre le nom de fichier et le fichier lui-même. Mais un même fichier peut être référencé par plusieurs liens, de noms différents s'ils sont dans le même répertoire, éventuellement de mêmes noms s'ils sont dans des répertoires différents.

On distingue deux types de liens : les liens physiques et les liens symboliques2.20.

Un lien physique est un accès direct à la suite de caractères sur disque qu'est le fichier. Accéder au lien, c'est accéder directement au fichier. En pratique, lorsque vous effacez un fichier avec rm, vous indiquez un nom de fichier, donc un lien. Mais l'espace occupé par le fichier n'est effectivement libéré que lorsque le dernier lien physique qui y fait référence est effacé : rm ne supprime donc pas le fichier, seulement un lien qui lui est attaché. Ceci est une façon de protéger des fichiers contre l'effacement, mais rend l'utilisation des liens physiques délicates : il est facile d'engendrer un véritable capharnaüm dans l'arborescence...

Un lien symbolique, a contrario, est un accès indirect au fichier : on peut plutôt le voir comme une référence à un autre lien, comme un lien secondaire sur le fichier correspondant. La grosse différence avec le lien physique, c'est qu'il est possible d'effacer le fichier (c'est-à-dire, effacer tous ses liens physiques) sans toucher aux liens symboliques (qui deviennent alors en quelque sorte orphelins : on parle de liens brisés). D'un maniement plus souple que les liens physiques, les liens symboliques peuvent également amener à une forêt inextricable de références : n'en abusez donc pas.

Une commande est dédiée à la manipulation des liens, la commande ln, présentée en 2.6.6 page [*].

2.2.4 Fichiers spéciaux

  
2.2.5 Comment le système accède à un fichier : la triple indirection et les i-noeuds2.23



Footnotes

... matériel2.11
Source : devices.txt par H. PETER ANVIN (août 1998), dans la documentation accompagnant le code source du kernel 2.2.1.
... matériel2.12
Source : devices.txt par H. PETER ANVIN (août 1998), dans la documentation accompagnant le code source du kernel 2.2.1.
... matériel2.13
Source : devices.txt par H. PETER ANVIN (août 1998), dans la documentation accompagnant le code source du kernel 2.2.1.
...mineur2.14
major et minor en anglais
...montage2.15
monter : to mount, en anglais
...démontage2.16
démonter : to unmount, en anglais
... liens2.17
link en anglais
... liens2.18
link en anglais
... liens2.19
link en anglais
... symboliques2.20
respectivement, hard links et symbolic links en anglais
... i-noeuds2.21
i-node ou inode en anglais
... i-noeuds2.22
i-node ou inode en anglais
... i-noeuds2.23
i-node ou inode en anglais

next up previous contents
Next: 2.3 Utilisateurs : droits et devoirs [YB] Up: 2. Premières courses Previous: 2.1 Notions d'architecture matérielle [YB]
kafka.fr@linux-france.org