Qual è la differenza tra un collegamento reale e un collegamento simbolico?


488

Come dice il titolo, vorrei sapere la differenza tra un hard link e un soft link creato dal comando ln. Il comando man lnfornisce informazioni, ma non risponde sufficientemente alla mia domanda.

Inoltre, sarebbe bello se qualcuno potesse fornire un'impostazione in cui un collegamento fisico potrebbe essere preferibile a un collegamento simbolico.


15
una delle differenze ... hai qualche file, ad esempio file test. Se esegui il test hardlink, fai il link simbolico test ln -s e quindi sposta il test file in un'altra directory (o rinomina), il link simbolico non funzionerà. Hardlink funzionerà. Ora prova a eliminare il test del file. Hardlink funzionerà ancora, infatti sarai ancora in grado di accedere al file fino a quando il numero di hardlink al file non è 0. Questo a causa degli inode, è scritto in manuale ...
Denwerko,

5
Ho riaperto questo perché merita una buona risposta generica su questo problema (a differenza della domanda precedente che era un oscuro esempio C).
Oli


1
Anche piuttosto una risposta completa: stackoverflow.com/questions/185899/...
Elzo valugi

@AbhishekBhatia il video non è disponibile
Ooker

Risposte:


59

In Linux / Unix, i collegamenti sono noti come collegamenti


I link sono di due tipi: soft link (link simbolici) o hard link.

  1. Collegamenti soft (collegamenti simbolici)

    È possibile creare collegamenti a file e directory e creare collegamenti (collegamenti) su partizioni diverse e con un numero di inode diverso dall'originale.

    Se la copia reale viene eliminata, il collegamento non funzionerà .

  2. Collegamenti reali

    I collegamenti reali sono solo per i file; non è possibile collegarsi a un file su una partizione diversa con un numero di inode diverso.

    Se la copia reale viene eliminata, il collegamento funzionerà , poiché accede ai dati sottostanti a cui stava accedendo la copia reale.


Domanda: come posso creare un collegamento soft?

Risposta: è possibile creare un collegamento software con ln -s; per prima cosa devi definire la fonte e poi devi definire la destinazione. (Tieni presente che devi definire i percorsi completi sia della sorgente che della destinazione; altrimenti non funzionerà.)

 sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib32/libGL.so.1
             (----------Source-------)             ( Destination )

inserisci qui la descrizione dell'immagine

Come puoi vedere, ha un inode diverso e può essere creato su una partizione diversa.


Domanda: come posso creare un collegamento reale?

Risposta: è possibile creare un collegamento reale con ln; per prima cosa devi definire la fonte e poi devi definire la destinazione. (Tieni presente che devi definire il percorso completo sia della sorgente che della destinazione; altrimenti non funzionerà.)

Diciamo che ho uno script nella /scriptdirectory denominata firefox.

 ls -i # Shows you the inode
 5898242 firefox

 ln /scripts/firefox /scripts/on-fire
       ( Source )    ( Destination )

inserisci qui la descrizione dell'immagine

Come puoi vedere, ha lo stesso inode. Se cancello l'originale, il collegamento funzionerà e funzionerà come l'originale.

inserisci qui la descrizione dell'immagine

Sopra controllo che il collegamento funzioni, quindi elimino lo script firefox originale.


Domanda: sarebbe bello se qualcuno potesse fornire un'impostazione in cui un collegamento reale potrebbe essere preferibile a un collegamento simbolico.

Risposta : A seconda del layout della partizione del disco, i collegamenti reali hanno la limitazione che devono trovarsi sulla stessa partizione (-1 punto) e possono collegarsi solo ai file (-1 punto) ), ma +1 punto se l'originale viene eliminato il collegamento funzionerà e si comporta come l'originale.

D'altra parte, un collegamento software può puntare a directory o file (+1 punto) e non vi è alcuna limitazione di partizione (+1 punto), ma (-1 punto) se la fonte viene eliminata il collegamento non funzionerà.


Posso creare un collegamento reale e fornire l'inode come sorgente?
TMOTTM

324

Un hardlink non è un puntatore a un file, è una voce di directory (un file) che punta allo stesso inode. Anche se si modifica il nome dell'altro file, un collegamento fisico punta comunque al file. Se si sostituisce l'altro file con una nuova versione (copiandolo), un collegamento fisico non punterà al nuovo file. Puoi avere hardlink solo nello stesso filesystem. Con hardlink non hai il concetto dei file e dei link originali, tutti sono uguali (pensalo come un riferimento a un oggetto). È un concetto di livello molto basso.

