Aller au contenu

Accéder aux périphériques amovibles

Objectif : accéder aux données d'un CD-Rom, d'un DVD ou d'une clé USB sur un système Linux.

"Où sont les données de mon CD-Rom ? Comment accéder à ma clé USB ?" Voilà ce que l'on est sûr de retrouver dans le palmarès des questions les plus fréquemment posées par des utilisateurs venant de Microsoft Windows. Linux n'utilise pas les lettres de l'alphabet pour désigner ses périphériques et c'est en vain que vous chercherez des lecteurs D:, E: ou F:. Au lieu de cela, les périphériques sont inclus directement dans la hiérarchie du système de fichiers. Si cela vous paraît obscur, le présent atelier vous expliquera tout en détail, pas à pas.

Les fichiers de périphérique

Pour commencer, jetez un oeil au répertoire /dev. Son nom provient du mot device qui signifie "périphérique". Faites un petit ls pour en afficher le contenu. La première chose qui saute aux yeux, c'est la couleur de tous ces fichiers : jaune ! Ce ne sont vraisemblablement pas des fichiers comme tous les autres. Cette première suspicion est d'ailleurs étayée par l'affichage détaillé :

$ ls -l /dev/sda
brw-rw----. 1 root disk 8, 0 May 30 08:39 /dev/sda
$ ls -l /dev/input/mouse0 
crw-rw----. 1 root input 13, 32 May 30 08:39 /dev/input/mouse0

Le b et le c initiaux nous indiquent qu'il ne s'agit ni de fichiers classiques, ni de répertoires. Nous trouvons certes une série de liens symboliques, mais ceux-ci semblent pointer vers les mêmes fichiers mystérieux à l'intérieur de ce répertoire :

$ ls -l /dev/cdrom
lrwxrwxrwx. 1 root root 3 May 30 08:39 /dev/cdrom -> sr0

Les fichiers contenus dans /dev sont des fichiers de périphérique (device files) : chacun représente (ou symbolise) un périphérique bien spécifique sur votre système. Ils ne contiennent pas de données à proprement parler, mais servent à communiquer avec le noyau.

Dans l'affichage détaillé, les lettres b et c différencient respectivement les périphériques de type bloc (block devices) et ceux de type caractère (character devices) :

  • Le disque dur, par exemple, est un périphérique bloc : il lit ou écrit des données sous forme de blocs de taille fixe.

  • La souris, le clavier, la console ou encore la carte audio sont des périphériques caractère : ils lisent ou écrivent un flux d'octets en série.

Quant aux deux chiffres qui apparaissent avant la date, ce sont les numéros majeur et mineur :

$ ls -l /dev/sda?
brw-rw----. 1 root disk 8, 1 May 30 08:39 /dev/sda1
brw-rw----. 1 root disk 8, 2 May 30 08:39 /dev/sda2

Tout comme l'astérisque *, le point d'interrogation ? est un caractère de substitution. Alors que le premier représente une suite de caractères quelconque, le second est un joker pour un seul caractère quelconque.

Le numéro majeur donne une indication sur le pilote du noyau qui gère le périphérique en question. Le numéro mineur sert à différencier des périphériques similaires, par exemple les différentes partitions d'un disque dur. Pour la plupart, les pilotes et leur numéro majeur figurent sur cette page de la documentation du noyau Linux.

  • Les noms des disques durs (SCSI, SATA, IDE, USB, Firewire) commencent par sd (SCSI Disk). La lettre qui suit dépend d'une part du branchement, d'autre part de l'ordre des branchements : sda, sdb, sdc, sdd, etc.

  • Les lecteurs CD/DVD SCSI seront répertoriés en tant que sr ou scd (SCSI CD).

  • Les périphériques d'entrée comme le clavier et la souris sont symbolisés par les fichiers dans le répertoire /dev/input.

  • Etc.

Certains fichiers ne correspondent pas vraiment à un périphérique physique, concret et tangible. Ils remplissent une fonction bien spécifique dans le système :

  • /dev/null est une sorte de "nirvana numérique", un véritable trou noir vers lequel on peut envoyer des données qui sont censées disparaître, par exemple les messages de la console que l'on ne souhaite pas afficher.

  • /dev/zero est une source inépuisable de zéros, que l'on utilise parfois pour en remplir certains fichiers jusqu'à une taille prédéfinie.

  • /dev/random et /dev/urandom génèrent des nombres aléatoires.

