Anche su Linux i file possono avere dei legami e dei collegamenti tra loro, senza dover essere obbligatoriamente duplicati e modificati singolarmente per comparire in più sezioni del file system.
Ciò che contraddistingue in modo inequivocabile file o cartelle sono gli inode. Si tratta di archivi (o meglio di strutture di dati) che contengono al loro interno le informazioni relative ai file e alle directory presenti fisicamente su disco.
Ogni file o cartella, quindi, è rappresentato da un inode specifico, che a sua volta viene identificato con un numero univoco.
Per consuetudine la rappresentazione dei comandi avviene con il prefisso "$ ", che non va digitato nella shell.
Gli inode possono essere visualizzati con il parametro i del comando ls:
$ ls -hil
Nell'esempio soprastante ho simulato di trovarmi all'interno di una directory che contiene un File e una Directory.
totale 4,0K
7890873 drwxr-xr-x 2 luca dajelinux 4,0K 10 feb 19.37 Directory
7890542 -rw-r--r-- 1 luca dajelinux 0 10 feb 19.37 File
La prima colonna di ls mostra il numero degli inode (7890...). Gli altri due parametri (-hl) rendono l'output più leggibile, ma non sono strettamente necessari per ricavare il numero degli inode.
I link non simbolici, o rigidi, condividono lo stesso inode del file originale, pur essendo entità separate.
Le modifiche al file originale o ai collegamenti sono sincronizzate, ma tutti i file possono essere spostati, rinominati ed eliminati separatamente senza conseguenze sugli altri.
In questo modo il file originale può essere replicato ovunque e modificato da ogni posizione; i collegamenti rigidi, tuttavia, possono continuare a sopravvivere a prescindere dalla sorte degli altri file, e sempre mantenendo l'inode dell'originale.
Anche il file di partenza è totalmente indipendente dai suoi eventuali collegamenti.
Poniamo di avere un file Originale all'interno di una cartella:
$ ls -hil
Il suo inode è 7890532.
Il comando per creare un link rigido (in questo caso sempre dentro la stessa cartella di origine, ma potrebbe essere anche altrove) è:
totale 0
7890532 -rw-r--r-- 1 luca dajelinux 0 10 feb 19.37 Originale
$ ln [percorso file originale] [percorso del collegamento]
Quindi procediamo:
$ ln Originale Collegamento_rigido
Infine ricontrolliamo ancora una volta il contenuto della directory:
$ ls -hil
totale 0
7890532 -rw-r--r-- 1 luca dajelinux 0 10 feb 19.37 Originale
7890532 -rw-r--r-- 1 luca dajelinux 0 10 feb 19.37 Collegamento_rigido
I due file con lo stesso inode condivideranno sempre il loro contenuto, ma potranno essere trattati come due soggetti separati.
Nell'esempio in questione potrei rinominare, spostare od eliminare uno dei due file, e comunque non perderei l'altro.
Non è un caso che non abbia mai parlato di cartelle; non è possibile creare link rigidi alle directory.
Se siete pratici con i collegamenti di Windows, i link simbolici sono molto simili.
In questo caso il collegamento ha un inode differente rispetto al file originale, nonostante sia strettamente legato ad esso.
Se si sposta o cancella l'originale, il link simbolico perderà il suo riferimento e smetterà di funzionare.
Torniamo alla nostra cartella di test:
$ ls -hil
Ora creiamo un un link simbolico con:
totale 0
7890532 -rw-r--r-- 1 luca dajelinux 0 10 feb 19.37 Originale
$ ln -s [percorso file originale] [percorso del collegamento]
Che nella pratica diventa:
$ ln -s Originale link_simbolico
Il comando ls adesso ci mostrerà:
$ ls -hil
Interessante notare come stavolta ci siano delle differenze rilevanti nell'output.
totale 0
7890532 -rw-r--r-- 1 luca dajelinux 0 10 feb 19.37 Originale
7874234 lrwxrwxrwx 1 luca dajelinux 9 11 feb 16.22 link_simbolico -> Originale
Ora la prima colonna degli inode ci mostra come si tratti due file completamente differenti, i permessi e le dimensioni sono diverse e c'è un chiaro riferimento al puntamento del link ( link_simbolico -> Originale).
È possibile modificare il contenuto di Originale, ma spostando, rinominando od eliminando il file, il link_simbolico sarà interrotto.