D'altra parte, un collegamento simbolico in realtà punta a un altro percorso (un nome file); risolve il nome del file ogni volta che si accede tramite il collegamento simbolico. Se si sposta il file, il collegamento simbolico non seguirà. Se si sostituisce il file con un altro, mantenendo il nome, il collegamento simbolico punterà al nuovo file. I collegamenti simbolici possono estendersi ai filesystem. Con i collegamenti simbolici hai una chiara distinzione tra il file effettivo e il collegamento simbolico, che non memorizza informazioni accanto al percorso sul file a cui punta.


1
Una cosa che (con parole proprie) "punta al file" può essere chiamata un puntatore (è banalmente quasi tautologicamente vero). Se stiamo eseguendo il nitpicking allora (in generale) potrebbe esistere la nozione di hardlink anche se un filesystem non usa gli inode.
jfs,

320

"Un'immagine vale più di mille parole." Rappresentazione pittorica


E "Un esempio vale cento paragrafi ..."

Crea due file:

$ touch blah1   
$ touch blah2

Inserisci alcuni dati al loro interno:

$ echo "Cat" > blah1
$ echo "Dog" > blah2

E come previsto:

$cat blah1; cat blah2
Cat
Dog

Creiamo collegamenti hard e soft:

$ ln blah1 blah1-hard
$ ln -s blah2 blah2-soft

Vediamo cosa è appena successo:

$ ls -l

blah1
blah1-hard
blah2
blah2-soft -> blah2

Cambiare il nome di blah1 non importa:

$ mv blah1 blah1-new
$ cat blah1-hard
Cat

blah1-hard indica l'inode, il contenuto, il file - che non è stato modificato.

$ mv blah2 blah2-new
$ ls blah2-soft
blah2-soft
$ cat blah2-soft  
cat: blah2-soft: No such file or directory

Il contenuto del file non è stato trovato perché il collegamento software punta al nome, che è stato modificato e non al contenuto.
Allo stesso modo, se blah1 viene eliminato, blah1-hard conserva ancora il contenuto; se blah2 viene eliminato, blah2-soft è solo un collegamento a un file inesistente.


fonte: copiarlo palesemente da StackOverflow!


13
Per essere onesti con te - hai aggiunto la bella immagine in alto ... ah l'hai copiata anche tu! Combinare le due risposte è in realtà molto utile :)
icc97

2
meglio spiegato, da nessuna parte!
dennisbot,

3
Ho continuato a fissare l'immagine per 20 secondi e poi, all'improvviso, l'ho capito. Questo è davvero geniale.
Mohammed Joraid,

1
btw: usare hardlink con git è una cattiva idea , nel caso in cui qualcuno (frustrato per i soft link) si chieda ... potrebbe applicarsi anche ad altri sistemi di versioning.
Frank Nocke,

1
Un inode ai suoi hardlink è simile a un file archiviato nel cloud a qualsiasi dispositivo vi accede?
Ooker

89

Entrambi sono puntatori ai file; la differenza è il tipo di puntatore. Un collegamento simbolico punta a un altro file per nome . Ha un bit in modalità speciale che lo identifica come un collegamento simbolico e il suo contenuto è il nome del file reale. Poiché contiene solo un nome, quel nome non deve realmente esistere o può esistere su un file system diverso. Se sostituisci il file indicato (modificane il contenuto senza influire sul suo nome), il link contiene ancora lo stesso nome e quindi ora punta al nuovo file. Puoi facilmente identificare un link simbolico e vedere il nome del file a cui punta.

Un collegamento reale punta al file per numero di inode. Pertanto, i collegamenti reali non sono diversi dal nome di un file. Non esiste un nome "reale" rispetto al nome del collegamento reale; tutti gli hard link sono ugualmente nomi validi per il file. Per questo motivo, il file al quale si collega deve effettivamente esistere e trovarsi nello stesso filesystem in cui si sta tentando di creare il collegamento. Se si elimina il nome originale, il collegamento reale punta ancora allo stesso file. Poiché tutti i collegamenti fisici sono nomi ugualmente validi per il file, non è possibile guardarne uno e vedere gli altri nomi per il file; per trovare questo, devi andare a guardare ogni file e confrontare il loro numero di inode per trovare gli altri nomi che hanno lo stesso numero di inode.

Puoi dire quanti nomi ha un file dall'output di ls -l. Il primo numero dopo la modalità file è il conteggio dei collegamenti. Un file con più di 1 collegamento ha altri nomi da qualche parte e, al contrario, un file con un conteggio dei collegamenti di solo 1 non ha (altri) collegamenti fissi.


