Differenze tra HARD LINK e LINK SIMBOLICI in Linux
Quali sono le differenze tra hard link e link simbolici?
L'utilizzo di link (collegamenti) è molto diffuso in ambito GNU/Linux.
Per spiegare cosa sono dobbiamo fare una premessa sistemistica sugli "inode".
Inode: questi, quasi, sconosciuti
Sotto il file system i file sono rappresentati da "inode", abbreviazione di "index node".
Un "inode" è un record nella tabella di un hard disk, che contiene varie informazioni su uno specifico file o directory o qualunque altro oggetto del filesystem.
Creo un file o una directory e viene creato un inode identificato da un numero univoco, ad esempio 1441809
Tra le informazioni contenute nell'inode abbiamo: dimensioni del file (o della directory) collegato all'inode, il suo proprietario e gruppo di appartenenza, la sua data di ultima modifica e accesso, i permessi di accesso, il numero di hard e soft link collegati ...
Facciamo un esempio. Cominciamo con il creare un file "pippo.html" nella directory "/var/www", e dentro scriviamo un testo qualsiasi, ad esempio "questa è una prova"
// mi sposto nella cartella /var/www
cd /var/www
// creo il file
# touch pippo.html
// scrivo il contenuto al suo interno
# echo "questa è una prova" > pippo.html
Visualizziamo il contenuto della cartella www usando il comando "ls", aggiungendo l'opzione "i" per avere un maggior livello di dettaglio
# ls -li
21474980243 drwxr-xr-x. 2 root root 10 Nov 14 2016 cgi-bin
25770109420 drwxr-xr-x. 8 root root 4096 Nov 14 2016 html
17188519507 -rw-r--r-- 1 root root 19 Feb 24 06:51 pippo.html
Il primo numero rappresenta il numero inode associato al file/directoty
Poi abbiamo i permessi
Come terzo elemento un numero ... che capiremo tra poco cosa indica
Seguono il proprietario, il gruppo, il peso, la data, il nome del file/directory
Per accedere all'inode, e quindi alle informazioni complete sul file creato, usiamo il comando "stat" seguito dal nome del file: ritroverete, tra le varie informazioni, il numero 17188519507 assegnato all'inode e il numero di elementi ("Links") che nel filesystem presentano questo inode (al momento della creazione verrà presentato Links:1).
# stat pippo.html
File: "pippo.html"
Size: 19 Blocks: 8 IO Block: 4096 regular file
Device: 804h/2052d Inode: 17188519507 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2018-02-24 06:50:58.838856314 +0100
Modify: 2018-02-24 06:51:06.949736598 +0100
Change: 2018-02-24 07:32:15.722075335 +0100
Birth: -
Quando noi cerchiamo un file lo richiamiamo semplicemente con il suo nome: dietro le quinte il filesystem convertirà questo nome in numero di inode e lo cercherà tra i numeri di inode.
Ogni file o directory del filesystem ha quindi associato un inode. Per cui potremmo pensare che il numero di inode corrisponda al numero di file e directory contenuti nell’hard disk del sistema. In realità, come vedremo, non è così.
Questa premessa era necessaria per capire la logica dei link simbolici e degli hard link.
Siamo abituati a pensare ad un file come ad un oggetto contentente del testo, o del codice di programmazione, o una immagine... ma anche i symlink e gli hard link sono dei file!
Cos'è un SOFT LINK, detto anche SIMBOLIK o SYMLINK?
- Un link symbolico è un file, contenente all'interno un collegamento ad un altro file (o directory)
- Il link simbolico e il file originale hanno un numero inode differente: quindi per il filesytem sono elementi diversi anche se legati da questo link
- Un link symbolico quindi non contiene alcun dato, ma solo un collegamento, e quindi il suo peso è quasi nullo nel filesystem.
- Un link simbolico può avere anche un nome diverso dal nome del file originale.
- Possiamo creare più link simbolici che puntano allo stesso file originale
Possiamo pensare al link symbolico come ad una scorciatoia (tipica per chi usa Windows) per accedere al file (o directory) originario: "cliccando" sul link simbolico, io apro il file del symlink che, grazie al link in esso contenuto, andrà a recuperare i dati del file (o della directory) orginale perchè, come detto, il link symbolico al suo interno non ha dati.
Siamo nella cartella /var/www, dove abbiamo creato il file "pippo.html".
Creiamo un link simbolico a questo file con il nome pluto.html, utilizzando il comando "ln -s" seguito dal percorso al file originale (o dal nome del file se sono già nella sua directory) e dal percorso al link simbolico
# ln -s path_file_originale path_symlink
Nel nostro esempio
# ln -s pippo.html pluto.html
Visualizziamo la lista dei contenuti della directory www
# ls -li
21474980243 drwxr-xr-x. 2 root root 10 Nov 14 2016 cgi-bin
25770109420 drwxr-xr-x. 8 root root 4096 Nov 14 2016 html
17188519507 -rw-r--r-- 1 root root 19 Feb 24 06:51 pippo.html
17188235316 lrwxrwxrwx 1 root root 10 Feb 24 07:19 pluto.html -> pippo.html
Il link symbolico è stato creato e lo identifichaimo facilmente perchè evidenziato da un freccia che punta al file originario.
Vediamo che il numero inode associato al link symbolico, e quello del file originario, sono diversi: per il file system quindi sono elementi distinti (anche se legati dal link)
Poniamo l'attenzione sul terzo elemento di queste righe pippo e pluto, cioè sul numero "1", che appare per entrambi questi files.
Quel numero indica il numero di elementi (files o directories) associati all'inode, cioè con quell'inode.
Nel nostro esempio avremo 1 file associato all'inode 17188519507 (pippo.html) ed 1 file associato all'inode 17188235316 (pluto.html).
Per un file (o directory) possiamo creare uno o più link symbolici e in posizioni diverse del filesystem.
# ln -s pippo.html /var/www/html/minnie.html
# ln -s pippo.html /var/www/html/paperino.html
Se il file originario "pippo.html" fosse cancellato, spostato o rinominato, i link symbolici (i file minnie, paperino e pluto), continueranno ad esistere, tuttavia saranno link "morti" perchè il collegamento con il file originario è andato perduto. Occorre quindi prestare attenzione. Questo, come vedremo, non accade per gli hard link: in caso di cancellazione del file originario l'hard link continuerà pienamente a vivere.
Il link symbolico può risiedere nello stesso filesystem dove risiede il file (o directory) originale, o su un differente filesystem, ad esempio su una chiavetta USB. Questo non è possibile per un hard link.
Per cancellare un link symbolico si usa il comando "rm", o "unlink", seguito dal percorso al link sumbolico da cancellare
# rm /var/www/html/pluto.html
Cos'è un hard link?
L'hard link è anch'esso un file, ma è non contiene un semplice collegamento ad un file, come il soft link: è una vera e propria copia speculare di un file presente sul nostro sistema Linux e quindi conterrà al suo interno il contenuto del file originario.
Le differenze rispetto ad un soft link sono le seguenti:
- può essere creato solo per file e non per directory
- deve essere creato all'interno dello stesso filesystem
- se si cancella, rinomina, sposta, il file originale, l'hard link continuerà ad esistere perché è una copia speculare, quindi ha al suo interno il contenuto del file originale
- essendo una copia speculare di un altro file, occupa spazio nel filesystem, a differenza di un link simbolico che contiene al suo interno solo il link al file originale
- l'hard link ha lo stesso numero inode del file originario ed avrà al suo interno il contenuto esatto del file originario oltre agli stessi permessi, la data di modifica, il propritario, ....: è come se fossero lo stesso file
Si crea utilizzando il comando "ln" seguito dal persorso al file (o directory) orginario.
# ln path_file_originale path_symlink
# ln /var/www/pippo.html /var/www/topolino.html
Vediamo il contenuto della cartella www
21474980243 drwxr-xr-x. 2 root root 10 Nov 14 2016 cgi-bin
25770109420 drwxr-xr-x. 8 root root 4096 Nov 14 2016 html
17188519507 -rw-r--r-- 2 root root 19 Feb 24 06:51 pippo.html
17188235316 lrwxrwxrwx 1 root root 10 Feb 24 07:19 pluto.html -> pippo.html
17188519507 -rw-r--r-- 2 root root 19 Feb 24 06:51 topolino.html
L'hard link topolino.html è stato creato. E vediamo che presenta lo stesso inode del file originario: 17188519507
Poniamo l'attenzione al numero, posto dopo i permessi, nella riga dell'hard link: è 2. Ed anche il file originario adesso non presenta più 1 ma 2 !
Quel numero indica quanti file sono associati allo stesso inode. Sono due perchè sia il file originario che il file hard link puntano allo stesso inode.
Abbiamo detto che il comando stat ci fornisce vari informazioni su un inode di un file. Se facciamo lo stat del file originario pippo.html vedremo "Links: 2": ci sono 2 file associati a quell'inode 17188519507.
E' l'inode a comandare!
Se provo a modificare il contenuto del file originario, il contenuto dell'hard link cambia, idem se modifico l'hard link. Modifico un file e tutti i file collegati vengono modificati.
Se cancello il file originario o l'hard link, tutti gli altri file collegati dallo stesso inode restano pienamente in vita, perchè non cancello l'inode.
L'inode viene cancellato solo se tutti i file collegati sono cancellati (sia l'originale sia gli hard link)
Nella lista dei file della cartella www il symlink pluto.html presenta sempre 1: questo perchè ha un inode distinto dal file originario: 17188235316. Solo lui punta a quell'inode.
Sbizzarritevi con le vostre prove, più provate, più assimilerete questo concetto.
Adesso, cancelliamo l'hard link con "rm"
# rm /var/www/html/pluto.html
Ultima riflessione: se un hard link è una copia speculare di un file... cosa cambia da una copia fatta con il comando "cp" ?
# cp pippo.html nonnapapera.html
Cambia, perchè il file generato con "cp" ha lo stesso contenuto del file originale, ma dal momento della sua creazione avrà una vita totalmente autonoma, è un file totalmente distinto dal file originale, con un suo inode distinto, con i suoi proprietari, permessi, ... Non ha più alcun legame con il file originario. Se lo modifico, il file originario non verrà modificato perchè non esiste alcun legame tra i due.
That's all!