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


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.


447
2018-02-29 09:03


origine


una delle differenze ... hai qualche file, ad esempio il test dei file. Se si effettua ln test di hardlink, creare ln -s test symlink e spostare il test del file in un'altra directory (o rinominare), symlink 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 al numero di hardlinks per il file isnt 0. Questo a causa degli inode, è scritto nel manuale ... - Denwerko
L'ho riaperto perché merita una buona risposta generica su questo argomento (a differenza della domanda precedente che era un esempio C oscuro). - Oli♦
Migliore risposta: youtube.com/watch?v=aO0OkNxDJ3c - Abhishek Bhatia
Anche una risposta abbastanza completa: stackoverflow.com/questions/185899/... - Elzo Valugi
@AbhishekBhatia il video non è disponibile - Ooker


risposte:


 In Linux / Unix, le scorciatoie sono conosciute come collegamenti


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

  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 vero copia viene cancellata, il link non funzionerà.

  2. Collegamenti duri

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

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


Domanda: Come posso 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 di origine e destinazione, altrimenti non funzionerà).

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

enter image description here

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


Domanda: Come posso creare un hard link?

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 di origine e destinazione, altrimenti non funzionerà).

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

 ls -i # Shows you the inode
 5898242 firefox

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

enter image description here

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

enter image description here

Sopra, 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 : In base al layout della partizione del disco, Collegamenti duri hanno la limitazione che devono essere sulla stessa partizione (-1 punto) e può solo collegare ai file (-1 punto) ), ma +1 punto se l'originale è cancellato 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 la fonte viene cancellata, il collegamento non funzionerà.


31
2018-05-09 00:42





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


314
2018-05-18 09:51



Una cosa che (dalle proprie parole) "punta al file"  può essere chiamato a pointer (è banalmente quasi tautologicamente vero). Se stiamo facendo il pignolo allora (in generale) la nozione di hardlink può esistere anche se un filesystem non usa gli inode. - jfs


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


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

Crea due file:

$ touch blah1   
$ touch blah2

Inserisci alcuni dati in loro:

$ 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 è 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: punti duri per 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

Non è stato possibile 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 collegamento a un file non esistente.


fonte: copiato in modo palese da StackOverflow!


293
2017-07-21 07:33



Per essere onesti con te - hai aggiunto la bella immagine in alto ... ah hai copiato anche quello! La combinazione delle due risposte è in realtà molto utile :) - icc97
meglio spiegato, da nessuna parte! - dennisbot
Ho continuato a fissare l'immagine per 20 secondi e poi, improvvisamente, l'ho capito. Questo è davvero brillante. - Mohammed Joraid
btw: utilizzo di hardlink con git  è una cattiva idea, nel caso in cui qualcuno (frustrato dai soft link) si meraviglia ... potrebbe applicarsi anche ad altri sistemi di versioning. - Frank Nocke
Un inode ai suoi hardlink simili a un file archiviato in cloud su qualsiasi dispositivo lo accede? - Ooker


Entrambi sono indicatori di file; la differenza è il genere 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. È possibile identificare facilmente un collegamento 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 l'altro nome (s) 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, viceversa, un file con un conteggio di collegamenti di solo 1 non ha (altri) collegamenti fisici.


87
2018-05-18 15:23



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 spiegato bene. Intendi se sostituisco il file in cui ho un link simbolico, quindi i collegamenti che contengono il nome rimangono inalterati. Ma punterebbe solo al file sostituito quando il suo nome file (cioè il nuovo file che ha sostituito quello vecchio) è lo stesso del sostituito (cioè il vecchio file che è stato sostituito dal nuovo) uno, corretto? - Mike
@Mike, sì: il collegamento simbolico punta al nome del file originale, quindi sostituendo quel file significa che il link ora punta al nuovo file. - psusi
Bbut solo se ha lo stesso nome corretto? Il link simbolico punta alla banana e sostituisco il file con l'arancione, quindi il link sy non riesce più a trovare il file banana, quindi non funzionerà - Mike
@ Mike, il mondo sostituire significa che ha lo stesso nome, altrimenti stai solo cancellando un file e aggiungendo un altro;) - psusi


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à cancellato dal disco solo quando l'ultimo link al suo inode è scomparso (tu rmd o unlinkd 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.