If you replace the named file, then the link still contains the same name, and so now it points to the new file- Penso che questo non sia ben spiegato. Vuoi dire se sostituisco il file in cui ho ottenuto un collegamento simbolico, quindi i collegamenti contenenti il ​​nome rimangono intatti. Ma indicherebbe il file sostituito solo quando il suo nome file (ovvero il nuovo file che ha sostituito quello vecchio) è lo stesso di quello sostituito (ovvero il vecchio file che è stato sostituito da quello nuovo), corretto?
Mike,

@ Mike, sì: il collegamento simbolico punta al nome del file originale, quindi la sostituzione di quel file significa che il collegamento ora punta al nuovo file.
psusi,

Ma solo se ha lo stesso nome corretto? Symlink punta a banana e sostituisco il file con orange, quindi sy link non riesce più a trovare il file banana, cioè non funzionerà
Mike

@Mike, il mondo sostituisce significa che ha lo stesso nome, altrimenti stai solo cancellando un file e aggiungendone un altro;)
psusi

58

Un hardlink può funzionare solo sullo stesso filesystem, è semplicemente un nome diverso per lo stesso inode (i file sono referenziati internamente dagli inode). Un file verrà eliminato dal disco solo quando l'ultimo collegamento con la sua inode è andato (si rmD o unlinkD l'ultimo anello). I collegamenti fisici di solito funzionano solo per i file, non per le directory.

Un collegamento simbolico (collegamento simbolico) è un file speciale contenente un percorso a un altro file. Questo percorso può essere assoluto o relativo. i collegamenti simbolici possono funzionare su file system e possono anche puntare a file diversi, ad esempio scollegando un disco rigido esterno e sostituendolo con un altro, che ha un file diverso sullo stesso percorso. Un collegamento simbolico può puntare a file o directory.


Grazie, questo mi dice come funzionano, ma cosa fa esattamente l'hard link? E perché non funziona per le directory?
ste_kwr,

@knittl: sei sicuro? Sembra che su alcuni file system siano consentiti collegamenti a directory ma solo root può crearli. Vedi gli -d, -F, --directoryinterruttori. E sì, io ho visto la nota nella ln(1)pagina :)
0xC0000022L

1
@kniwor: il modo più semplice per descrivere hardlink è "solo un altro nome per lo stesso file (ovvero dati su disco)". E - almeno sui miei sistemi - lnnon può essere utilizzato per creare collegamenti a directory. Esistono collegamenti diretti alle directory, l'esempio più importante è .e ... Non volevo includerlo nella mia risposta originale, poiché ciò avrebbe solo complicato le cose.
Knittl

2
@STATUS_ACCESS_DENIED: bene ok ... ma di solito non è una buona idea. Ecco perché ho scritto »di solito« nella mia risposta originale. Vedi anche il mio commento precedente per esempi.
Knittl

quindi un hard link può puntare alla stessa cartella / file con nomi diversi, ovvero avere nomi diversi che si collegano allo stesso inode?
Charlie Parker,

21

Una delle risposte dell'altra discussione (ora collegata dall'alto del tuo post) menziona questa pagina che ritengo sia una spiegazione di medio livello abbastanza buona. Se ti stai perdendo nell'arte ascii, ecco la versione tl; dr:

  • I file standard sono un puntatore dal filesystem a un inode che a sua volta punta a dati fisici. Il componente file memorizza il suo collegamento al filesystem (essenzialmente il suo percorso) e un collegamento all'inode.
  • Hard-link, sono proprio come i file. Sono solo un puntatore aggiuntivo direttamente a un inode.
  • I collegamenti simbolici sono file separati (inclusi inode e dati separati) che memorizzano un percorso del file system in un file.

Il kernel e i filesystem coinvolti traducono tutto in modo trasparente.

Quindi basato su quello:

  • I collegamenti fisici consentono solo il collegamento dello stesso file system. I collegamenti simbolici possono puntare su qualsiasi percorso.
  • I collegamenti fisici (essenzialmente) puntano a dati assoluti. I collegamenti simbolici possono puntare a percorsi relativi (ad es. ../parent.file)
  • Per estensione, se sposti il ​​puntatore di destinazione di un hard-link (che, ricorda, in sé è essenzialmente solo un hard-link che punta a un inode), l'hard-link funziona ancora. Lo spostamento della destinazione di un collegamento simbolico di solito interrompeva il collegamento simbolico.
  • Risolvere un collegamento reale sarebbe più veloce ma incommensurabile. Quella parte insignificante della velocità ha il costo di un file system inflessibile.

Potrei essermi confuso un po 'ma leggendo varie cose, sto lottando per trovare la differenza tra un file standard e un hardlink. Il modo in cui lo sto leggendo è che ogni file è costituito da un hardlink (che memorizza il nome del file), che collega a un inode che punta a dati fisici.