La notion de montage/démontage

Pour donner l'accès aux divers périphériques ainsi qu'aux systèmes de fichiers qu'ils contiennent, il faut établir une connexion entre le périphérique d'un côté et l'arborescence du système de fichiers Linux de l'autre. Lorsque le périphérique est inclus dans cette arborescence, on dit qu'il est "monté". Un peu de pratique vous permettra de comprendre cette façon de procéder.

Monter manuellement un CD ou un DVD

Commençons par le lecteur CD/DVD. Dans un premier temps, il nous faut connaître son fichier de périphérique. La cible du lien symbolique /dev/cdrom nous fournit déjà une première piste :

$ ls -l /dev/cdrom
lrwxrwxrwx. 1 root root 3 May 30 08:39 /dev/cdrom -> sr0

Pour en avoir le coeur net, nous utiliserons la commande lsblk (list block devices), qui affiche les périphériques de type bloc du système. Notez le périphérique /dev/sr0 (type rom) tout en bas de la liste :

$ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0   60G  0 disk
├─sda1        8:1    0    1G  0 part /boot
└─sda2        8:2    0   59G  0 part
  ├─ol-root 253:0    0 38.3G  0 lvm  /
  ├─ol-swap 253:1    0    2G  0 lvm  [SWAP]
  └─ol-home 253:2    0 18.7G  0 lvm  /home
sr0          11:0    1 1024M  0 rom

Vous pouvez très bien accéder à votre lecteur CD/DVD depuis un système invité installé dans VirtualBox. Ouvrez la configuration de la machine virtuelle et, dans l'onglet Stockage, vérifiez si vous avez sélectionné le Lecteur de l'hôte dans le contrôleur IDE, avec le Mode direct activé.

Pour la machine virtuelle qui tourne dans ma station de travail, c'est sr0. Il se peut que chez vous ce soit scd0, sdb ou autre chose, mais peu importe. La cible du lien symbolique /dev/cdrom et la liste fournie par lsblk vous le diront.

Insérez par exemple le CD d'installation dans le lecteur et invoquez la commande suivante, en prenant soin de remplacer /dev/sr0 par le fichier correspondant à votre lecteur. Comme vous vous en doutez, vous pouvez bien évidemment remplacer /dev/sr0 par le lien symbolique correspondant /dev/cdrom :

$ sudo mount -v -t iso9660 /dev/cdrom /mnt
mount: /dev/sr0 is write-protected, mounting read-only
mount: /dev/sr0 mounted on /mnt.

Maintenant, allez voir dans le répertoire /mnt :

$ cd /mnt
$ ls
EFI  images  isolinux  LiveOS

Effectivement, /mnt contient les données du CD d'installation. Naviguez un peu dans les répertoires avec cd, vous verrez que tout y est. Le CD est effectivement "monté" sur /mnt. Voici quelques explications sur la commande :

  • mount sert à monter un périphérique et requiert les privilèges de l'administrateur (sudo) ;

  • -v indique à mount d'opérer en mode "bavard" ;

  • -t est l'option qui précise le système de fichiers (ici, iso9660, utilisé sur un CD/DVD) ;

  • /dev/cdrom est le fichier de périphérique qui représente le lecteur de CD/DVD ou, plus exactement, un lien symbolique qui pointe vers celui-ci ;

  • /mnt est le point de montage, autrement dit le répertoire où les données du périphérique seront accessibles.

Démonter le CD ou le DVD

Pour procéder en sens inverse, c'est-à-dire pour retirer le contenu du DVD de notre système de fichiers, il suffit de le "démonter". Pour ce faire, placez-vous en dehors de l'arborescence de /mnt (par exemple, en invoquant cd sans arguments) et lancez la commande suivante :

$ sudo umount -v /mnt
umount: /mnt (/dev/sr0) unmounted

L'option -v demande simplement à la commande umount de nous tenir informés de ce qu'elle fait. Jetez un oeil dans /mnt :

