Qual è la differenza tra link simbolici e hard link?


Risposte:


40

Le diverse semantiche tra i collegamenti hard e soft li rendono adatti a cose diverse.

Collegamenti reali:

  • indistinguibile dalle altre voci della directory, poiché ogni voce della directory è un collegamento reale
  • "original" può essere spostato o eliminato senza interrompere altri hard link sullo stesso inode
  • possibile solo all'interno dello stesso filesystem
  • le autorizzazioni devono essere le stesse di quelle "originali" (le autorizzazioni sono memorizzate nell'inode, non nella voce della directory)
  • può essere creato solo su file, non su directory

Collegamenti simbolici (collegamenti soft)

  • registra semplicemente quel punto in un altro percorso di file. ( ls -lmostrerà a quale percorso punta un collegamento simbolico)
  • si romperà se l'originale viene spostato o eliminato. (In alcuni casi è effettivamente auspicabile che un collegamento punti a qualsiasi file attualmente occupa una posizione particolare)
  • può puntare a un file in un diverso filesystem
  • può puntare a una directory
  • su alcuni formati di file system, è possibile che il collegamento simbolico abbia autorizzazioni diverse rispetto al file a cui punta (ciò non è comune)

1
Bella lista. Volevo solo aggiungere che è anche possibile interrompere un collegamento simbolico relativo al percorso spostando il collegamento simbolico stesso.
jw013,

4
"[E] molto la voce della directory è un collegamento reale." Questo è un punto eccellente che non ho mai visto espresso prima, ma temo che qualcuno che sta appena iniziando a avvolgere i suoi collegamenti o non lo capisca. Per quelli in questa situazione, ecco un suggerimento: il layout di file e directory che vedi quando esegui il comando ls non è esattamente la stessa cosa del sistema di archiviazione che rappresenta. I collegamenti fisici sono riferimenti a un singolo file sul sistema di archiviazione. Un file viene archiviato una volta. Leggi su "inode".
Mario,

@Mario: yup. Ogni voce della directory collega un nome a un inode. Viene persino chiamata la chiamata di sistema per l'eliminazione di un nome file unlink(2). I file "normali" (con un conteggio dei collegamenti pari a 1) sono solo un caso speciale. Se aiuta, puoi pensare agli inode come oggetti e ai nomi come puntatori contati nuovamente (il conteggio dei collegamenti dell'inode è il conteggio dei riferimenti).
Peter Cordes,

1
Potresti pensare a un link simbolico come a un file di testo con un nome al suo interno. Viene interpretato come un collegamento simbolico a causa di un flag speciale per il file. Esempi di collegamenti reali che conosci sono ..e ..
Ned64,

ecco un'altra risposta che spiega perché non è possibile stabilire collegamenti rigidi alle directory . Trovo questa risposta utile perché è più concisa e più facile da leggere.
Trevor Boyd Smith,

18

Il punto di entrambi i tipi di collegamenti è fornire un modo per far apparire un file in due posizioni contemporaneamente. Questo ha molti usi. 9 volte su 10 si desidera utilizzare collegamenti simbolici.

I collegamenti simbolici o "collegamenti simbolici" funzionano un po 'come le scorciatoie di Windows. Il contenuto di un collegamento simbolico è un puntatore alla posizione reale del file / directory. Se elimini il file reale, il collegamento simbolico diventerà "pendente" e non funzionerà. L'eliminazione del collegamento simbolico non elimina il file reale. Puoi avere tutti i collegamenti simbolici a un singolo file (o anche altri collegamenti simbolici) che desideri.

A differenza di Windows, tuttavia, funzionano a livello di filesystem, non a livello di shell o di applicazione, quindi praticamente qualsiasi applicazione "seguirà" i collegamenti simbolici come previsto. ls -alpuò essere usato come un modo rapido per vedere dove "simbolizzano" i link simbolici.

I collegamenti fisici funzionano anche a un livello inferiore. Un hardlink è una voce di directory effettiva e fisica a livello di file system del file. Tecnicamente, una voce della directory è un hardlink, quindi ogni file ha almeno un hardlink in una directory da qualche parte. I collegamenti fisici non sono separati dal file a cui puntano; se un file ha più hardlink in diverse directory, l'eliminazione del hardlink con utility come rmnon eliminerà veramente il file, fino a quando tutti i hardlink non saranno spariti.

