Corso Linux / Hard link e collegamenti simbolici: differenze e prova con ln

Un collegamento fisico, o hard link, è un altro nome per lo stesso inode di un file; un collegamento simbolico, o symlink, è una voce separata che memorizza un percorso. Entrambi consentono di raggiungere un file con un altro nome, ma reagiscono diversamente alla rinomina e ai confini tra file system. In questa lezione creerai entrambi i collegamenti per confrontarli.

Per interpretare inode e numero di collegamenti, consulta la spiegazione su tipi di file e metadati con file e stat.

Due concetti per capire i collegamenti

Una voce di directory come report.txt fornisce un nome utilizzabile in un percorso. Il file system gestisce i metadati dell'oggetto tramite un inode. Aggiungere un collegamento fisico significa aggiungere un altro nome per lo stesso inode: eliminando uno dei nomi, l'altro continua a dare accesso al file.

Un collegamento simbolico contiene invece la stringa del percorso di destinazione. Quando lo apri, il sistema segue quel percorso. Se il nome cercato scompare o viene spostato, il collegamento può rimanere senza consentire più l'accesso: si parla di collegamento interrotto, o dangling link.

Confronto Collegamento fisico Collegamento simbolico
Riferimento Lo stesso inode del file Una stringa con il percorso di destinazione
Inode Uguale per i due nomi Il collegamento ha un proprio inode
Rimozione o rinomina del primo nome L'altro nome continua a funzionare Può interrompersi se il percorso non viene più risolto
Altro file system Non può attraversarne il confine Può indicare un percorso su un altro file system
Destinazione directory Generalmente non consentita Consentita

I due nomi di un hard link hanno pari ruolo: il primo non è un originale privilegiato e il secondo non è una copia di riserva. Le modifiche ai dati dello stesso file sono visibili attraverso entrambi. Confronta i numeri di inode nel medesimo file system; un numero uguale su due file system diversi non prova che si tratti dello stesso oggetto.

Creare il file di prova e i due collegamenti

Usa una shell in Linux, GNU ln, stat e readlink, e una directory personale su un file system che supporti questi collegamenti. Non occorre sudo. Lavora in una nuova directory nella tua home. Se ~/linux-course-09-practice esiste già, scegli un altro nome e usalo coerentemente nei comandi di preparazione.

mkdir fallisce se la directory esiste: in caso di errore fermati, senza proseguire con cd o con la scrittura del file. Esegui e controlla una riga alla volta; incollare tutto senza controlli può portarti a sovrascrivere file già presenti.

mkdir ~/linux-course-09-practice

cd ~/linux-course-09-practice

pwd

Prosegui soltanto se mkdir e cd sono riusciti e pwd indica la nuova directory di prova. Il solo risultato di pwd non dimostra che la directory sia appena stata creata. Nella directory nuova, printf scrive una riga in original.txt; il simbolo > sovrascriverebbe un file già esistente.

printf 'version 1\n' > original.txt

ln original.txt hard.txt

ln -s original.txt shortcut.txt

Il primo ln crea un collegamento fisico con il comportamento predefinito. Il secondo usa -s per creare un collegamento simbolico. shortcut.txt memorizza il percorso relativo original.txt, da interpretare rispetto alla directory che contiene il collegamento, non alla directory corrente della shell.

Controlla che ogni comando riesca prima di passare al successivo. Se un nome di destinazione esiste già o il file system non supporta l'operazione, fermati e verifica l'ambiente; non aggiungere -f e non aumentare i privilegi per forzare l'esercizio.

Controllare inode e destinazione del collegamento

GNU stat mostra il numero di inode con %i, il numero di collegamenti fisici con %h e il nome con %n. Senza -L, esamina il collegamento simbolico stesso. readlink stampa il percorso conservato nel collegamento.

stat -c '%i %h %n' original.txt hard.txt shortcut.txt

readlink shortcut.txt

I numeri effettivi dipendono dal sistema. Nella situazione appena creata, original.txt e hard.txt condividono l'inode e mostrano due collegamenti fisici; shortcut.txt ha un inode distinto. Questa è un'illustrazione, con numeri inventati:

