Quando useresti l'uno sopra l'altro?
Quando useresti l'uno sopra l'altro?
Risposte:
Le diverse semantiche tra i collegamenti hard e soft li rendono adatti a cose diverse.
Collegamenti reali:
Collegamenti simbolici (collegamenti soft)
ls -l
mostrerà a quale percorso punta un collegamento simbolico)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).
..
e .
.
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 -al
può 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 rm
non 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ò!
ls -l
è sufficiente vedere cosa viene collegato da un collegamento simbolico, a
sta 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.
ln -s /home 1; ls -l 1
mostra che il symlink 1 è lungo 5 byte, mentre ln -s /usr/share/ 2; ls -l 2
mostra che 2 è lungo 11 byte.
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.
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 -i
e ottenere il numero di hardlink con stat
come 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
namei
, dal nome della funzione del kernel che ha fatto questo in Unix tradizionale.)
stat
falliranno.
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.
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
I collegamenti reali sono voci di directory aggiuntive per lo stesso file. Questo significa
Molti editor non scrivono il nuovo contenuto nello stesso file durante il salvataggio, ma eseguono piuttosto la seguente procedura:
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/sh
o 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.
HARD LINK (solo file) vs SOFT LINK (file o directory) vs BIND (HARD LINK per directory)
(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.
È possibile creare un altro collegamento reale ed eliminare il file originale e avere ancora accesso al collegamento reale appena creato.
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.
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.
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.
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.