In questo articolo voglio far luce su una caratteristica peculiare di sistemi Unix based, che ho riscontrato anche negli ultimi due sistemi operativi di casa Microsoft (anche se implementati malissimo :P). Sto parlando dei collegamenti simbolici e degli hard link.

Prima di poter chiarire la differenza tra le due tipologie di collegamenti è bene riportare alla mente il concetto di puntatore in informatica.

Un puntatore è un valore che rappresenta una locazione di memoria. Utilizzando un’analogia pratica è come fornire ad un corriere espresso l’indirizzo al quale egli deve consegnare un pacco. Il pacco rappresenta il dato che deve essere salvato in RAM, mentre l’indirizzo è la posizione all’interno della memoria dove questo verrà collocato. I filesystem vantano una tecnica simile ai puntatori, che prende il  nome di hard link, per permettere di ripescare un determinato file dal disco.

Un hard link non è altro che l’indirizzo fisico di un file presente sul disco. Quando dal window manager noi facciamo doppio click su un documento, in realtà clicchiamo  un hard link che conduce alla posizione del file.

Le potenzialità degli hard link però non si fermano qui, infatti la relazione che intercorre tra un file e il suo hard link non è biiettiva, ovvero non deve esistere necessariamente un solo hard link per ogni file. È possibile, anzi molto probabile su ambienti Unix like, che un file sia puntato da diversi hard link sparsi per l’hard disk.

Propongo un esempio per cercare di chiarire questo concetto. Digitando il comando “ls -a” in una qualsiasi cartella del disco si notano sempre all’inizio dell’elenco due cartelle speciali: “.” e “..“. Esse sono degli hard link rispettivamente alla cartella corrente e alla cartella superiore. Ammettendo che si abbia una cartella di nome Pippo dentro una cartella di nome Pluto avremo che la cartella “.” (ovvero l’hard link relativo ad essa) presente dentro Pippo punta alla stessa locazione del disco a cui punta la cartella “Pippo” (ancora una volta il suo hard link) presente dentro la cartella Pluto.

Da questo esempio (seppur abbastanza contorto, lo ammetto :P) si evince che la cartella Pippo è puntata da due hard link.

È possibile scoprire il numero di hard link posseduti da un file digitando in console il comando “ls -l“: la prima colonna dell’output rappresenta i diritti dei vari utenti sul file, la seconda colonna è un numero intero maggiore o uguale ad 1 e rappresenta il numero di hard link.

A questo punto si deduce logicamente che se si hanno diversi hard link per uno stesso file sparsi per il filesystem, cambiando il contenuto del file attraverso un hard link automaticamente cambia il contenuto su tutti gli altri collegamenti.

I symbolic link, spesso abbreviati in symlink, sono ben diversi dagli hard link, in quanto non puntano ad una posizione fisica del disco, ma al percorso (relativo o assoluto) nel filesystem che conduce al file (ad un suo hard link). Ad esempio un symlink può puntare a “/home/utente/Desktop/file.txt” o, per chi è più familiare con sistemi Microsoft, a “C:\users\utente\desktop\file.txt“.

Riprendendo l’analogia di sopra, se l’hard link rappresenta l’indirizzo di un’abitazione a cui il corriere deve consegnare il pacco, allora il symlink rappresenta le indicazioni stradali per arrivarci (es. tra 100m gira a sinistra, poi dritto per 500m, …). Se una strada cambia senso di marcia allora il corriere non potrà più arrivare a destinazione utilizzando le indicazioni fornitegli, ma potrà farlo conoscendo l’indirizzo di destinazione e avendo una buona cartografia. 🙂

Quindi, a livello pratico qual’è la differenza tra i due tipi di collegamento? Molto semplicemente se io sposto il file “/home/utente/Desktop/file.txt“, il symlink che puntava ad esso non funzionerà più, mentre continuerà a funzionare correttamente un suo eventuale hard link.

Come ultima osservazione vorrei far presente che se elimino un hard link di un file, in realtà non ho eliminato il dato fisico, a meno che esso non fosse l’ultimo. Nel momento in cui tutti gli hard link sono eliminati, il file non viene realmente cancellato (il che rende facilmente recuperabile dei dati eliminati erroneamente), ma lo spazio su disco su cui esso giace viene “flaggato” come libero. Quando il filesystem avrà bisogno di salvare un nuovo file potrà farlo benissimo sopra quella locazione.