$ ls /mnt

Il ne reste plus rien ; le répertoire est désormais vide. Il semblerait que nous ayons réussi le montage et le démontage d'un périphérique. Avant d'aborder les questions de détail, essayons de faire la même chose avec notre clé USB.

Monter et démonter manuellement une clé USB

Avant de pouvoir faire quoi que ce soit, il faut d'abord connaître le fichier de périphérique qui la représente.

Puisque le répertoire /dev contient tous les fichiers symbolisant les périphériques de la machine, on pourrait :

  • afficher le contenu de /dev avec ls ;

  • brancher la clé USB et attendre quelques secondes ;

  • afficher une nouvelle fois le contenu de /dev en repérant une éventuelle nouvelle entrée nommée sdquelque_chose.

Oui, ce serait possible. C'est assez fréquent que l'on fasse les choses de manière passablement compliquée, pour se rendre compte ensuite (parfois des années plus tard) qu'il existe un autre moyen, beaucoup plus élégant et surtout plus simple.

Tout comme pour le lecteur CD/DVD, vous pouvez accéder à votre clé USB depuis un système invité installé dans VirtualBox, mais vous devez l'enregistrer au préalable. Insérez la clé USB, ouvrez la configuration de la machine virtuelle et, dans l'onglet USB, cliquez sur l'icône ornée d'un petit signe + pour ajouter la clé à la liste des disques externes gérés par le système invité. Dans la configuration par défaut de VirtualBox, vous ne pouvez utiliser que l'USB 1.1, mais ce n'est pas bien grave, vu que nous ne nous en servons qu'à des fins de démonstration.

Lorsque vous branchez un périphérique USB, le noyau en prend note dans son journal, le fichier /var/log/messages. Regardez ce que ce fichier contient :

$ sudo cat /var/log/messages

Du charabia ? Je suis d'accord avec vous. Mais peut-être pas si charabia que ça, comme vous allez le voir tout de suite. Rappelez-vous la commande tail que nous avons utilisée dans un précédent atelier pour afficher la fin d'un fichier :

$ sudo tail /var/log/messages

Le comportement par défaut de tail ressemble à celui de head. Il affiche dix lignes, pas plus. Cependant, une option bien particulière sert à suivre en direct l'évolution d'un fichier lorsque des données s'y ajoutent :

$ sudo tail -f /var/log/messages

Maintenant, branchez votre clé USB et attendez un peu. Au bout de quelques secondes, vous verrez apparaître une série de messages ressemblant à ce qui suit :

...
May 30 09:49:30 linuxbox kernel: sdb: sdb1
May 30 09:49:30 linuxbox kernel: sd 5:0:0:0: [sdb] Attached SCSI removable disk
...

Le noyau nous envoie une bonne quinzaine de lignes, dans lesquelles nous retrouvons facilement l'information qui nous intéresse. Le fichier de périphérique correspondant à notre clé USB est donc sdb et la partition contenant le système de fichiers est sdb1. Attention, sur votre machine ce sera peut-être autre chose : sdc1, sdd1, sde1, etc. Appuyez sur Ctrl+C pour interrompre tail -f et récupérer la main sur la console. Si vous êtes scrupuleux, vérifiez l'information délivrée par le noyau :

$ ls -l /dev/sdb1
brw-rw----. 1 root disk 8, 17 May 30  09:49 /dev/sdb1

Enfin, la commande lsblk nous aurait également permis d'identifier notre clé USB en tant que périphérique bloc de type disk :

$ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0   60G  0 disk
├─sda1        8:1    0    1G  0 part /boot
└─sda2        8:2    0   59G  0 part
  ├─ol-root 253:0    0 38.3G  0 lvm  /
  ├─ol-swap 253:1    0    2G  0 lvm  [SWAP]
  └─ol-home 253:2    0 18.7G  0 lvm  /home
sdb           8:16   1  7.5G  0 disk
└─sdb1        8:17   1  7.5G  0 part
sr0          11:0    1  649M  0 rom