L'aggiunta di un hardlink fornisce solo un inode con un puntatore basato su filesystem aggiuntivo. È giusto?


5
Penso che tu abbia ragione, ogni file è un percorso per un inode e un hard link è un percorso aggiuntivo per lo stesso inode. Quindi un hard link non è diverso da un normale file.
enzotib,

Sto cercando di capirlo ... ma tu dici:> "I collegamenti simbolici sono file separati (inclusi inode e dati separati ) che memorizzano un percorso del filesystem in un file." Un link simbolico ha davvero dati separati? Quindi è proprio come una copia della directory a cui si collega, giusto? ... e ogni volta che qualcosa viene scritto sul collegamento simbolico, deve essere scritto due volte sul disco? Non ha senso.
MiniGod,

@MiniGod No un collegamento simbolico è un inode a un blocco di dati che memorizza un percorso verso un altro inode (nome file). Sì, è simile a Matrix, ma una volta che lo capisci, non dimenticherai mai :)
Oli

@Oli Potrei essere confuso, ma quando dici: "inclusi inode e dati separati ", intendi che il link simbolico ha dati separati !?
MiniGod

1
@MiniGod Yeah. Symlink è un inode che punta ai dati (proprio come un normale file) e che i dati sono un percorso. È un po 'più intelligente di così - per consentire un uso trasparente tramite collegamenti simbolici - ma è essenzialmente tutto ciò che sono.
Oli

15

Quando utilizzare Soft Link:

Collegamento tra file system: se si desidera collegare file tra file system, è possibile utilizzare solo collegamenti simbolici / collegamenti software.

Collegamenti alla directory: se si desidera collegare le directory, è necessario utilizzare i collegamenti soft, poiché non è possibile creare un collegamento reale a una directory.

Quando utilizzare Hard Link:

Spazio di archiviazione: i collegamenti fisici occupano una quantità di spazio molto trascurabile, poiché non sono stati creati nuovi inode durante la creazione di collegamenti fisici. Nei soft link creiamo un file che consuma spazio (di solito 4KB, a seconda del filesystem)

Prestazioni: le prestazioni saranno leggermente migliori durante l'accesso a un collegamento reale, poiché si accede direttamente al puntatore del disco anziché passare attraverso un altro file. Spostamento della posizione del file: se si sposta il file di origine in un'altra posizione sullo stesso file system, il collegamento reale continuerà a funzionare, ma il collegamento software non riuscirà.

Ridondanza: se si desidera garantire la sicurezza dei propri dati, è necessario utilizzare il collegamento reale, come nel collegamento reale, i dati sono al sicuro, fino a quando tutti i collegamenti ai file vengono eliminati, anziché quelli nel collegamento soft, si perderà i dati se l'istanza principale del file viene eliminata.


Si noti che esiste anche un collegamento simbolico rapido per dimensioni del percorso fino a 64 byte. Occupa ancora un inode, ma non consuma lo spazio di blocco di 4kb.
Syockit,

8

La confusione insorge quando si tenta di trovare la differenza tra "il nome del file" e un collegamento reale perché non esiste.

Ogni file creato è costituito da dati sul disco e da un collegamento reale , ovvero un nome file in una directory e un puntatore ai dati sul disco. Fine della storia. Quando viene eliminato l'ultimo (o unico) collegamento reale, il sistema operativo sa che i dati non sono più necessari.

Da questo puoi vedere che i dati effettivi non vengono mai cancellati, lo sono solo i collegamenti reali. E quando viene sufficientemente affollato sul disco, i dati potrebbero essere sovrascritti dai dati di un altro file. Fino ad allora, i dati del file eliminato potrebbero essere recuperati, ma è difficile da trovare senza il collegamento reale.

I link simbolici, come spiegato in precedenza, ti dicono semplicemente "c'è un file chiamato <targetname>in una cartella denominata <targetfolder>". Indicano il collegamento reale. Non sanno dove siano i dati. L'hard link lo sa.


0

È molto semplice. I file (e le directory!) Sono memorizzati presso gli indirizzi sul dispositivo a blocchi (HDD o altro). Normalmente hai un solo nome associato a un indirizzo, ed è così che ottieni il tuo file. Un hard link è un secondo, terzo, ecc. Nome mappato allo stesso indirizzo. Un collegamento simbolico si riferisce invece al simbolo - il nome - e così è un secondo nome mappato al primo nome. Per quanto riguarda il kernel, una volta che legge il target simbolico del link, si ferma e torna all'inizio con il valore target come nome del file (più o meno), quindi i link simbolici relativi sono possibili ma estremamente inutili. Il nome di destinazione non viene utilizzato al di sopra del livello del file system, tranne se viene esplicitamente richiesto nel codice spazio utente.

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.