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.

È stato utile?

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:

inserisci qui la descrizione dell'immagine

Ecco come arriviamo a quella foto:

  1. 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
    
  2. Crea un hard link my-hard-link al file myfile.txt , che significa " crea un file che dovrebbe puntare allo stesso inode quel myfile.txt punta a " ;:

    $ ln myfile.txt my-hard-link
    
  3. Crea un collegamento software my-soft-link al file myfile.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.

 Hard link vs Soft link

Hard link Vs Soft link può essere facilmente spiegato da questa immagine.

Inoltre:

  1. Le prestazioni di lettura dei collegamenti reali sono migliori dei collegamenti simbolici (micro-prestazioni)
  2. 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.

I link

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top