Non riesco a pensare a una situazione in cui l'uso di hardlink sia comune o addirittura necessario, a meno che tu non voglia intenzionalmente impedire che i file vengano cancellati o che tu stia facendo uno strano lavoro di basso livello con partizioni o altre cose relative al filesystem. EDIT: Ci sono grandi idee nelle altre risposte a questa domanda, però!


Inoltre, i collegamenti simbolici hanno autorizzazioni come i normali file, ma il sistema operativo non li consulta, consulta invece il file di destinazione delle autorizzazioni per decidere il comportamento. E, non fare catene circolari di collegamenti simbolici. Molto brutto.
LawrenceC,

3
È davvero molto male? Cosa accadrà? Il massimo di entusiasmo che sono in grado di ricreare sono i messaggi di errore "Troppi livelli di collegamenti simbolici".
Mattdm,

1
ls -lè sufficiente vedere cosa viene collegato da un collegamento simbolico, asta per --all, vedere manpage. E anche se i collegamenti simbolici funzionano nel file system, ci sono funzioni alternative per utilizzare i collegamenti simbolici come file invece di follow.
D4RIO,

4
Le scorciatoie di Windows sono in realtà abbastanza diverse dai collegamenti simbolici: seguono il loro obiettivo e sono anche file regolari. (Windows ha anche collegamenti simbolici, ma non sono utilizzati molto.) I collegamenti simbolici sono puramente testuali, il testo di destinazione viene letto ogni volta che si accede al file. L'importanza delle autorizzazioni per il collegamento simbolico dipende dal sistema operativo e dal file system.
Gilles 'SO- smetti di essere malvagio' il

AFAIK, il contenuto di un file symlink è il percorso a cui punta il symlink, che può essere visto osservando la dimensione del file symlink: ln -s /home 1; ls -l 1mostra che il symlink 1 è lungo 5 byte, mentre ln -s /usr/share/ 2; ls -l 2mostra che 2 è lungo 11 byte.
Daniel Kullmann,

13

I collegamenti fisici sono molto utili per i meccanismi di backup basati su disco, poiché è possibile disporre di un albero di directory completo per ciascun backup condividendo lo spazio per i file che non sono stati modificati e il filesystem tiene traccia del conteggio dei riferimenti, quindi quando l'ultimo riferimento a una data versione scompare perché il backup è scaduto / rimosso per motivi di spazio, lo spazio utilizzato viene recuperato automaticamente. Alcuni client di posta lo usano anche per i messaggi archiviati in più cartelle, per lo stesso motivo.


5
Forse meccanismi di controllo della versione basati su disco? Se si collega qualcosa, non si tratta di un backup. Se il file originale viene danneggiato, anche ogni collegamento a esso viene danneggiato.
D4RIO,

1
Pensa a sistemi di backup incrementali come Time Machine di Apple. (Dovrebbe essere ovvio che questi non sono backup di tipo disaster recovery, ma backup "spiacenti, ho eliminato quel file per errore".) Tutti i file invariati in un backup incrementale sono collegati insieme; quando il file viene modificato, il successivo incrementale lo copia invece di collegarlo alla versione precedente.
Geekosaur,

Grazie, quindi i sistemi di backup incrementali sono abbastanza simili ai sistemi di controllo della versione in questo modo = D
D4RIO

Ma come fa il meccanismo di backup incrementale a preservare la "vecchia" versione di un file? 1) Il backup A è stato creato, ha un file F; 2) File F modificato; 3) il giorno successivo il Backup B è stato creato ... Sembra che non ottenga qualcosa
Dmitry Pashkevich

3

I collegamenti fisici sono solo riferimenti agli stessi spazi su disco, quindi il "perché" non è possibile collegare in modo rigido qualcosa in un altro file system.

I collegamenti simbolici sono file che collegano altri file (come scorciatoie di Windows), forse nello stesso filesystem, forse no.

