GNU/Linux: collegamenti fisici e simbolici

Chi arriva da Windows è abituato a pensare che esista un solo tipo di collegamento: quelle iconcine con la freccetta. In Linux i collegamenti sono due, e la differenza è sostanziale: gli hard link (collegamenti fisici) e i soft link (collegamenti simbolici). Capire bene come funzionano ti permette di rendere file e cartelle accessibili da punti diversi del filesystem senza farti male.

Hard link: piu’ nomi per lo stesso dato

Gli hard link sono, di fatto, il modo normale con cui il sistema collega i nomi ai dati. Creiamo un file con dentro una stringa:

echo "Ciao mondo" > file.txt
ls -l

Guarda l’output di ls -l: dopo la colonna dei permessi c’è un numero. È il numero di collegamenti che puntano a quel dato. Per file.txt vale 1: il file ha un solo nome. Ora aggiungiamo un hard link con il comando ln:

ln file.txt hard.txt
ls -l

Adesso file.txt e hard.txt hanno entrambi il contatore a 2. Perché? Perché sono lo stesso file, o meglio gli stessi dati sul filesystem, raggiungibili da due punti. Sono due etichette dello stesso pacchetto di dati. Per verificarlo aggiungiamo l’opzione -i, che mostra il numero di inode, cioè l’indirizzo dei dati sul filesystem:

ls -li

L’output è qualcosa del genere (i numeri cambiano da macchina a macchina):

25041325 -rw-rw-r-- 2 fabio fabio 11 ott 18 20:28 file.txt
25041325 -rw-rw-r-- 2 fabio fabio 11 ott 18 20:28 hard.txt

Stesso inode, stessi dati. Per capire gli hard link devi scollegare mentalmente il concetto di nome del file da quello di contenuto. Se ora cancelliamo file.txt, hard.txt resta lì, con lo stesso inode, e i dati sono intatti:

rm file.txt
ls -li
cat hard.txt

Ottieni il tuo Ciao mondo. Non esiste un nome “vero”: esistono tanti nomi per lo stesso contenuto. Ognuno si può trattare in modo indipendente, ma puntano sempre agli stessi dati, quindi se modifichi il contenuto da un nome, la modifica si vede da tutti gli altri.

Ricreiamo il primo nome. La sintassi è ln, il percorso di ciò che vuoi collegare, il percorso del nuovo nome:

ln hard.txt file.txt

Possiamo farlo quante volte vogliamo, e qualunque nome può fare da sorgente per altri link:

ln file.txt hard2.txt
ls -li

Ora ci sono tre nomi, e il contatore dice 3. Nessuno dei tre è l’originale: sono tutti e tre ugualmente veri. Proviamo a modificare il contenuto da un nome e a leggerlo da un altro:

echo "Testo modificato" > hard.txt
cat hard2.txt

Qualunque nome usi per scrivere, modifichi i dati sul filesystem, non il nome. Puoi anche spostare i nomi in giro:

mkdir dir
mv file.txt dir/
echo "Altra modifica" >> dir/file.txt
mkdir dir8
mv hard2.txt dir8/
cat dir8/hard2.txt

Anche spostato in un’altra cartella, hard2.txt contiene sempre l’ultima versione dei dati: stiamo solo giocando con i nomi.

I due limiti degli hard link

Gli hard link sono fantastici, ma hanno due limitazioni grosse:

  • essendo nomi associati a un inode, non si possono creare su un filesystem diverso da quello in cui risiedono i dati: la numerazione degli inode è diversa su ogni filesystem, e le allocazioni dei dati pure;
  • non si può fare un hard link a una cartella (e a certi file speciali). Tecnicamente è un po’ complicato, ma la sostanza è che le directory non hanno un inode a cui legare un secondo nome in modo sicuro.

Soft link: un file che contiene un percorso

Per aggirare questi limiti esistono i link simbolici, quelli che gli utenti Windows chiamano semplicemente collegamenti. Sono file speciali il cui compito è puntare ad altri file o cartelle, anche su altri filesystem, perché contengono soltanto un percorso. Si creano con ln e l’opzione -s:

ln -s hard.txt soft.txt
ls -l

Nell’output vedi soft.txt con una freccia verso il file puntato. Con i link simbolici però bisogna stare molto attenti, sono bestie strane:

  • il link simbolico ha permessi suoi, di solito tutti attivi (lrwxrwxrwx), perché è un file speciale; due hard link invece hanno sempre gli stessi permessi, essendo lo stesso file;
  • contiene un riferimento al file di destinazione: se questo viene spostato, rinominato o cancellato, il link si rompe (si parla di broken link, link rotto).

Proviamo a rompere il link rinominando il file puntato:

mv hard.txt altro.txt
cat soft.txt

Il cat dà errore: il file puntato non c’è più. Se invece aprissi il link con un editor ti troveresti davanti un file vuoto, che non è esattamente lo scenario che vorresti. Rimettiamo a posto le cose:

mv altro.txt hard.txt
cat soft.txt

Ora il link funziona di nuovo, e se modifichi il contenuto passando dal link, modifichi il file originario.

C’è un altro caso da conoscere: sposti il link simbolico. Il link contiene un percorso relativo, quindi se lo sposti in un’altra cartella il percorso viene risolto a partire dalla nuova posizione. Prova:

mv soft.txt dir/
cat dir/soft.txt

Il cat non trova niente, perché cerca hard.txt dentro dir/. Se ora crei lì un file con quel nome, ma diverso da quello originale, il link lo mostra senza fare una piega:

echo "Un altro file" > dir/hard.txt
cat dir/soft.txt

Strano, ma è il comportamento corretto: il link simbolico contiene solo un riferimento ed è totalmente agnostico rispetto a ciò a cui sta facendo riferimento.

Link simbolici a cartelle

L’ultima cosa: il link simbolico a una cartella. Entriamo in una sottocartella profonda:

mkdir -p dir2/dir3
cd dir2/dir3

Da qui creiamo un collegamento a una cartella lontana, salendo di due livelli, per esempio dir8:

ln -s ../../dir8 soft
ls -l

Il link soft punta a due livelli sopra e poi a dir8. Se ci entri, soft si comporta esattamente come se fosse una sottocartella di dir3:

cd soft
echo "ciao" > ciao.txt
cd ../../..
ls dir8

Il file ciao.txt, creato passando dal link, si trova nella cartella dir8, cioè in una zona del filesystem completamente diversa. In un certo senso dir8 e soft sono la stessa cartella, o meglio si comportano come se lo fossero. Valgono però tutte le avvertenze di prima su spostamenti, cancellazioni e rinomine degli oggetti puntati.

Cancellare I link

I link si cancellano come file normali con rm. Una lezione che ci portiamo a casa: possiamo ridefinire il concetto di cancellazione dicendo che un file viene cancellato quando viene rimosso l’ultimo dei suoi hard link. Questo spiega anche perché si possono recuperare dei dati cancellati: togliendo un file elimini i suoi nomi, ma i dati restano lì finché non vengono sovrascritti. Ma questo è argomento di un altro video.

Conclusione

I link simbolici sono potentissimi, ma da usare con cautela: ricordati che sono solo riferimenti, e se cambi le carte attorno a loro vanno in banana. Gli hard link sono più robusti ma limitati a un singolo filesystem e ai soli file.

Link e risorse

Sostieni il canale

PER SOSTENERE IL CANALE BASTANO UN LIKE E UN’ISCRIZIONE!

questi link sono affiliati Amazon, acquistando i libri che ti consiglio sostieni il canale!