123456 2 original.txt
123456 2 hard.txt
789012 1 shortcut.txt
original.txt

Le prime tre righe provengono dal formato di stat; l'ultima è il risultato di readlink. Il collegamento simbolico non aumenta il numero di hard link del file di destinazione. Il percorso relativo stampato si risolve nella directory che contiene il collegamento: per ora tutti e tre i nomi consentono di leggere gli stessi dati.

cat original.txt

cat hard.txt

cat shortcut.txt

Ogni comando stampa version 1. Il contenuto identico non implica però che i tre nomi abbiano la stessa struttura: due sono nomi dello stesso inode, il terzo rimanda a un percorso.

Che cosa succede cambiando il primo nome?

Rinomina original.txt nella stessa directory di prova. Prima controlla che renamed.txt non esista: l'esempio presuppone una directory nuova e nessuna modifica estranea all'esercizio. hard.txt continua a riferirsi allo stesso inode. shortcut.txt conserva invece il vecchio percorso original.txt e si interrompe.

mv original.txt renamed.txt

cat hard.txt

readlink shortcut.txt

cat hard.txt stampa ancora version 1 e readlink shortcut.txt stampa ancora original.txt. Ora cat shortcut.txt deve segnalare che la destinazione non è trovata: è l'esito previsto, non un motivo per usare privilegi amministrativi. Il testo restituito da readlink non garantisce l'esistenza della destinazione.

Se vuoi provare un collegamento al nuovo nome, puoi eseguire ln -s renamed.txt new-shortcut.txt nella medesima directory, purché new-shortcut.txt non esista già. È un passaggio facoltativo: non modifica il percorso memorizzato in shortcut.txt.

rm shortcut.txt, senza barra finale, rimuove il collegamento simbolico stesso e non il file di destinazione. Non eseguirlo ancora se vuoi completare il ripristino qui sotto. Una barra finale o un percorso che entra in una directory collegata cambia il significato dell'operazione: controlla il percorso preciso prima di eliminare qualcosa, senza ricorrere a una cancellazione ricorsiva per questo esercizio.

Quale collegamento scegliere e come ripristinare la prova

Scegli un collegamento fisico per dare un altro nome a un file sullo stesso file system e mantenerlo accessibile quando uno dei nomi scompare. Il collegamento simbolico è più flessibile per directory e percorsi su altri file system, e rende visibile la destinazione come percorso. Se sposti il collegamento o rinomini la destinazione, verifica nuovamente come si risolve il percorso relativo.

Un collegamento, di qualsiasi tipo, non sostituisce un backup indipendente. Conserva i dati importanti separatamente. Per i dettagli sulla destinazione e sulle opzioni, consulta la guida al comando ln; per il percorso conservato e la sua risoluzione, la guida al comando readlink.

Per tornare alla situazione iniziale, esegui quanto segue nella stessa directory di prova. Se nel frattempo hai creato un altro original.txt, esaminalo prima di procedere: mv -i chiede conferma per sovrascriverlo. Se rifiuti la sovrascrittura, il ripristino non avviene e i risultati descritti qui sotto non valgono ancora.

mv -i renamed.txt original.txt
cat shortcut.txt
stat -c '%i %h %n' original.txt hard.txt

Dopo il ripristino riuscito, shortcut.txt torna a leggere version 1 e i due nomi dell'hard link condividono ancora l'inode. L'eventuale new-shortcut.txt punta invece sempre a renamed.txt: il ripristino può interromperlo, quindi va gestito separatamente. Conserva la directory finché serve; quando decidi di rimuovere gli elementi di prova, controllali singolarmente.

Documentazione ufficiale

Il manuale GNU di ln distribuito da Debian descrive creazione e percorsi relativi. La documentazione Linux symlink(7) spiega la gestione dei collegamenti. Per gli output, consulta i manuali GNU di stat e dei campi di formato e di readlink. Nella tua installazione, man e --help aiutano a verificare la versione disponibile.