Prima di vedere i collegamenti reali, ti consiglio di conoscere gli inode in Linux. Un filesystem Linux ha due componenti principali:un pool di blocchi di dati in cui sono archiviati i dati e un sistema di database per gestire questo pool di dati. L'inode è come l'indice di questo sistema di database.
Cos'è l'hard link in Linux?
Un collegamento fisico a un file punta all'inode del file invece di puntare al file stesso. In questo modo l'hard link ottiene tutti gli attributi del file originale e punta allo stesso blocco di dati del file originale.
Se ricordi il collegamento simbolico o il collegamento software, sai che punta al file. Un collegamento fisico è una voce creata manualmente in una directory che punta a un inode già esistente.
Ve lo spiego con schemi adeguati. Prendiamo ad esempio questa struttura di directory:
Quindi, in pratica, la directory root contiene le directory dir_1 e dir_2. La directory dir_1 contiene file file_1 e file_2 mentre dir_2 contiene file_3 e un collegamento reale al file 2.
Vediamo come appaiono le cose nel filesystem. Tutto è rappresentativo. In realtà, la directory principale conterrà migliaia di file. Qui, assumiamo che abbia solo due directory.
Ricordi la struttura delle directory di Linux? Inizi con la radice (/). La directory principale ha sempre l'inode 2.
Se devi accedere al file 3, il percorso assoluto sarebbe /dir_2/file_3. Qui puoi leggerlo in questo modo:inizi dall'inode 2 (root sempre indoe 2) e segui la freccia fino al suo blocco dati. Questo blocco dati contiene le informazioni sull'inode della dir_2 (inode 27 nel nostro esempio).
Ora esamini l'inode 27. Il suo tipo è directory. Segui il suo blocco dati che contiene informazioni sull'inode di file_3 (inode 88). Guardi nell'inode 88. Il suo tipo è file e se segui il suo blocco dati, accedi al contenuto del file.
Hai notato che la directory stessa non contiene i dati del suo file? Le directory sono essenzialmente un file che contiene le informazioni sugli inode dei loro file e sottodirectory.
Ti starai chiedendo quale sia il conteggio dei collegamenti nell'immagine sopra. Questo è molto importante specialmente quando hai a che fare con hard link. Il conteggio dei collegamenti è il numero di voci di directory che puntano a un inode. Prendi l'inode 27 per dir_2, ad esempio. L'inode 27 si trova una volta nel blocco dati della directory principale e una volta nel proprio blocco dati (la directory speciale .). E quindi ha un numero di link di 2.
Si noti che tutti i file hanno il conteggio dei collegamenti 1 tranne file_2? Se un file ha un numero di collegamenti superiore a 1, significa che ci sono collegamenti reali "a questo file". Poiché i collegamenti fisici puntano allo stesso inode (inode 17 nel nostro esempio) del file di destinazione, ottieni 2 elenchi di directory per l'inode 17 (nel blocco dati di dir_1 e dir_2).
Come creare collegamenti reali in Linux
È possibile utilizzare il comando ln per creare un collegamento fisico:
ln target_file link_name
Questo creerà un hard link chiamato link_name al file_destinazione. Vedrai che link_name sembra un file normale e i suoi attributi sono gli stessi del file di destinazione.
Se usi il comando ls -li (l'opzione -i mostra il numero di inode), vedrai che il conteggio dei link è 2. Il conteggio dei link è dopo il campo di autorizzazione del file.
134195 -rw-r--r-- 2 abhishek abhishek 0 Jul 17 19:49 target_file
134195 -rw-r--r-- 2 abhishek abhishek 0 Jul 17 19:49 link_target_file
Entrambi hanno lo stesso numero di inode 134195, ovviamente.
Cose da tenere a mente sugli hard link
Ora che hai una buona idea degli hard link in Linux, andiamo un po' oltre.
L'eliminazione del file di destinazione non cancellerà più i suoi dati se ha collegamento reale
Se elimini il file di destinazione, puoi comunque accedere al suo contenuto tramite il collegamento fisico. È perché sia il file di destinazione che l'hard link hanno lo stesso inode e quindi puntano allo stesso blocco di dati.
L'eliminazione di file in Linux è sostanzialmente scollegare. Supponiamo di eliminare il file_1 usando il comando rm. Il kernel Linux troverà che file_1 corrisponde all'inode 16. Rimuoverà la voce file_1 dall'elenco di dir_1 e ridurrà il conteggio dei collegamenti dell'inode 16 di 1. Ora che il conteggio dei collegamenti dell'inode 16 è 0, il kernel sa che non c'è nessuno che si colleghi a questo inode quindi è sicuro rimuovere l'inode ed eliminare il blocco di dati ad esso associato.
Ora supponi di eliminare file_2. Il kernel rimuoverà il file_2 dall'elenco di dir_1 e andrà all'inode 17. Ridurrà il conteggio dei collegamenti dell'inode 17 portandolo a 1. Poiché il conteggio dei collegamenti non è zero, il kernel non cancellerà l'inode o i dati associati a esso. E quindi, se accedi all'hard link, puoi comunque accedere ai dati anche se il file originale è stato cancellato.
Non dovresti creare un hard link a una directory
Puoi creare un collegamento software a una directory, ma quando provi a creare un collegamento reale a una directory, vedrai un errore come questo:
ln: newdir/test_dir: hard link not allowed for directory
Perché i collegamenti reali non sono consentiti per la directory? È perché l'utilizzo di collegamenti reali per la directory potrebbe interrompere il filesystem. Teoricamente, puoi creare un collegamento fisico alle directory usando l'opzione -d o -F. Ma la maggior parte delle distribuzioni Linux non lo consente anche se sei un utente root.
È quasi impossibile distinguere tra i collegamenti reali e il file originale
Diamo un'altra occhiata al collegamento reale che ho creato in precedenza:
134195 -rw-r--r-- 2 abhishek abhishek 0 Jul 17 19:49 target_file
134195 -rw-r--r-- 2 abhishek abhishek 0 Jul 17 19:49 link_target_file
Hanno attributi identici ma puoi indovinare qual è il collegamento in base al nome nell'esempio sopra, ma cosa succede se il nome non fosse ovvio? Come faresti a sapere se i loro nomi fossero target_1 e target_2?
Se il file e i collegamenti si trovano in una directory diversa, puoi provare a controllare mtime e altri parametri per sapere quando il contenuto della directory è stato modificato, ma anche questo non è una certezza. Se il file e l'hard link si trovano nella stessa directory e la cronologia è stata cancellata, non sono sicuro di come si possa capire quale sia il file originale e quale l'hard link.
Suggerimento bonus:come trovare tutti i collegamenti reali a un determinato file
Se vedi che un file ha più di un numero di link, potresti essere curioso di conoscere gli altri hard link ad esso associati.
Un modo per trovarlo è usare il numero di inode del file. Puoi usare il comando ls -i o il comando stat per ottenere il numero dell'inode.
Una volta che hai il numero di inode, puoi vedere tutti i link ad esso associati usando il comando trova.
find . -inum inode_number
È stato difficile capire gli hard link?
Spero che non sia stato troppo "difficile" e che tu abbia una migliore comprensione del concetto di collegamento fisico in Linux. Se hai dubbi o suggerimenti su questo argomento, lascia un commento qui sotto.