Cos’è un hard link? — definizione di The Linux Information Project (LINFO)

Un hard link è semplicemente un nome aggiuntivo per un file esistente su Linux o altri sistemi operativi Unix-like.

Ogni numero di hard link, e quindi ogni numero di nomi, può essere creato per qualsiasi file. Gli hard link possono anche essere creati per altri hard link. Tuttavia, non possono essere creati per le directory, e non possono attraversare i confini del filesystem o passare attraverso le partizioni.

Il sistema operativo non fa alcuna distinzione tra il nome che è stato originariamente assegnato a un file quando è stato creato per la prima volta e qualsiasi hard link che viene creato successivamente per quel file, se non che sono semplicemente nomi multipli per lo stesso file. Questo perché il nome originale e qualsiasi hard link puntano tutti allo stesso inode. Un inode è una struttura di dati (cioè, un modo ottimizzato di memorizzare informazioni) che memorizza tutte le informazioni su un file (ad esempio, la sua dimensione, i suoi permessi di accesso, quando è stato creato e dove si trova sul sistema) tranne i suoi nomi e i suoi dati effettivi. Il fatto che i numeri di inode siano unici solo all’interno di qualsiasi filesystem è la ragione per cui non funzionano tra filesystem e partizioni.

Gli hard link sono creati con il comando ln. Per esempio, il seguente creerebbe un hard link chiamato hlink1 ad un file chiamato file1, entrambi nella directory corrente (cioè, la directory in cui l’utente sta attualmente lavorando):

ln file1 hlink1

Quando un hard link viene creato, non c’è alcuna indicazione evidente che sia diverso da qualsiasi altro file. Cioè, gli hard link sembrano essere file dello stesso tipo dei loro file di destinazione (cioè, i file a cui sono collegati) quando sono visti con comandi come ls (cioè, lista) e file (che è usato per determinare il tipo di qualsiasi file specificato). Allo stesso modo, quando vengono visualizzati in una GUI (interfaccia grafica utente), le icone per gli hard link sono identiche a quelle per i loro file di destinazione.

Che il nome iniziale di un file e tutti gli hard link a quel file condividono tutti lo stesso inode può essere visto chiaramente utilizzando il comando ls con la sua opzione -i (cioè, inode). Così, per esempio, il seguente mostrerebbe che i numeri di inode di file1 e hlink1 dell’esempio precedente sono identici:

ls -i file1 hlink1

Il numero di hard link a qualsiasi file è mostrato nella seconda colonna dell’output prodotto usando ls con la sua opzione -l (cioè, long). Si può vedere che il numero è la somma del file di destinazione e di tutti gli hard link ad esso (cioè la somma del nome iniziale e di ogni nome aggiunto successivamente) e che è lo stesso per il target e per ogni collegamento.

I file con hard link possono anche essere trovati usando il comando find con la sua opzione -type f (per selezionare solo i file regolari) seguita dalla sua opzione -links +1 (per mostrare tutti i file regolari con più di un hard link ad essi) come segue:

find -type f -links +1

Quando viene fatta una modifica al contenuto di un file, il collegamento a tutti gli hard link viene conservato. Tuttavia, alcuni editor di testo possono rompere il collegamento creando un nuovo inode per il contenuto modificato,1 e quindi può essere prudente controllare i collegamenti importanti dopo aver modificato i file.

Il comando rm sembra superficialmente rimuovere o cancellare i file. Ciò che fa realmente, tuttavia, è ridurre il numero di hard link di un file (cioè il numero di nomi che il file ha) di uno, e non influenza direttamente l’inode o i dati del file. Quando il conteggio raggiunge lo zero, il file sembra essere scomparso perché non c’è più alcun modo semplice per farvi riferimento. Tuttavia, i dati del file sono veramente cancellati solo quando la posizione (o le posizioni) sul disco rigido (HDD) o altri supporti di memorizzazione che lo contengono vengono sovrascritti da un nuovo file.

Così, per esempio, il seguente rimuoverà l’hard link hlink1 che è stato creato nell’esempio precedente:

rm hlink1

Utilizzando di nuovo rm con l’unico nome rimasto come segue, i dati del file saranno virtualmente inaccessibili:

rm file1

Forse l’applicazione più utile per gli hard link è quella di permettere a file, programmi e script (cioè programmi brevi) di essere facilmente accessibili.programmi brevi) di essere facilmente accessibili in una directory diversa dal file originale o dal file eseguibile (ad es, la versione pronta ad essere eseguita di un programma). Digitando il nome dell’hard link, il programma o lo script verrà eseguito allo stesso modo del suo nome originale.

I collegamenti simbolici, chiamati anche soft link, sono più utili degli hard link perché possono essere fatti sia a directory che a file su diversi filesystem e su diverse partizioni. Inoltre, quando si usa una GUI, i collegamenti simbolici hanno icone speciali che li identificano immediatamente come collegamenti piuttosto che file ordinari. Tuttavia, hanno lo svantaggio di diventare inutilizzabili se il loro file di destinazione viene cancellato.

Gli alias assomigliano superficialmente agli hard link in quanto sono un altro modo di fornire più nomi per qualsiasi file. Tuttavia, il comando alias è incorporato nella shell (cioè il programma che fornisce l’interfaccia utente di solo testo) piuttosto che essere un programma separato e il meccanismo è molto diverso da quello degli hard link. Come i collegamenti simbolici, gli alias possono essere usati non solo per i file ma anche per le directory e possono attraversare i confini del filesystem e delle partizioni. Inoltre, un alias può essere usato come nome breve per qualsiasi testo della shell (cioè, un comando o una serie di comandi collegati, comprese le opzioni e/o gli argomenti di tbeir).

________
1I test su Red Hat Linux 9 hanno rilevato che gli hard link venivano interrotti quando si modificavano i file utilizzando l’editor di testo gedit. Tuttavia, non erano interrotti quando si usavano gli editor di testo vi e Abiword e l’editor esadecimale KHexEdit sulla stessa versione di Linux. Il fallimento di gedit nel preservare gli hard link era dovuto al fatto che crea effettivamente una copia del file modificato che salva (e quindi il nuovo numero di inode) piuttosto che fare le modifiche al file originale, ma a questa copia viene dato il nome del file originale. Tuttavia, un test simile usando una versione più recente di gedit (2.14.0) su Fedora Core 5 ha mostrato che il problema è stato corretto e che non c’è stata alcuna rottura dei collegamenti.