27. /dev et /proc

Une machine Linux ou UNIX a typiquement les répertoires spéciaux /dev et /proc.

27.1. /dev

Le répertoire /dev contient des entrées pour les périphériques physiques qui pourraient être présents sur votre système. [81] Les partitions du disque dur contenant les systèmes de fichiers montés ont des entrées dans /dev, comme un simple df le montre.

bash$ df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/hda6               495876    222748    247527  48% /
/dev/hda1                50755      3887     44248   9% /boot
/dev/hda8               367013     13262    334803   4% /home
/dev/hda5              1714416   1123624    503704  70% /usr
              

Entre autre choses, le répertoire /dev contient aussi des périphériques loopback, tels que /dev/loop0. Un périphérique loopback est une astuce qui permet à un fichier ordinaire d'être accédé comme s'il était un périphérique bloc. [82] Ceci rend possible le montage d'un système de fichiers entier en un seul gros fichier. Voir l'Exemple 16.8, « Création d'un système de fichiers dans un fichier » et l'Exemple 16.7, « Vérifier une image ».

Quelques pseudo-périphériques dans /dev ont d'autres utilisations spécialisées, telles que /dev/null, /dev/zero, /dev/urandom, /dev/sda1, /dev/udp, et /dev/tcp.

Par exemple :

Pour monter un lecteur flash USB, ajoutez la ligne suivante à /etc/fstab. [83]

/dev/sda1    /mnt/flashdrive    auto    noauto,user,noatime    0 0

(voir aussi l'Exemple A.24, « Monter des périphériques de stockage USB »).

Vérifier si un disque est dans le graveur de CD (lien vers /dev/hdc):

head -1 /dev/hdc


#  head: cannot open '/dev/hdc' for reading: No medium found
#  (Aucun disque dans le lecteur.)

#  head: error reading '/dev/hdc': Input/output error
#  (Il y a un disque dans le lecteur mais il ne peut être lu ;
#+  à priori un CDR vierge.)

#  Flux de caractères et autres cochonneries associées
#  (Il y a un disque pré-enregistré dans le lecteur
#+  et vous avez un affichage direct -- un flux de données ASCII et binaires.)
#  Ici nous voyons  we see l'intérêt de limiter la sortie dans des proportions
#+ gérables, plutôt que d'utiliser 'cat' ou un autre outil similaire.


#  Maintenant, il s'agit seulement de vérifier/analyser la sortie
#+ et d'exécuter une action appropriée.

Lors de l'exécution d'une commande sur le fichier pseudo-périphérique /dev/tcp/$host/$port, Bash ouvre une connexion TCP vers la socket associée.

Obtenir l'heure de nist.gov :

bash$ cat </dev/tcp/time.nist.gov/13
53082 04-03-18 04:26:54 68 0 0 502.3 UTC(NIST) *
              

[Mark a contribué à l'exemple ci-dessus.]

Téléchargez une URL :

bash$ exec 5<>/dev/tcp/www.net.cn/80
bash$ echo -e "GET / HTTP/1.0\n" >&5
bash$ cat <&5
              

[Merci à Mark et Mihai Maties.]

Exemple 27.1. Utiliser /dev/tcp pour corriger des problèmes

#!/bin/bash
# dev-tcp.sh : redirection /dev/tcp pour vérifier la connexion Internet.

# Script de Troy Engel.
# Utilisé avec sa permission.
 
HOTE_TCP=www.dns-diy.com # Un FAI connu pour être "spam-friendly"
PORT_TCP=80              # Le port 80 est http.
  
# Essaie de se connecter. (Un peu équivalent à un 'ping'...) 
echo "HEAD / HTTP/1.0" >/dev/tcp/${HOTE_TCP}/${PORT_TCP}
SORTIE=$?

: <<EXPLICATION
Si bash a été compilé avec --enable-net-redirections, il dispose d'un
périphérique caractère spécial pour les redirections TCP et UDP. Ces
redirections sont utilisées de façon identique à STDIN/STDOUT/STDERR. Les entrées
du périphériques sont 30,36 pour /dev/tcp :

  mknod /dev/tcp c 30 36

>De la référence bash :
    /dev/tcp/host/port
Si l'hôte est un nom valide ou une adresse Internet et que le port est un
numéro de port de type entier ou un nom de service, Bash essaie d'ouvrir une
connexion TCP vers le socket correspondant.
EXPLICATION

   
if [ "X$SORTIE" = "X0" ]; then
  echo "Connexion réussie. Code de sortie : $SORTIE"
else
  echo "Connexion échouée. Code de sortie : $SORTIE"
fi

exit $SORTIE



[81] Les entrées dans /dev fournissent des points de montage pour les périphériques physiques et virtuels. Ces entrées utilisent très peu d'espace disque.

Quelques périphériques, tels que /dev/null, /dev/zero, et /dev/urandom sont virtuels. Ce ne sont pas des périphériques physiques et ils existent seulement au niveau logiciel.

[82] Un périphérique bloc lit et/ou écrit des données par morceaux, ou blocs en constraste avec un périphérique caractère, qui accède aux données caractère par caractère. Des exemples de périphérique bloc sont un disque dur et un lecteur CD ROM. Un exemple de périphérique caractère est un clavier.

[83] Bien sûr, le point de montage /mnt/lecteur_flash doit exister. Dans le cas contraire, en tant qu'utilisateur root, mkdir /mnt/flashdrive.

Pour monter réellement le lecteur, utilisez la commande suivante : mount /mnt/lecteur_flash

Les nouvelles distributions Linux montent automatiquement les clés USB dans le répertoire /media.