Périphériques et fichiers sous Unix
Cette méthode de fonctionnement est l'une des choses qui ont permis le succès d'Unix. En effet, avoir la possibilité d'accéder à un périphérique comme un disque, une disquette, un CD ou un DVD dans son ensemble, comme s'il s'agissait d'un simple fichier, est une richesse que d'autres systèmes ne possèdent pas (à moins pour certains d'entre eux d'ajouter un utilitaire spécifique).
/dev
Dans l'arborescence de n'importe quel système GNU/Linux se trouve un répertoire /dev (dev=device=périphérique). Celui-ci contient ce qui pourrait sembler être des fichiers:
/dev/hda
/dev/hda1
/dev/hda2
[...]
/dev/fd0
[...]
/dev/cdrom
[...]
/dev/null
Il s'agit en fait de points d'entrée appelés nodes (noeuds).Chacun de ces points d'entrée est associé à un périphérique présent sur la machine ou non. En utilisant le paramètre -l de la commande ls, nous pouvons voir à quoi sont rattachés ces nodes:
$ ls -l /dev/hda*
brw-rwx---- 1 root disk 3 , 0 32 jun 13 2003 /dev/hda
brw-rwx---- 1 root disk 3 , 1 33 jun 13 2003 /dev/hda1
brw-rwx---- 1 root disk 3 , 2 33 jun 13 2003 /dev/hda2
brw-rwx---- 1 root disk 3 , 3 33 jun 13 2003 /dev/hda3
brw-rwx---- 1 root disk 3 , 4 33 jun 13 2003 /dev/hda5
brw-rwx---- 1 root disk 3 , 5 33 jun 13 2003 /dev/hda6
Dans cet exemple, nous pouvons constater plusieurs chose:
-"b" désigne un périphérique "bloc".Il existe deux sortes de périphériques : ceux sur lesquels on lit et écrit par paquets de plusieurs octets (ou caractères), qui sont les périphériques en mode bloc, et ceux sur lesquels on lit et écrit caractère par caractère, appelés, tout naturellement, les périphériques en mode caractère. Il est important de faire correctement la distinction. en effet, un support de stockage comme un disque dur, un lecteur CD-ROM ou un lecteur de disquette est lu (ou écrit) en mode bloc, alors qu'un port série, un lecteur de bandes ou un port parallèle est en mode caractères.
-"rw-r----" nous informe sur les permissions nécessaires pour lire et écrire sur le node. Ici, le super utilisateur root peut le faire, tout comme les utilisateurs du même groupe. E n revanche, les autres n'ont aucun droit. Si nous prenons le cas du node /dev/tty2 référençant la console numéro 2 et qu'en tant qu'utilisateur "normal" nous tentons d'écrire dessus, le système refusera:
$ echo "coucou > /dev/tty2
bash: /dev/ttyy2: Permission non accordée
En effet, nous n'en possédons pas la permission:
$ ls -l /dev/tty2
crw-rw---- 1 root tty 4 , 4 jun 13 2003 /dev/tty2
-"l" nous informe sur le nombre de liens physiques référençant ce fichier. Nous ne nous lancerons pas ici dans un cours sur l'organisation des fichiers sur un disque au format utilisé par linux (ext2 ou ext3). Sachez simplement qu'il existe deux sortes de lien : symboliques, permettant de créer un alias entre un fichier physiquement présent sur le disque et les liens physiques, créant plusieurs entrées "véritables" vers les mêmes données. un fichier présent sur un disque possède toujours au minimum un lien physique nom_de_fichier_<->données.
-"root" et "disk" correspondent respectivement à l'utilisateur et au groupe à qui appartient le node.
- En suite le plus important : les deux valeurs numériques qui suivent le nom du groupe correspondent au numéro majeur et mineur du périphérique. Ici, quelques explications supplémentaires sont nécessaires. Les combinaisons mode/majeur/mineur sont uniques pour chaque périphérique. Elles servent au noyau Linux à accéder aux périphériques. Ainsi, le node /dev/hda1 (première partition du disque master sur le premier contrôleur IDE) possède les triplets :
mode bloc, majeur 3, mineur 1. Attention, ces numéros ne sont pas donnés au hasard. Imaginez ce qui se passerait si toutes les versions de Linux n'utilisaient pas les mêmes valeurs ou encore, si un programmeur décidait seul des valeurs correspondant à son nouveau pilote de périphérique : une catastrophe.
Ainsi c'est H. Peter Anvin qui est responsable de l'attribution des relations valeurs/périphériques/nodes. les plus courageux (et anglophones) pourront consulter le fichier devices.txt présent dans les sources du noyau Linux pour connaître la liste complète des correspondances.
Dernier point concernant les majeurs/mineurs : Il s'agit d'une numérotation organisée. En effet si nous prenons le cas du disque /dev/hda, le node hda référençant le disque complet possède un majeur 3 et un mineur 0. En toute logique, la première partition de ce disque (/dev/hda1) portera le majeur 3 et le mineur 1. En ce qui concerne le second disque (/dev/hdb), son majeur est toujours 3 (il s'agit du même contrôleur/de la même nappe), mais son mineur est 64. Les partitions de ce disque sont ensuite hdb1=3 et 65,hdb2=3 et 66,etc..
Nous voyons clairement ici que les périphériques de stockage (entre autres) sont bel et bien visibles comme des fichiers.
Manipulations. Périphériques == fichiers ?
Pour nos différents exemples, nous utiliserons le périphériques de stockage amovible le plus petit : le lecteur de disquette. Celui-ci possède, bien sûr, un node dans /dev sous le nom de fd0 (floppy disk 0). Petite précision, seul l'utilisateur root possède par défaut les permissions pour monter et démonter des périphériques.
Commençons par formater une disquette avec un format propre à linux (ext2) :
# mke2fs -v -c /dev/fd0
Les options passées à la commande mke2fs permettent d'afficher tout ce qui se passe (-v) et de chercher d'éventuels secteurs défectueux (-c). Nous pouvons, à présent, monter la disquette dans un répertoire (ici /floppy) :
# mount -v /dev/fd0 /floppy
mount : you didn't specify a filesystem type for /dev/fd0
I will try type ext2
/dev/fd0 on /floppy type ext2 (rw)
mount nous dit ici que nous n'avons pas précisé de format et qu'il essaie le format ext2. La disquette est maintenant montée dans /floppy, nous pouvons y copier un fichier quelconque :
# cp ~/image/test.jpg /floppy
Puis démonter la disquette :
# umount /floppy
Nous allons maintenant copier entièrement la disquette dans un fichier. C'est très facile puisqu'il existe un node qui possède toutes les caractéristiques d'un fichier :
# cp /dev/fd0 disquette
Nous obtenons un fichier de 1474560 appelé disquette. il s'agit de l'image de notre disquette dans laquelle nous avons copié notre fichier test.jpg. "Et alors?" me direz-vous. Nous venons de montrer qu'il est possible de recopier les données d'un périphérique sur le disque dur, ou plus exactement, sur notre système de fichiers. Les périphériques référencés dans /dev sont donc manipulables comme des fichiers : périphériques == fichiers.
Certains fichiers == périphériques ?
Nous avons précédemment créé une image de disquette. Celle-ci est la réplique exacte du contenu du périphérique en question. Si la réciproque est exacte, nous pouvons donc monter notre image de disquette comme s'il s'agissait d'un périphérique :
# mount -v -o loop=/dev/loop0 disquette /floppy
mount : going to use the loop device /dev/loop0
mount: : you didn't specify a filesystem type for /dev/loop0
I will try type ext2
/root/disquette on /floppy type ext2 (rw,loop=/dev/loop0)
Ca marche ! fichiers == périphériques.
Nous avons utilisé ici un élément du système un peu particulier :
/dev/loop0. Ce point d'entrée dans /dev n'est pas un périphérique physique, il sert simplement de relais entre l'image et le répertoire /floppy pour la commande mount.
L'intérêt est clair : nous pouvons stocker le contenu de toute sortes de périphériques dans un fichier qui, une fois monté, sera accessible comme un périphérique.
Publication d'Hindifaraï
Cette article a été publiée le 30 juillet 2006.