Qual è la differenza tra un collegamento simbolico e un collegamento reale?
Domanda
Di recente mi è stato chiesto questo durante un colloquio di lavoro. Ero onesto e ho detto che sapevo come si comporta un collegamento simbolico e come crearne uno, ma non capisco l'uso di un collegamento reale e come differisce da un collegamento simbolico.
Soluzione
Sotto il file system i file sono rappresentati da inode (o non sono sicuri più inode)
Un file nel file system è sostanzialmente un collegamento a un inode.
Un collegamento reale crea quindi un altro file con un collegamento allo stesso inode sottostante.
Quando si elimina un file, questo rimuove un collegamento all'inode sottostante. L'inode viene eliminato (o eliminabile / sovrascrivibile) solo quando tutti i collegamenti all'inode sono stati eliminati.
Un collegamento simbolico è un collegamento a un altro nome nel file system.
Una volta creato un collegamento reale, il collegamento è all'inode. l'eliminazione della ridenominazione o lo spostamento del file originale non influirà sul collegamento reale in quanto si collega all'inode sottostante. Qualsiasi modifica ai dati sull'inode si riflette in tutti i file che fanno riferimento a quell'inode.
Nota: i collegamenti fisici sono validi solo all'interno dello stesso file system. I collegamenti simbolici possono estendersi ai file system in quanto sono semplicemente il nome di un altro file.
Altri suggerimenti
Qualche bella intuizione che potrebbe aiutare, usando qualsiasi console Linux (ish).
Crea due file:
$ touch foo; touch bar
Inserisci alcuni Dati al loro interno:
$ echo "Cat" > foo
$ echo "Dog" > bar
(In realtà, avrei potuto usare l'eco in primo luogo, poiché crea i file se non esistono ... ma non importa.)
E come previsto:
$cat foo; cat bar
Cat
Dog
Creiamo collegamenti hard e soft:
$ ln foo foo-hard
$ ln -s bar bar-soft
Vediamo cosa è appena successo:
$ ls -l
foo
foo-hard
bar
bar-soft -> bar
La modifica del nome di foo non ha importanza:
$ mv foo foo-new
$ cat foo-hard
Cat
punti difficili per l'inode, il contenuto, del file - che non è stato modificato.
$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft
cat: bar-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 foo
viene eliminato, foo-hard
conserva ancora il contenuto; se bar
viene eliminato, bar-soft
è solo un collegamento a un file inesistente.
Come dice il proverbio, un'immagine vale più di mille parole. Ecco come lo visualizzo:
Ecco come arriviamo a quella foto:
-
Crea un nome
myfile.txt
nel file system che punta a un nuovo inode (che contiene i metadati per il file e punta ai blocchi di dati che ne contengono il contenuto, ad es. il testo " Ciao, mondo! " ;:$ echo 'Hello, World!' > myfile.txt
-
Crea un hard link
my-hard-link
al filemyfile.txt
, che significa " crea un file che dovrebbe puntare allo stesso inode quelmyfile.txt
punta a " ;:$ ln myfile.txt my-hard-link
-
Crea un collegamento software
my-soft-link
al filemyfile.txt
, che significa " crea un file che dovrebbe puntare al file < code> myfile.txt "$ ln -s myfile.txt my-soft-link
Guarda cosa succederà ora se myfile.txt
viene eliminato (o spostato): my-hard-link
punta ancora agli stessi contenuti e quindi non è interessato, mentre my-soft-link
ora non punta a nulla. Altre risposte discutono i pro / contro di ciascuno.
I collegamenti fisici sono utili quando il file originale viene spostato. Ad esempio, spostando un file da / bin in / usr / bin o in / usr / local / bin. Qualsiasi link simbolico al file in / bin verrebbe interrotto da questo, ma un hardlink, essendo un link direttamente all'inode per il file, non gli importerebbe.
I collegamenti fisici possono richiedere meno spazio su disco poiché occupano solo una voce della directory, mentre un collegamento simbolico ha bisogno del proprio inode per memorizzare il nome a cui punta.
Anche i collegamenti fisici richiedono meno tempo per essere risolti: i collegamenti simbolici possono puntare ad altri collegamenti simbolici che si trovano nelle directory con collegamenti simbolici. E alcuni di questi potrebbero essere su NFS o altri file system ad alta latenza e quindi il traffico di rete potrebbe risolversi. I collegamenti fisici, essendo sempre sullo stesso file system, vengono sempre risolti in una singola ricerca e non comportano mai la latenza di rete (se si tratta di un collegamento fisico su un filesystem NFS, il server NFS farebbe la risoluzione e sarebbe invisibile a il sistema client). A volte questo è importante. Non per me, ma posso immaginare sistemi ad alte prestazioni in cui questo potrebbe essere importante.
Penso anche che cose come mmap (2) e persino open (2) utilizzino la stessa funzionalità dei collegamenti fissi per mantenere attivo l'inode di un file in modo che anche se il file viene scollegato (2), l'inode rimane per consentire il processo accesso continuo e solo una volta chiuso il processo il file scompare davvero. Ciò consente file temporanei molto più sicuri (se riesci a ottenere l'apertura e lo scollegamento in modo atomico, cosa che potrebbe esserci un'API POSIX per quella che non ricordo, allora hai davvero un file temporaneo sicuro) dove puoi leggere / scrivere i tuoi dati senza che nessuno sia in grado di accedervi. Bene, questo era vero prima che / proc offrisse a tutti la possibilità di guardare i descrittori dei file, ma questa è un'altra storia.
A proposito, il recupero di un file aperto nel processo A, ma non collegato al file system, ruota attorno all'uso di hardlink per ricreare i collegamenti inode in modo che il file non vada via quando il processo che lo ha aperto lo chiude o se ne va.
Un semplice modo per vedere la differenza tra un collegamento reale e un collegamento simbolico è attraverso un semplice esempio. Un collegamento reale a un file punterà al punto in cui è archiviato il file o all'inode di quel file. Un collegamento simbolico punterà al file stesso stesso.
Quindi se abbiamo un file chiamato " a " e crea un collegamento reale " b " e un collegamento simbolico "c" che fanno tutti riferimento al file " a " :
echo "111" > a
ln a b
ln -s a c
L'output di " a " ;, " b " ;, e " c " sarà:
cat a --> 111
cat b --> 111
cat c --> 111
Ora rimuoviamo il file " a " e guarda cosa succede all'output di "a", "b", e "c":
rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory
Quindi cosa è successo?
Perché il file " c " punta al file " a " stesso, se il file " a " viene eliminato quindi il file " c " non avrà nulla da indicare, infatti viene anche cancellato.
Tuttavia, il file " b " indica il luogo di archiviazione, o l'inode, del file "a". Quindi se il file " a " viene eliminato, quindi non punta più all'inode, ma poiché il file "b " sì, l'inode continuerà a memorizzare qualunque contenuto appartenesse a " a " fino a quando non ci saranno più collegamenti fissi.
Soft Link :
soft o simbolico è più una scorciatoia per il file originale .... se si elimina l'originale la scorciatoia non riesce e se si elimina solo la scorciatoia, nulla accade all'originale.
Sintassi del collegamento soft : ln -s Pathof_Target_file link
Output: link - > ./Target_file
Prova: link readlink
Anche nell'output ls -l link
vedrai la prima lettera in lrwxrwxrwx
come l che indica che il file è un soft link.
Eliminazione del collegamento: scollega collegamento
Nota: se lo desideri, il tuo softlink può funzionare anche dopo averlo spostato altrove dalla directory corrente. Assicurati di dare un percorso assoluto e non un percorso relativo durante la creazione di un collegamento software. ad es. (a partire da / root / user / Target_file e non ./Target_file)
Hard Link:
Il collegamento fisico è più una copia speculare o più percorsi allo stesso file. Fai qualcosa su file1 e appare nel file 2. L'eliminazione dell'una mantiene comunque ok.
L'inode (o il file) viene eliminato solo quando tutti i collegamenti (fissi) o tutti i percorsi verso l'inode (stesso file) sono stati eliminati.
Una volta creato un collegamento reale, il collegamento ha l'inode del file originale. L'eliminazione della ridenominazione o lo spostamento del file originale non influirà sul collegamento reale in quanto si collega all'inode sottostante. Qualsiasi modifica ai dati sull'inode si riflette in tutti i file che fanno riferimento a quell'inode.
Sintassi del collegamento reale : nel link Target_file
Output: verrà creato un file con collegamento al nome con lo stesso numero di inode di Targetfile.
Prova: ls -i link Target_file
(controlla i loro inode)
Eliminazione del collegamento: rm -f link
(Elimina il collegamento proprio come un normale file)
Nota : i collegamenti simbolici possono estendersi ai file system in quanto sono semplicemente il nome di un altro file. Considerando che i collegamenti fisici sono validi solo all'interno dello stesso file system.
I collegamenti simbolici presentano alcune caratteristiche che mancano ai collegamenti reali:
- Punto di collegamento reale al contenuto del file. mentre Soft link punta a nome file.
- mentre la dimensione del collegamento reale è la dimensione del contenuto mentre il collegamento software è con le dimensioni del nome file.
- I collegamenti fisici condividono lo stesso inode. I soft link no.
- I collegamenti fisici non possono attraversare i file system. I soft link lo fanno.
-
sai immediatamente dove punta un link simbolico mentre sei con hard collegamenti, è necessario esplorare l'intero file system per trovare i file condividendo lo stesso inode.
# find / -inum 517333
/home/bobbin/sync.sh /root/synchro
-
i collegamenti reali non possono puntare alle directory.
I collegamenti fisici hanno due limitazioni:
- Le directory non possono essere hard link. Linux non consente che ciò mantenga la struttura ad albero aciclica delle directory.
- Non è possibile creare un collegamento reale tra i filesystem. Entrambi i file devono trovarsi sullo stesso filesystem, poiché diversi filesystem hanno differenti tabelle di inode indipendenti (due file su filesystem diversi, ma con lo stesso numero di inode saranno diversi).
I collegamenti simbolici si collegano al nome di un percorso. Questo può trovarsi ovunque nell'albero dei file di un sistema e non deve nemmeno esistere quando viene creato il collegamento. Il percorso target può essere relativo o assoluto.
I collegamenti fisici sono ulteriori puntatori a un inode, il che significa che possono esistere solo sullo stesso volume della destinazione. Ulteriori collegamenti fisici a un file sono indistinguibili da "originale" nome utilizzato per fare riferimento a un file.
Vorrei indicarti Wikipedia:
Alcuni punti:
- I collegamenti simbolici, a differenza dei collegamenti reali, possono attraversare i filesystem (il più delle volte).
- I collegamenti simbolici possono puntare a directory.
- I collegamenti fisici puntano a un file e consentono di fare riferimento allo stesso file con più di un nome.
- Finché esiste almeno un collegamento, i dati sono ancora disponibili.
I collegamenti fisici sono molto utili quando si eseguono backup incrementali. Vedi rsnapshot , ad esempio. L'idea è di fare una copia usando hard link:
- copia il numero di backup n in n + 1
- copia backup n - 1 in n
- ...
- copia il backup 0 nel backup 1
- aggiorna il backup 0 con tutti i file modificati.
Il nuovo backup non occuperà spazio aggiuntivo a parte eventuali modifiche apportate, poiché tutti i backup incrementali punteranno allo stesso set di inode per file che non sono stati modificati.
Aggiungo alla domanda di Nick: quando collegamenti reali sono utili o necessari? L'unica applicazione che mi viene in mente, in cui i collegamenti simbolici non farebbero il lavoro, è fornire una copia di un file di sistema in un ambiente chroot.
Inoltre:
- Le prestazioni di lettura dei collegamenti reali sono migliori dei collegamenti simbolici (micro-prestazioni)
- I collegamenti simbolici possono essere copiati, controllati dalla versione, ..etc. In altre parole, sono un file reale. Dall'altro lato, un hard link è qualcosa a un livello leggermente inferiore e scoprirai che rispetto ai link simbolici, ci sono meno strumenti che forniscono mezzi per lavorare con i hard link come hard link e non come normali file
Quello che pensi come un normale "file" " in realtà sono due cose separate: i dati di un file e una voce di directory. Quando si crea un collegamento reale per un file, si crea effettivamente una seconda voce della directory che fa riferimento agli stessi dati. Entrambe le voci della directory hanno la stessa identica funzionalità; ognuno può essere utilizzato per aprire il file per leggerlo. Quindi in realtà non hai " un file più un hard link " hai " file di dati con due voci di directory " ;. Quello che pensi come eliminare un file in realtà elimina una voce della directory e quando l'ultima voce della directory per i dati viene eliminata, anche i dati stessi vengono eliminati. Per i file ordinari che hanno solo una voce della directory, l'eliminazione della voce della directory eliminerà i dati come sempre. (Durante l'apertura di un file, il sistema operativo crea un collegamento temporaneo al file, quindi anche quando si eliminano tutte le voci della directory, i dati rimangono ma scompaiono non appena si chiude il file).
Ad esempio, creare un file A.txt, un hard link B.txt ed eliminare A.txt. Quando hai creato A.txt, sono stati creati alcuni dati e una voce di directory A.txt. Quando è stato creato il collegamento reale, è stata creata un'altra voce di directory B.txt, che punta agli stessi stessi dati. Quando elimini A.txt, hai ancora tutti i dati e una singola voce di directory B.txt, esattamente come se avessi creato un file B.txt in primo luogo.
Un soft link è solo un file (quasi) ordinario, tranne per il fatto che non contiene dati, ma il percorso di un'altra voce della directory. Se si elimina il file a cui fa riferimento il collegamento software, il collegamento software conterrà un percorso che non punta più a una voce della directory; è rotto. Se si elimina il collegamento software, è come eliminare qualsiasi altro file, il file a cui punta non è interessato.
Da MSDN ,
Link simbolico
Un collegamento simbolico è un oggetto file system che punta a un altro oggetto file system. L'oggetto puntato si chiama target.
I collegamenti simbolici sono trasparenti per gli utenti; i collegamenti appaiono normalmente file o directory e possono essere gestiti dall'utente o dall'applicazione esattamente allo stesso modo.
I collegamenti simbolici sono progettati per facilitare la migrazione e l'applicazione compatibilità con i sistemi operativi UNIX. Microsoft ha implementato i suoi collegamenti simbolici funzionano esattamente come i collegamenti UNIX.
I collegamenti simbolici possono essere collegamenti assoluti o relativi. Assoluto i collegamenti sono collegamenti che specificano ogni parte del nome del percorso; parente i collegamenti sono determinati in relazione al punto in cui si trovano gli identificatori del collegamento relativo un percorso specificato
Un esempio di collegamento simbolico assoluto
X: "C:\alpha\beta\absLink\gamma\file"
Link: "absLink" maps to "\\machineB\share"
Modified Path: "\\machineB\share\gamma\file"
Un esempio di collegamenti simbolici relativi
X: C:\alpha\beta\link\gamma\file
Link: "link" maps to "..\..\theta"
Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"
Final Path: "C:\theta\gamma\file"
Hard link
Un collegamento reale è la rappresentazione del file system di un file più di un percorso fa riferimento a un singolo file nello stesso volume .
Per creare un collegamento reale in Windows, vai al punto in cui deve essere creato il collegamento e inserisci questo comando:
mklink /H Link_name target_path
Si noti che è possibile eliminare i collegamenti fisici in qualsiasi ordine, indipendentemente dall'ordine in cui sono stati creati. Inoltre, non è possibile creare hard link quando
- i riferimenti si trovano in diverse unità locali I riferimenti
- includono l'unità di rete. In altre parole, uno dei riferimenti è un'unità di rete
- l'hard link da creare si trova nello stesso percorso del target
Junction
NTFS supporta un altro tipo di collegamento chiamato junction. MSDN lo definisce come segue:
Una giunzione (anche chiamata soft link) differisce da una hard link in quanto gli oggetti di archiviazione a cui fa riferimento sono directory separate e una giunzione può collegare directory situate su diversi volumi locali sullo stesso computer . Altrimenti, le giunzioni funzionano in modo identico ai collegamenti reali.
Le parti in grassetto nella sezione hard link e nella sezione di giunzione mostrano la differenza di base tra i due.
Comando per creare un incrocio in Windows, accedere al punto in cui si desidera creare il collegamento, quindi immettere:
mklink /J link_name target_path
Semplicemente, Hard link: è solo aggiungere un nuovo nome a un file, questo significa che un file può avere più nomi contemporaneamente, tutti i nomi sono uguali tra loro, nessuno preferito, Hard link non è destinato a copiare tutto il contenuto del file e creare un nuovo file non è quello, crea semplicemente un nome alternativo per essere conosciuto ..
Link simbolico (link simbolico): è un puntatore a un altro file, se il link simbolico punta a un file esistente che viene successivamente eliminato, il link simbolico continua a puntare allo stesso nome file anche se il nome non nomina più file.
Una voce della directory è link a structrue:
struct dentry{
ino_t ino;
char name[256];
}
l'ino è il numero di inode, il nome è il nome del file, la struttura dell'inode forse come & # 65306;
struct inode{
link_t nlink;
...
}
ad esempio si crea un file / 1, la voce della directory potrebbe essere simile a:
struct dentry{
ino_t ino; /* such as 15 */
char name[256]; /* "1" */
}
la struttura dell'inode potrebbe piacere:
struct inode{ /* inode number 15 */
link_t nlink; /* nlink = 1 */
...
}
quindi si crea un collegamento reale (potrebbe essere / 100), la voce della directory potrebbe essere simile a:
struct dentry{
ino_t ino; /* 15 */
char name[256]; /* 100 */
}
la struttura dell'inode potrebbe piacere:
struct inode{ /* inode numebr 15 */
link_t nlink; /* nlink = 2 */
...
}
quindi si crea un collegamento simbolico (potrebbe essere / 200) al file 1, la voce della directory potrebbe essere simile a:
struct dentry{
ino_t ino; /* such as 16 */
char name[256]; /* "200" */
}
la struttura dell'inode potrebbe piacere:
struct inode{ /* inode number 15 */
link_t nlink; /* nlink = 2 */
...
}
struct inode{ /* inode number 16 */
link_t nlink; /* nlink = 1 */
...
} /* the data of inode 16 maybe /1 or 1 */
Aggiungendo a tutte le risposte di cui sopra, la differenza nel trovare il file hardlink e softlink può essere compresa come di seguito:
Ho un file f6
nella mia directory corrente, così come una directory chiamata t2
.
Il file denominato f1
e ./t2/f2
sono collegamenti simbolici a f6
.
Il file denominato f7
e ./t2/f8
sono collegamenti reali di f6
.
Per trovare un collegamento soft o hard possiamo usare:
$ find -L . -samefile f6
> ./f1
> ./f6
> ./f7
> ./t2/f2
> ./t2/f8
Per trovare solo il collegamento fisico possiamo usare:
$ find . -xdev -samefile f6
> ./f6
> ./f7
> ./t2/f8
Poiché è possibile creare hardlink sullo stesso file system, possiamo cercare tutti gli hardlink senza l'opzione -L
utilizzata (con l'opzione -xdev
) nello stesso file- sistema / mount. Salva la ricerca non necessaria in diversi punti di montaggio.
Quindi la ricerca del collegamento fisico è un po 'più veloce della ricerca dei collegamenti diretti (per favore rettifica se sbaglio o non sono chiaro).
I collegamenti simbolici danno un altro nome a un file, in modo simile ai collegamenti reali. Ma un file può essere eliminato anche se restano dei collegamenti simbolici.
Ho appena trovato un modo semplice per comprendere i collegamenti reali in uno scenario comune, l'installazione del software.
Un giorno ho scaricato un software nella cartella Download
per l'installazione. Dopo aver eseguito sudo make install
, alcuni file eseguibili sono stati cp
inseriti nella cartella bin locale. Qui, cp
crea collegamento reale . Sono stato contento del software ma presto ho capito che Download
non è un buon posto a lungo termine. Quindi ho mv
modificato la cartella del software nella directory source
. Bene, posso ancora eseguire il software come prima senza preoccuparmi di cose di collegamento target, come in Windows. Ciò significa che collegamento reale trova direttamente l'inode e altri file in giro.
In questa risposta quando dico un file intendo la posizione in memoria
Tutti i dati salvati vengono archiviati in memoria utilizzando una struttura di dati chiamata inode Ogni inode ha un inodenumber. Il numero di inode viene utilizzato per accedere all'inode. Tutti i collegamenti fisici a un file possono avere nomi diversi ma condividere lo stesso numero di inode. Poiché tutti gli hard link hanno lo stesso numero di inode (che a loro volta accedono allo stesso inode), tutti puntano alla stessa memoria fisica.
Un collegamento simbolico è un tipo speciale di file. Poiché è anche un file, avrà un nome file e un numero di inode. Come detto sopra il numero di inode accede a un inode che punta ai dati. Ora, ciò che rende un collegamento simbolico speciale è che gli inodenumeri nei collegamenti simbolici accedono a quegli inode che puntano a "un percorso" a un altro file. Più in particolare il numero di inode nel collegamento simbolico accede a quegli inode che indicano un altro collegamento reale.
quando ci spostiamo, copiamo, cancelliamo un file nella GUI, stiamo giocando con i collegamenti reali del file, non con la memoria fisica. quando cancelliamo un file, stiamo cancellando il collegamento reale del file. non stiamo cancellando la memoria fisica. Se tutti i collegamenti fissi al file vengono eliminati, non sarà possibile accedere ai dati memorizzati, sebbene possano essere ancora presenti in memoria
I miei due centesimi sull'utilizzo:
I collegamenti?? Soft possono essere utilizzati per abbreviare i nomi di percorsi lunghi, ad esempio:
ln -s /long/folder/name/on/long/path/file.txt /short/file.txt
Le modifiche apportate a /short/file.txt
verranno applicate al file originale.
Hard possono essere utilizzati per spostarsi tra file di grandi dimensioni:
$ ls -lh /myapp/dev/
total 10G
-rw-r--r-- 2 root root 10G May 22 12:09 application.bin
ln /myapp/dev/application.bin /myapp/prd/application.bin
Copia istantanea in un'altra cartella e il file originale (su / myapp / dev
) può essere spostato o eliminato, senza toccare il file su / myapp / prd