GNU/Linux >> Linux Esercitazione >  >> Linux

Tutto ciò che è importante sapere su Hard Link in Linux

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.

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).

È 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.

Ora che hai una buona idea degli hard link in Linux, andiamo un po' oltre.

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.

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.

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.


Linux
  1. Tutto quello che devi sapere su Ubuntu 13.04

  2. Cos'è SteamOS? Tutto ciò che è importante sapere su questa "distribuzione di giochi"

  3. Directory Linux tmp:tutto ciò che devi sapere

  4. Compressione file Linux:tutto ciò che devi sapere

  5. Permessi dei file Linux:tutto ciò che devi sapere

Tutto ciò che devi sapere sul sistema operativo Peppermint Linux

Tutto quello che devi sapere su Black Lab Linux

Tutto ciò che devi sapere su Linux Mint Distro

Tutto ciò che devi sapere sugli inode in Linux

Tutto ciò che è importante sapere sull'UID in Linux

Tutto quello che c'è da sapere sulla directory /tmp di Linux