Entrando nel mondo di Linux, una delle cose con cui spesso hanno difficoltà i nuovi utenti è capire la differenza fra Hard Link (o collegamento fisico) e Symbolic/Soft Link (collegamento simbolico). Vediamo quindi un esempio chiarificatore su come usare entrambi.
Le informazioni riguardanti un oggetto (file o directory) di un filesystem cono contenute in un inode, che viene identificato da un numero progressivo e descrive le caratteristiche base di un oggetto: permessi, data di modifica, tipo, posizione ecc.
Il comando ln crea un link (alias) di un file o directory.
Quando si opera sul link è come se si operasse direttamente sul file tranne quando si rimuove il link (non si cancella il file).
Per default ln crea un hard link: di fatto un altro nome per un file esistente, originale e link sono indistinguibili, condividono lo stesso inode, non si possono fare hard link fra file system diversi e su directory.
Con l’opzione -s (molto usata) si crea un soft link o symlink: sono un tipo speciale di file che si riferiscono ad un file (inode) diverso, il symlink può essere fatto su filesystem diversi (nfs, cdrom ecc.) e su file che non esistono. Rispetto ad un hard link, è più facile capire di quale file sono un link.
L’uso di link è completamente trasparente e NON impatta sulle performance del sistema.
Il sistema operativo UNIX permette di creare sia hard link sia symbolic link (detti anche soft link). La sintassi per la creazione di un hard link è
ln source_file my_file
mentre la sintassi per la creazione di un link simbolico è
ln -s source_file my_file
La differenza tra hard link e soft link è motivo di confusione tra i nuovi utenti UNIX quindi in questo articolo cercherò di chiarirla.
I nomi dei file in UNIX possono essere pensati come link ad una astrazione chiamata inode. Quando si lavora su un filename su un sistema UNIX di solito si è rediretti all’inode cui il file punta. Quando si crea un hard link, ciò che davvero si sta facendo è dire “fa sì che il filename my_file
rimandi allo stesso inode cui rimanda il filename source_file
“.
I link simbolici funzionano in maniera lievemente differente (come potrete immaginare). Invece di linkare il file-name my_file
allo stesso inode del file-name source_file
, i link simbolici redirezionano il file-name my_file
al file-name source_file
. Rileggi con attenzione quanto detto così da essere certo di aver colto la differenza tra i due.
Questa distinzione è importante poiché si traduce nel differente funzionamento degli hard link rispetto ai link simbolici.
Il modo miglore per notare questa differenza è mostrarne un esempio.
Cominciamo col creare un source_file
con una linea di testo in esso e creare un hard link:
$ echo "line of text" > source_file $ cat source_file line of text $ ln source_file my_file $ cat my_file line of text
Come potete vedere, poiché il file-name my_file
è collegato allo stesso inode di source_file
, i due file-name sono a tutti gli effetti equivalenti. Ora, se eliminiamo il file-name source_file
, my_file
ancora rimanderà all’inode in cui abbiamo salvato la linea di testo, quindi funzionerà ugualmente:
$ rm source_file $ cat source_file cat: source_file: No such file or directory $ cat my_file line of text
La differenza chiave tra hard link e soft link diventa chiara se proviamo a fare lo stesso, ma stavolta con un link simbolico:
$ echo "line of text" > source_file $ cat source_file line of text $ ln -s source_file my_file $ cat my_file line of text
Fino a questo punto tutto funziona nello stesso modo. Poiché il file-name my_file
rimanda al file-name source_file
, invocare il comando cat my_file
equivale a chiamare cat source_file
. Tuttavia, ora, se noi eliminassimo il file-name source_file
, andremmo incontro a dei problemi:
$ rm source_file $ cat source_file cat: source_file: No such file or directory $ cat my_file cat: my_file: No such file or directory
Questa volta, my_file
era solo linkato a source_file
e non all’inode. Di conseguenza, quando eliminiamo source_file
, my_file
rimane in effetti collegato ad una entità non più esistente e perciò non è più possibile accedere all’informazione salvata in quell’inode.