9.2. Tutto è un file

Il Manuale dell'utente ha introdotto i concetti di proprietà dei file e di permessi di accesso, ma per capire davvero il filesystem di Unix (e questo vale anche per il filesystem ext2fs di GNU/Linux) è necessario ridefinire il concetto stesso di file.

In questo caso "tutto" significa davvero tutto: un disco rigido, una partizione sul disco, una porta parallela, una connessione a un sito web, una scheda Ethernet, tutte queste cose sono dei file. Persino le directory sono file. GNU/Linux è in grado di riconoscere molti tipi di file oltre ai file e alle directory standard. Notate che con "tipo di file" qui non ci riferiamo al contenuto di un file: per GNU/Linux e qualsiasi altro sistema Unix, un file, che si tratti di un'immagine GIF, di un file binario o di qualsiasi altro tipo, non è altro che una sequenza di byte. L'operazione di distinzione dei file in base al loro contenuto viene lasciata alle applicazioni.

9.2.1. I diversi tipi di file

Come ricorderete, quando impartite il comando ls -l, il carattere subito prima dei permessi di accesso identifica il tipo di file. Abbiamo già visto due tipi di file: file normali (-) e directory (d). Se cominciate a esplorare la struttura delle directory del vostro sistema, ed elencate il contenuto delle directory, troverete anche qualcuno dei seguenti:

  1. File in modalità a caratteri: questi sono file di sistema speciali (come /dev/null, che abbiamo già incontrato), o periferiche (porte parallele o seriali), che hanno in comune il fatto che il loro contenuto (se ne hanno) non è bufferizzato (in altre parole, non sono conservati in memoria). File di questo tipo sono identificati per mezzo della lettera 'c'.

  2. File in modalità a blocchi: questi file sono periferiche e, a differenza dei file in modalità a caratteri, il loro contenuto è bufferizzato. File che rientrano in questa categoria sono, ad esempio, dischi rigidi, partizioni, lettori floppy, lettori CD-ROM e così via. I file /dev/hda, /dev/sda5 sono esempi di file in modalità a blocchi. Nella visualizzazione dei risultati di ls -l, questi file sono identificati con la lettera 'b'.

  3. Collegamenti simbolici (noti anche come "link simbolici"): questi file sono molto diffusi, e ampiamente utilizzati nella procedura di avvio del sistema in Mandrake Linux (si veda in proposito il capitolo I file di avvio del sistema: init sysv). Come suggerisce il nome, il loro scopo è quello di collegare i file in modo simbolico, il che significa che file di questo tipo possono riferirsi a un file esistente o meno; l'argomento sarà affrontato più avanti in questo capitolo. Molto spesso (e a torto, come vedremo in seguito) sono anche detti "soft link". Sono identificati con una 'l'.

  4. Pipe con nome: nel caso ve lo stiate chiedendo, sì, queste pipe sono molto simili a quelle usate con i comandi shell, ma la loro particolarità è quella di avere dei nomi. Continuate a leggere per saperne di più. Sono molto rare, comunque, ed è assai improbabile che voi ne incontriate una durante le vostre esplorazioni del sistema; in caso questo succedesse, la lettera che le identifica è la 'p'. Per saperne di più, date uno sguardo a Pipe "anonime" e pipe con nome.

  5. Socket: questo è il tipo di file usato per tutte le connessioni di rete. Soltanto alcune di esse hanno un nome, tuttavia. Inoltre esistono diversi tipi di socket, ma i collegamenti sono ammessi per un solo tipo; in ogni caso, questo argomento va ben oltre gli obiettivi di questo manuale. File di questo tipo vengono identificati con la lettera 's'.

Ecco un esempio di ciascun tipo file:

$ ls -l /dev/null /dev/sda /etc/rc.d/rc3.d/S20random /proc/554/maps \
/tmp/ssh-maria/ssh-510-agent
crw-rw-rw-    1 root     root       1,   3 mag  5  1998 /dev/null
brw-rw----    1 root     disk       8,   0 mag  5  1998 /dev/sda
lrwxrwxrwx    1 root     root           16 dic  9 19:12 /etc/rc.d/rc3.d/
  S20random -> ../init.d/random*
pr--r--r--    1 maria    maria           0 dic 10 20:23 /proc/554/maps|
srwx------    1 maria    maria           0 dic 10 20:08 /tmp/ssh-maria/
  ssh-510-agent=
$

9.2.2. Gli inodi

Gli inodi costituiscono, insieme all'assioma "Tutto è un file", il nocciolo fondamentale di un qualsiasi filesystem Unix. Il termine originale inglese"inode" sta per Information NODE.

Gli inodi sono archiviati su disco in una tabella degli inodi. Esiste un inodo per ogni tipo di file che può essere archiviato dal filesystem, incluse directory, pipe con nome, file in modalità a caratteri, e così via. Il che ci porta a un'altra affermazione famosa: "L'inodo è il file". Gli inodi costituiscono anche il modo in cui Unix identifica un file in maniera univoca.

Ebbene sì, avete letto bene: sotto Unix, un file non viene identificato in base al suo nome, ma per mezzo del suo numero di inodo[1]. La ragione di questo va ricercata nel fatto che uno stesso file può avere più nomi, o anche nessun nome. Il nome di un file, sotto Unix, non è che una voce in un inodo di directory; questa voce viene detta collegamento, o link. Passiamo quindi a esaminare i collegamenti in maggior dettaglio.

Note

[1]

Importante: notate che i numeri di inodo sono univoci per ciascun filesystem, il che significa che su di un altro filesystem può esistere un inodo con lo stesso numero. Questo ci porta a capire la differenza tra inodi su disco e inodi in memoria: mentre due inodi su disco possono avere lo stesso numero, a patto che si trovino su filesystem diversi, gli inodi in memoria devono poter disporre di un numero univoco su tutto il sistema. Per garantire l'univocità, si può usare, ad esempio, una tabella hash che associ il numero di inodo all'identificatore del dispositivo.


Tux on Star from MandrakeSoft Linux è un marchio registrato di Linus Torvalds. Tutti gli altri marchi e copyright appartengono ai rispettivi proprietari.
Se non diversamente specificato, i diritti di tutto il contenuto di queste pagine e di tutte le immagini sono proprietà di MandrakeSoft S.A. e MandrakeSoft Inc. 2001.
http://www.mandrakelinux.com/