Qual è la differenza tra un hard link e un link simbolico?

445

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

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

    
posta ste_kwr 29.02.2012 - 10:03
fonte

10 risposte

30

In Linux / Unix, i collegamenti sono conosciuti come Collegamenti

I collegamenti sono di due tipi: collegamenti software (collegamenti simbolici) o collegamenti fisici.

  1. Collegamenti software (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 link non funzionerà .

  2. Collegamenti duri

    Gli hard link sono solo per i file; non puoi collegarti a un file su una partizione diversa con un numero di inode diverso.

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

Domanda: come faccio a creare un collegamento software?

Risposta: è possibile creare un collegamento software con ln -s ; per prima cosa è necessario definire la fonte e quindi è necessario definire la destinazione. (Ricorda che è necessario definire i percorsi completi sia di origine che di destinazione, altrimenti non funzionerà.)

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

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

Domanda: come faccio a creare un link fisso?

Risposta: È possibile creare un collegamento fisico con ln ; per prima cosa è necessario definire la fonte e quindi è necessario definire la destinazione. (Ricorda che è necessario definire il percorso completo sia di origine che di destinazione, altrimenti non funzionerà.)

Diciamo che ho uno script nella directory /script chiamata firefox .

 ls -i # Shows you the inode
 5898242 firefox

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

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

In alto, controllo che il collegamento funzioni e quindi elimini lo script firefox originale.

Domanda: Sarebbe bello se qualcuno potesse fornire un'impostazione in cui il collegamento fisico potrebbe essere preferibile su un collegamento simbolico.

Risposta : a seconda del layout della partizione del disco, i Collegamenti duri hanno la limitazione che devono essere sulla stessa partizione (-1 punto) e può solo collegare a 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 della partizione (+1 punto), ma (-1 punto) se l'origine viene eliminato il collegamento non funzionerà.

    
risposta data Qasim 09.05.2013 - 02:42
fonte
312

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

D'altra parte, un link simbolico sta effettivamente puntando a un altro percorso (un nome di file); risolve il nome del file ogni volta che lo accedi tramite il link simbolico. Se sposti il ​​file, il link 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 su file system. Con i collegamenti simbolici hai una netta distinzione tra il file reale e il collegamento simbolico, che non memorizza informazioni accanto al percorso del file a cui punta.

    
risposta data vartec 18.05.2011 - 11:51
fonte
289

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

E, "Un esempio vale cento paragrafi ..."

Crea due file:

$ touch blah1   
$ touch blah2

Inserisci alcuni dati in essi:

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

E come previsto:

$cat blah1; cat blah2
Cat
Dog

Creiamo link 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 ha importanza:

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

blah1-hard indica l'inode, il contenuto, del 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

Impossibile trovare il contenuto del file perché il collegamento soft punta al nome, che è stato modificato e non al contenuto.
Allo stesso modo, se blah1 viene cancellato, blah1-hard detiene ancora il contenuto; se blah2 è cancellato, blah2-soft è solo un link a un file non esistente.

source: copiato in modo sfacciato da StackOverflow!

    
risposta data ABcDexter 21.07.2016 - 09:33
fonte
87

Entrambi sono indicatori di file; la differenza è il tipo di puntatore. Un collegamento simbolico punta a un altro file per nome . Ha un bit di modalità speciale che lo identifica come un collegamento simbolico e il suo contenuto è il nome del file reale. Perché contiene solo un nome, quel nome non deve esistere, o può esistere su un altro filesystem. Se sostituisci il file con nome (cambia il suo contenuto senza influire sul suo nome), il link contiene ancora lo stesso nome e quindi 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 in base al numero di inode. Pertanto, gli hard link non sono diversi dal nome di un file. Non esiste un nome "reale" rispetto al nome del collegamento fisico; tutti gli hard link sono ugualmente validi nomi per il file. Per questo motivo, il file a cui ci si collega deve effettivamente esistere ed essere nello stesso file system in cui si sta tentando di creare il collegamento. Se si elimina il nome originale, il collegamento rigido continua a puntare allo stesso file. Poiché tutti gli hard link sono ugualmente nomi 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 sapere 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, viceversa, un file con un conteggio link di solo 1 non ha (altri) collegamenti fisici.

    
risposta data psusi 18.05.2011 - 17:23
fonte
56

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 al suo inode è scomparso (tu rm d o unlink d l'ultimo link). I collegamenti fissi di solito funzionano solo per i file, non per le directory.

Un link simbolico (link simbolico) è un file speciale contenente un percorso verso 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 nello stesso percorso. Un collegamento simbolico può puntare a file o directory.

    
risposta data knittl 29.02.2012 - 10:20
fonte
20

Una delle risposte dell'altra discussione (ora collegata dalla parte superiore del tuo post) menziona questa pagina che penso sia una spiegazione abbastanza buona di medio livello. 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 link all'inode.
  • I collegamenti fissi sono come i file. Sono solo un puntatore aggiuntivo direttamente su un inode.
  • I link 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.

Così basato su questo:

  • I collegamenti rigidi consentono solo il collegamento stesso file system. I collegamenti simbolici possono indirizzare a qualsiasi percorso.
  • I collegamenti fissi (essenzialmente) puntano ai dati assoluti. I collegamenti simbolici possono puntare a percorsi relativi (ad esempio ../parent.file )
  • Per estensione, se sposti il ​​puntatore target di un hard-link (che, ricorda, è essenzialmente solo un hard link che punta a un inode), il collegamento reale funziona ancora. Spostare la destinazione di un collegamento simbolico di solito interromperebbe il collegamento simbolico.
  • La risoluzione di un hard-link sarebbe più veloce ma incommensurabile. Questa porzione insignificante di velocità ha un costo di un file system inflessibile.

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

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

    
risposta data Oli 18.05.2011 - 17:10
fonte
15

Quando utilizzare Soft Link:

Collegamento tra file system: se vuoi collegare file attraverso i filesystem, puoi usare solo link simbolici / soft link.

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

Quando utilizzare l'hard link:

Spazio di archiviazione: gli hard link richiedono una quantità di spazio molto trascurabile, poiché non ci sono nuovi inode creati durante la creazione di collegamenti fisici. Nei collegamenti software viene creato un file che consuma spazio (in genere 4 KB, in base al file system)

Prestazioni: le prestazioni saranno leggermente migliori durante l'accesso a un hard link, poiché si accede direttamente al puntatore del disco invece di passare attraverso un altro file. Spostamento del percorso del file: se si sposta il file sorgente in qualche altra posizione sullo stesso file system, il collegamento fisico funzionerà comunque, ma il collegamento software avrà esito negativo.

Ridondanza: se si vuole garantire la sicurezza dei propri dati, si dovrebbe usare il collegamento duro, come nel collegamento fisico, i dati sono sicuri, fino a quando tutti i collegamenti ai file non vengono eliminati, invece che nel collegamento software, perderai i dati se l'istanza principale del file viene cancellata.

    
risposta data Osama 07.09.2014 - 01:48
fonte
7

La confusione inizia quando cerchi di trovare la differenza tra "nome file" e un collegamento fisico perché non ce n'è.

Ogni file che crei consiste di dati sul disco e un hard link - che è un nome di file in una directory e un puntatore ai dati sul disco. Fine della storia. Quando viene eliminato l'ultimo (o unico) hard link, il sistema operativo sa che i dati non sono più necessari.

Da questo si può vedere che i dati reali non vengono mai cancellati, solo i collegamenti fisici sono. E quando diventa 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 ripristinati, ma è piuttosto difficile da trovare senza il collegamento fisico.

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

    
risposta data Gonesoft 01.03.2015 - 12:28
fonte
3

Per una spiegazione eccellente noob -and- ex-Windoze -user- friendly , con nice diagrams e una FAQ consulta questa pagina link . Le loro restrizioni copyright mi impediscono di estrarre i loro contenuti, quindi basti sapere che fornisco il link qui.

Questo è il mio secondo o terzo tentativo di cogliere l'enigma soft / hard-link, sempre gettando la spugna e posticipando la mia comprensione ad un certo punto indefinito di tempo in futuro - non appena le spiegazioni e le pagine man diventa profondamente kerneled e troppo tecnico con inode e tutti ...

Enjoy!

    
risposta data nutty about natty 10.02.2013 - 17:03
fonte
0

È molto semplice. I file (e le directory!) Sono memorizzati in indirizzi sul dispositivo a blocchi (HDD o qualsiasi altra cosa). Normalmente hai un singolo nome mappato su un indirizzo, ed è così che ottieni il tuo file. Un hard link è un secondo, terzo nome ecc mappato allo stesso indirizzo. Un link simbolico fa invece riferimento al simbolo - il nome - e quindi un secondo nome mappato al primo nome. Per quanto riguarda il kernel, una volta che legge il target link simbolico, si ferma e torna all'inizio con il valore di destinazione come nome del file (più o meno) in modo che i collegamenti simbolici relativi siano possibili ma selvaggiamente inutili. Il nome di destinazione non viene utilizzato sopra il livello del file system, tranne se è stato interrogato esplicitamente nel codice dello spazio utente.

    
risposta data Jim Driscoll 03.07.2016 - 17:39
fonte

Leggi altre domande sui tag