EDIT: spiegherò qualcosa di più. Ogni file esistente ha almeno 1 hard link. I collegamenti reali sono il modo per accedere al contenuto di un inode del filesystem. È possibile ottenere il numero di inode di un file con ls -ie ottenere il numero di hardlink con statcome segue in questo esempio:

$ stat plantilla-disenos.odt 
  File: «plantilla-disenos.odt»
  Size: 12367       Blocks: 32         IO Block: 4096   fichero regular
Device: 803h/2051d  Inode: 319875      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/   d4rio)   Gid: ( 1000/   d4rio)
Access: 2011-02-11 21:36:19.000000000 -0300
Modify: 2010-03-02 23:27:28.000000000 -0300
Change: 2010-04-10 17:46:27.000000000 -0300

Grazie @geekosaur per questo riferimento:

Il kernel deve riavviare la traduzione da pathname a inode (attraversando l'albero delle directory) per espandere i collegamenti simbolici, mentre i collegamenti reali usano tutti lo stesso inode. (Vedrai spesso questo indicato come namei, dal nome della funzione del kernel che ha fatto questo in Unix tradizionale.)

e questo (modificato):

I collegamenti fisici sono molto utili per i meccanismi di backup incrementali basati su disco come Time Machine di Apple , poiché è possibile disporre di un albero di directory completo per ciascun backup condividendo lo spazio per i file che non sono stati modificati e il filesystem tiene traccia del conteggio dei riferimenti, quindi quando l'ultimo riferimento a una determinata versione scompare perché il backup è scaduto / rimosso per motivi di spazio, lo spazio utilizzato viene recuperato automaticamente. Alcuni client di posta lo usano anche per i messaggi archiviati in più cartelle, per lo stesso motivo.

Saluti


I vantaggi in termini di prestazioni derivanti dall'uso dei collegamenti reali? Oppure, perché mai dovresti usare un hard link invece di un symlink?
ripper234,

Il kernel deve riavviare la traduzione da pathname a inode (attraversando l'albero delle directory) per espandere i collegamenti simbolici, mentre i collegamenti reali usano tutti lo stesso inode. (Lo vedrai spesso indicato come namei, dal nome della funzione del kernel che ha fatto questo in Unix tradizionale.)
Geekosaur,

@ ripper234: gli hardlink sono soluzioni salvaspazio. Non è necessario conoscere il filesystem per creare un collegamento simbolico, ma è necessario pensare prima di creare collegamenti simbolici perché è possibile creare un ciclo o un percorso di risoluzione lungo, quindi funzioni come statfalliranno.
D4RIO,

@geekosaur: sto aggiungendo la tua risposta alla mia poiché è molto utile
D4RIO

Nessun problema. In realtà ho iniziato a scriverlo come commento al tuo, ma i commenti sono troppo brevi.
Geekosaur,

3

Un collegamento software punta a un altro nome percorso. Quel percorso potrebbe effettivamente esistere o meno. Il percorso non viene cercato finché non si accede al collegamento simbolico. Se il percorso non esiste quando si tenta di accedervi, si dispone di un collegamento simbolico interrotto.

Con un collegamento reale, hai un file con più nomi. Non si può dire che uno di questi sia il file "reale" e gli altri siano solo un link ad esso. Sono tutti uguali. Non esiste un collegamento reale interrotto nel modo in cui sono presenti collegamenti simbolici interrotti.

I collegamenti fisici funzionano solo all'interno di un singolo file system. Se si desidera collegarsi a un file su un file system diverso (ad es. Una diversa partizione o una condivisione di rete), è necessario utilizzare un collegamento software.

Un'altra grande differenza è ciò che accade quando si elimina un file collegato. Se elimini uno di una coppia di file hardlinked, quindi crei un nuovo file con lo stesso nome, avrai due file separati (il link non c'è più). Se si elimina la destinazione di un collegamento simbolico e si crea un nuovo file con lo stesso nome, il collegamento punterà al nuovo file.


3

i collegamenti "hard" condividono lo stesso inode

$ touch foo
$ ln foo foolink # Creates a hard  link
$ ls -li foo foolink
54996 -rw-r--r-- 2 bsd users 0 2011-12-11 09:06 foo
54996 -rw-r--r-- 2 bsd users 0 2011-12-11 09:06 foolink

Se modifico foo o foolink c'è solo un file e verrà aggiornato. Se rimuovo solo uno dei nomi dei file, l'inode e i dati persistono, lo sciocco sopravviverà.

$ rm foo
$ ls -li foo foolink
ls: cannot access foo: No such file or directory
54996 -rw-r--r-- 1 bsd users 0 2011-12-11 09:06 foolink

Se dovessi creare lo stesso, ma con un link "soft" o simbolico, allora c'è un file, un inode e un nuovo file con il proprio inode che punta al primo.

$ touch foo
$ ln -s foo foolink # Create symlink
$ ls -li foo foolink
55029 -rw-r--r-- 1 bsd users 0 2011-12-11 09:11 foo
55033 lrwxrwxrwx 1 bsd users 3 2011-12-11 09:11 foolink -> foo

Se modifico foo o foolink c'è ancora un solo file e verrà aggiornato.

Se rimuovo solo il collegamento simbolico, l'inode e i dati persistono. Se rimuovo foo, i dati spariranno, il collegamento simbolico persisterà ma rimanderà a un file inesistente.

$ rm foo
removed `foo'
$ ls -l foo foolink 
ls: cannot access foo: No such file or directory
lrwxrwxrwx 1 bsd bsd 3 2011-12-11 09:11 foolink -> foo

1
Ma qual è un caso pratico per questo?
ewwhite,

1
Un uso, lo stesso di una "scorciatoia" Un altro uso, avere più versioni di un'applicazione su un sistema consente di installare, testare una nuova versione, specificando l'app per percorso completo, mentre il collegamento simbolico in bin punta alla produzione. Al termine del test, modificare il collegamento simbolico alla nuova versione, lasciare la vecchia versione in atto per tutti gli utenti che dispongono di codice dipendente dalla versione. Pensa a perl, python, ecc.
bsd

1
pratico caso d'uso per collegamenti reali. Al momento sul mio filesystem ho trovato un gran numero di hardlink in / usr / share / zoneinfo Pensa a tutti i file nominati che rappresentano i fusi orari, tutti identici a EST. Salviamo lo spazio del filesystem non avendo copie ridondanti e consentiamo una gestione più semplice dei pacchetti senza che il sovraccarico di gestione dei collegamenti simbolici venga installato / eliminato man mano che i pacchetti vengono installati / eliminati. Anche se uno viene rimosso, i dati originali vengono conservati. Scusa se non ho avuto tempo per una spiegazione più pedante.
bsd,

1

I collegamenti reali sono voci di directory aggiuntive per lo stesso file. Questo significa

  • Tutti i collegamenti fisici a un file devono trovarsi sullo stesso file system (poiché una voce della directory non può puntare a un file su un file system diverso), ma non necessariamente nella stessa directory.
  • Non c'è differenza tra la voce della directory originale e il nuovo hard link; dal punto di vista del sistema operativo, sono solo due voci di directory nello stesso file. Un file viene eliminato solo se vengono eliminati tutti i collegamenti reali (e inoltre, non è rimasto alcun processo che ha quel file ancora aperto).
  • Se si sposta / rinomina l'originale, purché non lo si sposti in un altro file system, gli altri collegamenti reali non sono interessati; puntano ancora allo stesso file.
  • Molti editor non scrivono il nuovo contenuto nello stesso file durante il salvataggio, ma eseguono piuttosto la seguente procedura:

    1. Scrivi il nuovo contenuto in un nuovo file.
    2. Rinominare il vecchio file con un nome di backup (oppure, se non si mantengono i backup della versione del file precedente, è sufficiente eliminarlo).
    3. Rinomina il file appena scritto con il nome del file precedente.

    Questo schema significa che qualsiasi altro collegamento reale allo stesso file non punta più al file corrente, ma alla versione precedente (ciò è vero anche nel caso in cui l'editor elimini il vecchio file, perché in Unix, "eliminando" un file significa semplicemente eliminare il suo collegamento; solo se il collegamento eliminato è l'unico collegamento che viene eliminato il file effettivo).

  • Poiché il collegamento diretto va direttamente al file, è possibile accedere a quel file anche se non si ha accesso alla posizione originale di quel file (ad esempio perché non si dispone di autorizzazioni sulla directory in cui si trova la voce originale) . Gli unici diritti che determinano l'accesso sono i diritti di accesso al file stesso (che sono associati al file, non al collegamento; non è possibile creare collegamenti fissi con autorizzazioni diverse per lo stesso file) e i diritti di accesso per il percorso del collegamento reale è contenuto in (fondamentalmente, i diritti di esecuzione nella directory in cui si trova il collegamento e tutte le directory principali dirette e indirette).

I collegamenti simbolici, d'altra parte, memorizzano il percorso (il nome del file - o piuttosto la sua voce di directory - includendo potenzialmente il suo percorso, come /bin/sho subdir/foo.bar) - di un altro file. Se il percorso è relativo, viene sempre interpretato in relazione alla directory in cui è contenuto il collegamento. Ciò significa:

  • Un collegamento simbolico può fare riferimento a file su un file system diverso (anche a un file system che non supporta esso stesso collegamenti hard o soft, come FAT).

  • Se il file originale viene eliminato, il collegamento simbolico non conserva il contenuto del file. A meno che non vi siano altri collegamenti fisici allo stesso file, il contenuto del file non sarà più disponibile. Il collegamento simbolico verrà quindi lasciato penzolante (ovvero, riferendosi a un nome di percorso che non corrisponde a una voce della directory). D'altra parte, l'eliminazione del collegamento simbolico non influisce sul file originale, poiché si riferisce solo al suo nome percorso.

  • Se il file originale viene spostato o rinominato, il collegamento simbolico non viene aggiornato, ma rimane sospeso. Se si sposta il collegamento simbolico, si interrompe solo se contiene un percorso relativo e il percorso non è più valido dalla nuova posizione.

  • Se il file originale viene sostituito da un nuovo file con lo stesso nome (come nello scenario dell'editor sopra descritto), il collegamento si riferisce al nuovo file.

La maggior parte degli usi dei collegamenti fisici sono fondamentalmente un modo per avere una copia di un file senza dover archiviare il contenuto del file due volte. Funziona meglio se i file non vengono mai più modificati, altrimenti è facile interrompere accidentalmente il collegamento (vedi lo scenario dell'editor sopra). Esistono, naturalmente, casi in cui si desidera che il collegamento venga interrotto, come nel caso di mantenere diversi backup: per i file che sono stati modificati nei backup più recenti, non si desidera modificare anche la copia nei backup precedenti.

Normalmente se si desidera un collegamento, verrà utilizzato un collegamento simbolico. Un esempio è quando si sposta una directory in un'altra partizione (perché quella su cui si trova si riempie), è possibile impostare un collegamento soft dalla vecchia posizione a quella nuova, quindi tutti i programmi che tentano di accedere alla directory nella vecchia posizione accedi al nuovo posto invece. Ciò non sarebbe possibile con collegamenti reali. Tuttavia, tenere presente che i collegamenti simbolici nella directory spostata possono interrompersi se contengono percorsi relativi che conducono fuori dalla directory spostata.


1

HARD LINK (solo file) vs SOFT LINK (file o directory) vs BIND (HARD LINK per directory)

VISUALIZZA QUESTA IMMAGINE PRIMA DI LEGGERE POST
(fonte: freesoftwareservers.com )

Mentre la risposta di daxelrod spiega bene la domanda, ho pensato che l'immagine in questo caso abbia fatto una grande differenza, specialmente per i principianti che non comprendono ancora gli inode e il gergo complicato di Linux.

Pensa a questo, se hai "cancellato" tutto dal tuo disco, potresti eseguire il software per ripristinare i dati, perché gli 1 e gli 0 sono ancora lì, hai semplicemente eliminato tutti gli Hard Link. Lo scopo di Recovery Software è quello di ricostruire gli Hard Link per dare un senso agli 0 e agli 1

Ho letto un ottimo "one liner" che ha reso tutto questo sensato e volevo condividere!

Tutti i file in Linux sono "Hard Links" agli 0 e 1 sul disco. Quando si creano dati (0 e 1) il sistema operativo crea un collegamento reale nella struttura dei file per fare riferimento a quel punto sul disco rigido.

Crea HARD LINK 2 ed elimina HARD LINK 1 File originale :

È possibile creare un altro collegamento reale ed eliminare il file originale e avere ancora accesso al collegamento reale appena creato.

Elimina FILE (HARD LINK 1) che è SOFT LINK collegato a:

Se hai eliminato l'HARD LINK 1, pensi che il SOFT LINK funzionerebbe? No, il sistema operativo segnalerà che l'HARD LINK 1 non esiste.

Elimina SOFT LINK in HARD LINK:

Al contrario, se si elimina SOFT LINK, funzionerà HARD LINK? Sì. Finché il sistema operativo ha un file HARD LINK segnalerà che il riempimento non è stato eliminato.

- Vale anche la pena ricercare / notare BIND, un modo per BIND due directory come il collegamento simbolico di due directory, ma è trasparente per il sistema operativo (i sistemi operativi possono dire quando Symlink e alcuni hanno regole relative al tempo che possono seguire Symlink). Utilizza Mount, non LS e può essere configurato tramite FSTAB.

Che cos'è un attacco BIND


1
È uno sforzo piuttosto ambizioso, soprattutto per un primo post. Sfortunatamente, credo che l'aggiunta del materiale su "bind" (che non è stato richiesto) confonde semplicemente le cose; soprattutto perché non sembra che tu abbia fatto molto sforzo per spiegare il montaggio "vincolante". Inoltre, capisco molto bene i collegamenti hard e soft / simbolici e capisco a malapena la tua foto. Sarei molto sorpreso se un principiante potesse imparare qualcosa da esso.
G-Man dice "Ripristina Monica" il

Sebbene sia possibile utilizzare le directory dei collegamenti simbolici, nel file system viene visualizzato come collegamento simbolico, se si esegue il BIND, è trasparente per il sistema operativo. Si presenta come un file.
FreeSoftwareServers il

1
(1) In realtà, su almeno alcune versioni di Linux, è possibile eseguire il binding di un file. (2) Mentre i montaggi di bind sembrano molto simili ai collegamenti fissi, dire "Il bind è semplicemente lo stesso dei collegamenti fissi (tranne per il fatto che non è possibile collegare in modo rigido una directory)" è semplicemente sbagliato.
G-Man dice "Ripristina Monica" il

@G-Man, concordato e rimosso, con solo una nota che menziona BIND
FreeSoftwareServers il

@Free in realtà il soft link punta a un nome di file (hard link 1); gli schemi, dovrebbero renderlo ovvio.
JB.

0

Un hard link manterrà un file sul disco fino a quando tutti i hard link ad esso, anche il primo (un "nome file" è tecnicamente un hard link), sono stati eliminati. Un collegamento software può essere lasciato "sospeso" fino a quando il file a cui punta (s / ed) non viene sostituito.


0

Questa è una domanda molto vecchia, ma ho un caso d'uso che mi richiede di utilizzare collegamenti reali.

Sono un musicista e quindi ho un sacco di file audio di vario genere su diversi dischi rigidi collegati al mio Mac. Vale Terabyte. Li ho organizzati per lo più molto bene con le directory symlink in modo da poterli trovare per editore di contenuti, stile / suono e altri criteri basati su come sto pensando in quel momento. Purtroppo un programma che utilizzo, Ableton Live, è completamente incapace di visualizzare alias o collegamenti simbolici dal suo browser di file. L'unica soluzione che ho trovato è quella di creare collegamenti concreti delle directory in cui voglio poter vedere, e quindi tutto funziona alla grande.

Quindi, questo è un altro caso in cui potresti aver bisogno di usare hard link, che potrebbe non essersi verificato ad altri.


Vorrei presentare una segnalazione di bug per Ableton Live. Forse sono in grado di risolvere questo problema.
aventurin,

Sì, ci sono già molte lamentele su questo problema nei forum di Abletons da anni ... Sembra che non stiano facendo alcun tentativo di affrontarlo, anche se non riesco a capire perché no.
Jonathan van Clute,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.