57
2018-02-29 09:20



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 alle directory, ma solo root può crearli. Vedere il -d, -F, --directory interruttori. E sì, io avere visto la nota in ln(1) pagina :) - 0xC0000022L
@kniwor: il modo più semplice per descrivere gli hardlink è "solo un altro nome per lo stesso file (cioè dati sul disco)". E - almeno sul mio sistema / i - ln non può essere utilizzato per creare collegamenti alle directory. Esistono collegamenti diretti alle directory, tuttavia, l'esempio più importante è . e ... Non volevo includerlo nella mia risposta originale, poiché ciò avrebbe solo complicato le cose. - knittl
@STATUS_ACCESS_DENIED: okay ... ma di solito non è una buona idea. Ecco perché ho scritto »di solito« nella mia risposta originale. Vedi anche il mio commento precedente per gli esempi. - knittl
quindi un hard link può puntare alla stessa cartella / file con nomi diversi, ad esempio con nomi diversi che si collegano allo stesso inode? - Charlie Parker


Una delle risposte dall'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.
  • Gli hard-link sono come i file. Sono solo un puntatore aggiuntivo direttamente su 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 questo:

  • I collegamenti fissi consentono solo il collegamento stesso file system. I collegamenti simbolici possono indicare qualsiasi percorso.
  • I collegamenti fisici (essenzialmente) puntano ai dati assoluti. I collegamenti simbolici possono indicare percorsi relativi (es ../parent.file)
  • Per estensione, se si sposta il puntatore di destinazione 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.
  • Risolvere un hard-link sarebbe più veloce ma incommensurabile. Quella porzione insignificante della velocità ha un costo per un file system inflessibile.

Avrei potuto confondermi un po 'ma leggendo varie cose, sto cercando di 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?


20
2018-05-18 15:10



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 link simbolici sono file separati (incluso inode separato e dati) che memorizza un percorso del file system 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 link simbolico, deve essere scritto due volte su disco? Non ha senso - MiniGod
@MiniGod Nessun collegamento simbolico è un inode a un blocco di dati che memorizza un percorso verso un altro inode (nome file). Sì, è una confusione simile a Matrix ma una volta capito, non lo dimenticherò mai :) - Oli♦
@ Oli Potrei essere confuso, ma quando dici: "incluso inode separato e dati ", vuoi dire che il link simbolico ha dati separati !? - MiniGod
@MiniGod Sì. Symlink è un inode che punta ai dati (proprio come un normale file) e che i dati sono un percorso. È un po 'più intelligente di quello - per consentire un uso trasparente attraverso i collegamenti simbolici - ma è essenzialmente tutto ciò che sono. - Oli♦


Quando utilizzare Soft Link:

Collegamento tra file system: se si desidera collegare file attraverso i filesystem, è possibile utilizzare solo collegamenti simbolici / soft.

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 vengono creati nuovi inode durante la creazione di collegamenti fisici. Nei collegamenti software viene creato un file che consuma spazio (in genere 4 KB, a seconda del 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 reale funzionerà comunque, ma il collegamento software avrà esito negativo.

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


15
2017-09-06 23:48



Si noti che esiste anche un collegamento simbolico veloce per la dimensione del percorso fino a 64 byte. Occupa ancora un inode, ma non consuma lo spazio del blocco di 4kb. - syockit


La confusione inizia quando cerchi di trovare la differenza tra "il nome del file" e un hard link 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 cancellato potrebbero essere recuperati, ma è piuttosto difficile da trovare senza il collegamento fisico.

I link simbolici, come spiegato in precedenza, 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.


7
2018-03-01 11:28