Rappelons ici que les clés USB sont normalement formatées en FAT, un système de fichiers originaire de Microsoft. Il ne brille pas spécialement par ses performances, bien au contraire. Néanmoins, c'est le seul qui soit lisible aussi bien par Windows et macOS que Linux, d'où l'intérêt de préférer ce dénominateur commun pour le formatage.

Là encore, remplacez /dev/sdb1 par le fichier de périphérique symbolisant votre clé USB :

$ sudo mount -v -t vfat /dev/sdb1 /mnt
mount: /dev/sdb1 mounted on /mnt.

Essayons de traduire cette dernière commande en français : "monte (mount) la clé USB (/dev/sdb1) qui contient un système de fichiers FAT (-t vfat) sur le point de montage /mnt (/mnt) et dis-nous ce que tu fais (-v)."

Voyons si le contenu de la clé apparaît bien en dessous de /mnt :

$ ls /mnt
Eyrolles
INFRES-Groupe-1.pdf
INFRES-Groupe-2.pdf
System Volume Information

Bravo ! Il ne nous reste plus qu'à démonter la clé. Sortons de l'arborescence /mnt (cd sans arguments, par exemple), puis invoquons la commande suivante :

$ sudo umount -v /mnt
umount: /mnt (/dev/sdb1) unmounted

Là aussi, nous pouvons vérifier que /mnt ne contient plus rien après le démontage du périphérique.

Quelques observations en vrac

Les premiers essais de montage et de démontage en ligne de commande ont été concluants. Quelques remarques s'imposent.

  • Les options -v et -t ont été utilisées à des fins pédagogiques. Elles sont facultatives. Ainsi, vous auriez pu vous contenter d'évoquer mount /dev/cdrom /mnt pour monter le CD-Rom et mount /dev/sdb1 /mnt pour la clé USB. Essayez.

  • Les anglophones parmi vous objecteront que le contraire de mount serait plutôt unmount. Pourquoi alors dit-on umount ? Cela tient au fait que beaucoup d'informaticiens ont un rapport problématique à l'orthographe. Le n a dû se perdre en route quelque part. C'est aussi bête que cela.

  • La commande umount accepte en argument aussi bien le point de montage que le nom du fichier de périphérique. Pour démonter le CD-Rom, nous aurions pu écrire aussi bien umount /dev/cdrom que umount /mnt. Pareillement, la clé USB aurait pu être démontée par le biais de la commande umount /dev/sdb1.

  • Notons enfin que, sur un poste de travail Linux, la gestion des périphériques se fait de manière tout aussi transparente que sous Microsoft Windows ou macOS. Par "transparent", entendez que, si vous utilisez un environnement de bureau comme KDE, GNOME ou Xfce, il suffit généralement d'insérer le périphérique en question et de cliquer sur une icône pour accéder à son contenu.

Scier la branche sur laquelle on est assis

Pourquoi faut-il quitter l'arborescence du point de montage avant de démonter un périphérique ? Pour la simple raison que le système refuse de vous laisser scier la branche sur laquelle vous êtes assis. Ce point mérite une illustration détaillée, car il s'agit d'une erreur qui revient fréquemment. Insérez le CD-Rom et montez-le :

$ sudo mount /dev/cdrom /mnt

Placez-vous à la racine du CD-Rom :

$ cd /mnt

Maintenant, à partir de /mnt, essayez de démonter le lecteur et voyez ce que le système vous dit :

$ sudo umount /mnt
umount: /mnt: target is busy.

Tant que vous vous trouvez dans l'arborescence /mnt, vous ne pourrez donc tout simplement pas procéder au démontage.

Éjecter un DVD ou un CD-Rom : eject

