Capitolo 27. /dev e /proc

Sommario
27.1. /dev
27.2. /proc

Una tipica macchina Linux, o UNIX, possiede due directory che hanno funzioni particolari: /dev e /proc.

27.1. /dev

La directory /dev contiene l'elenco di tutti i dispositivi fisici che possono o meno essere presenti nel hardware. [1] Le partizioni di un hard disk contenenti il/i filesystem montato/i si trovano in /dev, come un semplice df può mostrare.

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
	      

Tra l'altro, la directory /dev contiene anche i dispositivi di loopback, come /dev/loop0. Un dispositivo di loopback rappresenta un espediente che permette l'accesso ad un file ordinario come se si trattasse di un dispositivo a blocchi. [2] In questo modo si ha la possibilità di montare un intero filesystem all'interno di un unico, grande file. Vedi Esempio 16-8 e Esempio 16-7.

In /dev sono presenti anche alcuni altri file con impieghi specifici, come /dev/null, /dev/zero, /dev/urandom, /dev/sda1, /dev/udp e /dev/tcp.

Ad esempio:

Per montare una memoria flash USB, si aggiunga la riga seguente nel file /etc/fstab. [3]

/dev/sda1    /mnt/memoriaflash    auto    noauto,user,noatime    0 0
(Vedi anche Esempio A-24.)

Verificare se è presente un disco nel masterizzatore CD (link simbolico a /dev/hdc):

head -1 /dev/hdc
			 
			 
#  head: cannot open '/dev/hdc' for reading: No medium found
#  (Nessun disco nel masterizzatore.)
			 
#  head: error reading '/dev/hdc': Input/output error
#  (Il disco c'è, ma non può essere letto;
#+  probabilmente un  CDR vergine.)   
			 
#  Serie di caratteri e vari simboli strani
#  (Nel masterizzatore è presente un disco già registrato,
#+  e questo è l'output -- una serie di caratteri ASCII e dati binari.)
#  Qui vediamo la saggezza dell'uso di 'head' che limita l'output
#+ a proporzioni gestibili, piuttosto che 'cat' o qualcos'altro di simile.
			 
			 
#  Ora è solo questione di controllare/verificare l'output e
#+ intraprendere l'azione appropriata.

Quando viene eseguito un comando sul file di pseudo-dispositivo /dev/tcp/$host/$porta, Bash apre una connessione TCP al socket associato. [4]

Ottenere l'ora da nist.gov:

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

[L'esempio precedente è stato fornito da Mark.]

Scaricare un URL:

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

[Grazie a Mark e Mihai Maties.]

Esempio 27-1. Uso di /dev/tcp per la verifica di una connessione

#!/bin/bash
# dev-tcp.sh: redirezione /dev/tcp per il controllo della connessione Internet.

# Script di Troy Engel.
# Utilizzato con il permesso dell'autore.
 
HOST_TCP=www.dns-diy.com  # Un noto ISP amico degli spammer.
PORTA_TCP=80              # La porta 80 viene usata da http.

# Tentativo di connessione. (Abbastanza simile a un 'ping.')
echo "HEAD / HTTP/1.0" >/dev/tcp/${HOST_TCP}/${PORTA_TCP}
MIOEXIT=$?

: <<SPIEGAZIONE
Se bash è stata compilata con l'opzione --enable-net-redirections, ha la
capacità di utilizzare uno speciale dispositivo a caratteri per redirigere
sia TCP che UDP. Queste redirezioni vengono usate alla stessa identica maniera
degli STDIN/STDOUT/STDERR. I valori per il dispositivo /dev/tcp sono 30,36:

  mknod /dev/tcp c 30 36

>Dalla bash reference:
/dev/tcp/host/port
    Se host è un nome valido o un indirizzo Internet, e port un numero
intero di una porta o il nome di un servizio, Bash tenta di aprire una
connessione TCP al socket corrispondente.
SPIEGAZIONE

   
if [ "X$MIOEXIT" = "X0" ]; then
  echo "Connessione riuscita. Codice d'uscita: $MIOEXIT"
else
  echo "Connessione fallita. Codice d'uscita: $MIOEXIT"
fi

exit $MIOEXIT

Note

[1]

I file presenti in /dev forniscono i punti di mount per i dispositivi fisici o virtuali. Queste registrazioni occupano pochissimo spazio su disco.

Alcuni dispositivi, come /dev/null, /dev/zero e /dev/urandom sono virtuali. Non corrispondono, quindi, ad alcun dispositivo fisico ed esistono solo a livello software.

[2]

Un dispositivo a blocchi legge e/o scrive i dati in spezzoni, o blocchi, a differenza di un dispositivo a caratteri che accede ai dati un carattere alla volta. Esempi di dispositivi a blocchi sono l'hard disk e il CD ROM. Un esempio di dispositivo a caratteri è la tastiera.

[3]

Naturalmente, il punto di mount /mnt/memoriaflash dev'essere già stato creato. In caso contrario, come utente root, mkdir /mnt/memoriaflash.

Il "montaggio" effettivo della memoria viene effettuato tramite il comando: mount /mnt/memoriaflash

Le distribuzioni Linux più recenti montano le memorie flash automaticamente nella directory /media.

[4]

Un socket è un nodo di comunicazione associato ad una specifica porta I/O. (È analogo ad un socket hardware, o presa, per la connessione di un cavo.) Consente il trasferimento di dati tra i dispositivi hardware della stessa macchina, tra macchine della stessa rete, tra macchine appartenenti a reti diverse e, naturalmente, tra macchine dislocate in posti differenti dell'Internet.