Link rigidi, simbolici ed inode

12/02/24 | ~ 5 minuti

Gli inode

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
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
Nell'esempio soprastante ho simulato di trovarmi all'interno di una directory che contiene un File e una Directory.
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 rigidi

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
totale 0
7890532 -rw-r--r-- 1 luca dajelinux 0 10 feb 19.37 Originale
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) è: $ 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.

Link simbolici

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
totale 0
7890532 -rw-r--r-- 1 luca dajelinux 0 10 feb 19.37 Originale
Ora creiamo un un link simbolico con: $ 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
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
Interessante notare come stavolta ci siano delle differenze rilevanti nell'output.
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.