Voici une commande qui amuse beaucoup les enfants (et les administrateurs restés jeunes dans l'âme) : eject. Assurez-vous de vous trouver en dehors de toute arborescence de point de montage et essayez-la :

$ sudo eject

Si tout se passe bien, le tiroir du lecteur CD/DVD s'ouvre. Pour le refermer, invoquez simplement ceci :

$ sudo eject -t

La commande eject -t ne fonctionnera pas sur les lecteurs slim, qui sont conçus différemment. Ils s'ouvrent automatiquement, mais leur fermeture est manuelle.

La commande eject combine le démontage et l'éjection d'un périphérique. Autrement dit, si votre CD-Rom est monté, ce n'est pas la peine d'invoquer umount ; eject s'en charge. Comme umount, eject accepte en argument le nom d'un périphérique, à condition que celui-ci soit éjectable bien sûr. Invoquée sans arguments, la commande agit sur le périphérique défini par défaut. Pour le connaître, utilisez l'option -d :

$ eject -d
eject: default device: `/dev/cdrom'

Normalement, eject fonctionne avec les lecteurs CD/DVD et les graveurs, ainsi qu'avec les lecteurs ZIP, même si ces derniers sont tombés en désuétude.

Les administrateurs de salles de serveurs utilisent parfois eject de manière abusive, à condition que les machines soient équipées de lecteurs optiques : ils invoquent cette commande pour savoir où se trouve physiquement la machine sur laquelle ils sont connectés.

Monter plusieurs périphériques en même temps

Jusque-là, le point de montage /mnt nous a servi pour tous nos tests successifs avec le lecteur DVD et la clé USB. Certains d'entre vous se sont peut-être demandé s'il était possible de monter les deux conjointement.

Au départ, /mnt est juste un répertoire vide qui fait office de point de montage par convention. En théorie, rien ne nous empêche d'en créer d'autres où bon nous semble. En pratique, nous pouvons très bien combiner la création de nouveaux points de montage avec le respect des conventions.

$ sudo mkdir -v /mnt/{cdrom,disk}
mkdir: created directory ‘/mnt/cdrom’
mkdir: created directory ‘/mnt/disk’

Je me sers du point de montage /mnt/cdrom pour monter le lecteur CD/DVD :

$ sudo mount /dev/cdrom /mnt/cdrom

Quant à la clé USB, elle est montée sur /mnt/disk :

$ sudo mount /dev/sdb1 /mnt/disk

À partir de là, les contenus respectifs du CD-Rom et de la clé USB sont accessibles dans les deux arborescences distinctes.

Obtenir des informations sur les périphériques montés

Pour savoir si un périphérique est monté ou non, il suffit d'invoquer la commande mount sans le moindre argument. Cette opération ne requiert pas de privilèges d'administrateur :

$ mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,...)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,...)
...

Pour l'instant, intéressez-vous juste à la dernière ligne de cet exemple :

/dev/sr0 on /mnt/cdrom type iso9660 (ro,relatime)

Si vous avez tout bien suivi jusqu'ici, la lecture de cette information ne devrait pas vous poser trop de problèmes. La ligne nous dit simplement que le périphérique /dev/sr0 est monté sur /mnt/cdrom, que le système de fichiers est l'ISO 9660 et qu'il est monté en lecture seule (ro pour read only).

Si je monte ma clé USB sur /mnt/disk et que j'invoque mount, j'obtiens ceci :

/dev/sdb1 on /mnt/disk type vfat (rw,relatime,...)

Dans ce cas, l'information se lit comme suit : /dev/sdb1 est monté sur /mnt/disk, le périphérique est formaté en FAT et il est accessible en lecture et écriture (rw pour read/write).

Par ailleurs, le fichier /etc/mtab donne les mêmes informations sur les périphériques montés que mount sans argument, à quelques détails près :

$ cat /etc/mtab
...
/dev/sr0 /mnt/cdrom iso9660 ro,relatime  0 0
/dev/sdb1 /mnt/disk vfat rw,relatime,... 0 0

Là encore, notez la présence du CD-Rom et de la clé USB sur les deux dernières lignes, montés respectivement sur /mnt/cdrom et /mnt/disk.

Il reste encore beaucoup de choses à dire sur le montage des systèmes de fichiers, notamment sur l'organisation de ces derniers sur le ou les disque(s) dur(s). Je vous propose de voir cela dans le prochain atelier, qui nous fournira l'occasion de mettre en application directe les compétences nouvellement acquises. Pour l'instant, laissez reposer un peu la pâte et digérez ce que vous avez appris jusqu'ici.


La rédaction de ces cours demande du temps et des quantités significatives de café espresso. Vous appréciez cette formation ? Offrez un café au formateur.