2011-01-10

Link in unix/linux - 2 - i link fisici / hard link

Per analizzare la differenza tra i due tipi di link, che ricordo essere fisici o simbolici, riprendiamo l'output della prima serie di comandi del post precedente, i primi due file file1 e file2 oltre ad avere la stessa dimensione hanno anche il numero 2 nel secondo campo in cui il comando ls -l riporta solitamente il numero 1, difficilmente si nota questo campo e molti non ne conoscono nemmeno il significato.

Il valore rappresentato dal secondo campo è il numero di link che puntano a quel file, un file solitamente ha un numero di link uguale a 1, una directory ha un numero maggiore o uguale a 2.
Per comprendere il significato del numero di link si devono approfondire alcuni concetti che stanno alla base dei file system in unix e quindi Linux; in un file system i file sono associati ad i-node, ogni i-node rappresenta un file e contiene gli indirizzamenti ai blocchi del disco che ne contengono i dati. Un i-node non ha un nome ma solo un numero, visualizzabile con l'opzione -i del comando ls, il numero di i-node é un numero univoco all'interno del file system, non univoco all'interno del sistema in quanto ogni file system ha la sua numerazione e se nel sistema ci sono più partizioni/volumi si possono trovare dei numeri di i-node uguali. Un i-node, come scrivevo prima, non ha un nome ma non per questo i file non hanno nome, il nome lo acquisiscono quando viene creato il primo link allo i-node, il primo link viene creato al momento della creazione del file e consiste nel creare una voce con il nome del file in una directory con ad essa associato il numero di inode; in pratica le directory non sono altro (non vorrei semplificare troppo...) che una semplice lista di nomi tramite i quali reperire il numero di i-node. Le funzioni di sistema per permettono di creare un file provvedono, al momento della propria esecuzione, a creare l'i-node e a collegargli il nome nella directory destinata a contenerlo in base al percorso fornito.
Il primo comando che abbiamo usato nel nostro esempio
echo "contenuto del file originale" >file1
crea un nuovo file e ci riversa dentro del contenuto quindi la creazione corrisponde alla generazione di un nuovo i-node e la creazione di una voce che punta al nuovo i-node con il nome file1 dentro la directory corrente, poi aggiunge contenuto al file ma non ci interessa molto per il momento. Il secondo comando
ln file1 file2
non ha creato nessun nuovo i-node ma solo una nuova voce con il nome file2 nella directory corrente che punta allo stesso i-node puntato da file1. La prova possiamo averla eseguendo il comando
ls -i file1 file2
che riporta i numeri di i-node dei due file che coincidono. I link fisici ad uno stesso i-node non hanno limiti di numero, a meno che non vogliate raggiungere numeri improbabili, la creazione di un nuovo link non occupa spazio su disco per i dati contenuti nel file, occuperà solo uno spazio nella struttura della directory in cui viene creato il link.
La cancellazione di un link determina la cancellazione del file fisico e quindi dello i-node solo se il link é l'ultimo link che punta allo i-node (per correttezza aggiungo "e nessun programma tiene aperto il file" ma questo potrà essere argomento di un futuro post), quindi può capitare di rimuovere un file ma lo spazio libero su disco non aumenta se il file cancellato puntava ad un i-node al quale puntano ancora altri nomi; il numero evidenziato dall'opzione -i del comando ls serve al sistema per tenere il conto dei nomi di file che fanno riferimento allo i-node e viene incrementato di uno alla creazione di ogni link e viene decrementato alla cancellazione di ogni file che punta allo i-node, arrivati a zero viene rimosso anche lo i-node. Alla creazione del secondo link ad un i-node non sarà riconoscibile la sequenza di creazione dei link e quindi non c'è traccia di quale sia il file originale.
I link fisici possono essere creati anche in directory diverse purché appartenenti allo stesso file system, tale limitazione è imposta dal fatto che non si può creare un file in una directory che punti ad un i-node di un altro file system in quanto le directory contengono solo le associazioni tra nomi di file e i-node che abbiamo visto univoci solo all'interno del file system o partizione o volume.
I link fisici non si possono creare fra directory ma analizzando i numeri che compaiono con il comando ls -l quando sono presenti delle directory può sembrare il contrario visto che non tutte le directory hanno il numero 2; i valori aumentano con l'aumentare del numero di directory contenute direttamente nella directory in quanto ogni directory al suo interno contiene una voce . che punta a se stessa che sommata alla voce presente nella directory che la contiene fa 2. Ogni directory contiene anche una voce .. che punta alla directory che la contiene e per questo motivo una directory ha un numero di link più grande tante più directory vi sono contenute direttamente.
Vedremo in seguito che link fra file system diversi e link fra directory si potranno creare ricorrendo al secondo tipo ovvero i link simbolici.

Segue...

Nessun commento:

Posta un commento