29. /dev et /proc

Sur un système de fichiers Linux ou UNIX, se trouvent généralement les répertoires spéciaux /dev et /proc.

29.1. /dev

Le répertoire /dev contient des entrées pour les périphériques physiques, qu'ils soient ou non matériellement présents. [114] Comme de juste, ces entrées sont appelées fichiers de périphériques. A titre d'exemple, les partitions du disque dur qui contiennent des systèmes de fichiers montés ont des entrées dans /dev, ainsi qu'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 autres choses, le répertoire /dev contient 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. [115] Ceci rend possible le montage d'un système de fichiers entier en un seul gros fichier. Voir l'Exemple 17.8, « Création d'un système de fichiers dans un fichier » et l'Exemple 17.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 (partition du disque dur), /dev/udp (port UDP - User Datagram Packet), et /dev/tcp.

Par exemple :

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

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

(voir aussi l'Exemple A.23, « 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.

Les exemples suivants supposent une connexion Internet active.

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) *
              

[Cet exemple est de Mark.]

Généralisation à l'aide d'un script

#!/bin/bash
# Ce sript nécessite les permissions de root.

URL="time.nist.gov/13"

Heure=$(cat &lt;/dev/tcp/"$URL")
UTC=$(echo "$Heure" | awk '{print$3}')   # Le 3ème champ est l'heure UTC (GMT)
# Exercice : modifier pour différents fuseaux horaires.

echo "Heure UTC (GMT) = "$UTC""

Downloading a URL:

Télécharger 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 29.1. Utiliser /dev/tcp pour corriger des problèmes

#!/bin/bash
# dev-tcp.sh: /dev/tcp redirection to check Internet connection.

# Script by Troy Engel.
# Used with permission.
 
TCP_HOST=www.dns-diy.com   # A known spam-friendly ISP.
TCP_PORT=80                # Port 80 is http.
  
# Try to connect. (Somewhat similar to a 'ping' . . .) 
echo "HEAD / HTTP/1.0" >/dev/tcp/${TCP_HOST}/${TCP_PORT}
MYEXIT=$?

: <<EXPLANATION
If bash was compiled with --enable-net-redirections, it has the capability of
using a special character device for both TCP and UDP redirections. These
redirections are used identically as STDIN/STDOUT/STDERR. The device entries
are 30,36 for /dev/tcp:

  mknod /dev/tcp c 30 36

>From the bash reference:
/dev/tcp/host/port
    If host is a valid hostname or Internet address, and port is an integer
port number or service name, Bash attempts to open a TCP connection to the
corresponding socket.
EXPLANATION

   
if [ "X$MYEXIT" = "X0" ]; then
  echo "Connection successful. Exit code: $MYEXIT"
else
  echo "Connection unsuccessful. Exit code: $MYEXIT"
fi

exit $MYEXIT

Exemple 29.2. Jouer de la musique

#!/bin/bash
# music.sh

# MUSIC WITHOUT EXTERNAL FILES

# Author: Antonio Macchi
# Used in ABS Guide with permission


#  /dev/dsp default = 8000 frames per second, 8 bits per frame (1 byte),
#+ 1 channel (mono)

duration=2000       # If 8000 bytes = 1 second, then 2000 = 1/4 second.
volume=$'\xc0'      # Max volume = \xff (or \x00).
mute=$'\x80'        # No volume = \x80 (the middle).

function mknote ()  # $1=Note Hz in bytes (e.g. A = 440Hz ::
{                   #+ 8000 fps / 440 = 16 :: A = 16 bytes per second)
  for t in `seq 0 $duration`
  do
    test $(( $t % $1 )) = 0 && echo -n $volume || echo -n $mute
  done
}

e=`mknote 49`
g=`mknote 41`
a=`mknote 36`
b=`mknote 32`
c=`mknote 30`
cis=`mknote 29`
d=`mknote 27`
e2=`mknote 24`
n=`mknote 32767`
# European notation.

echo -n "$g$e2$d$c$d$c$a$g$n$g$e$n$g$e2$d$c$c$b$c$cis$n$cis$d \
$n$g$e2$d$c$d$c$a$g$n$g$e$n$g$a$d$c$b$a$b$c" > /dev/dsp
# dsp = Digital Signal Processor

exit      # A "bonny" example of a shell script!



[114] 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.

[115] Un périphérique bloc lit et/ou écrit les données par morceaux, ou blocs, par opposition avec le périphérique caractère, qui accède aux données caractère par caractère. Les périphériques bloc sont par exemple les disques durs, lecteurs CD ROM, lecteurs de mémoire flash. Les claviers, modems ou cartes son est un exemple de périphériques caractères.

[116] 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 sans intervention de l'utilisateur.