Dereferenziare i collegamenti reali


22

Nella pagina di tarcomando manuale , è elencata un'opzione per seguire i collegamenti reali.

-h, --dereference
      follow symlinks; archive and dump the files they point to

--hard-dereference
      follow hard links; archive and dump the files they refer to

Come fa a tarsapere che un file è un collegamento reale? Come lo segue ?

Cosa succede se non scelgo questa opzione? Come lo fa non hard-dereference?

Risposte:


24

Per impostazione predefinita, se si dice tardi archiviare un file con collegamenti reali e più di uno di questi collegamenti è incluso tra i file da archiviare, esso archivia il file una sola volta e registra il secondo (e tutti i nomi aggiuntivi) come collegamenti reali. Ciò significa che quando si estrae tale archivio, verranno ripristinati i collegamenti reali.

Se si utilizza l' --hard-dereferenceopzione, tarnon si conservano i collegamenti reali. Invece, li tratta come file indipendenti che hanno solo gli stessi contenuti e metadati. Quando si estrae l'archivio, i file saranno indipendenti.

Nota: riconosce i collegamenti reali controllando prima il conteggio dei collegamenti del file. Registra il numero del dispositivo e l'inode di ciascun file con più di un collegamento e lo utilizza per rilevare quando lo stesso file viene nuovamente archiviato. (Quando lo usi --hard-dereference, non lo fa.)


7

È possibile distinguere un file con hard link da un file non hard-link con il "conteggio dei collegamenti". Vedo due modi per ottenerlo dalla riga di comando:

% stat original
  File: ‘original’
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 804h/2052d      Inode: 932815      Links: 2
Access: (0644/-rw-r--r--)  Uid: (  500/ bediger)   Gid: ( 1000/ bediger)
Access: 2012-07-13 22:13:52.317101530 -0600
Modify: 2012-07-13 22:13:52.317101530 -0600
Change: 2012-07-13 22:14:08.050894536 -0600
 Birth: -

O

1010 % ls -li 
total 0
932815 -rw-r--r-- 2 bediger bediger 0 Jul 13 22:13 original
932815 -rw-r--r-- 2 bediger bediger 0 Jul 13 22:13 secondary

Quel solitario '2' prima di "bediger" è il conteggio dei collegamenti. Si noti che entrambi i nomi di file hanno lo stesso numero di inode, 932815.

Sono certo che entrambi questi comandi ottengono il conteggio dei collegamenti dal campo st_nlink di struct stat, che viene riempito da una stat()chiamata di sistema.

Per quanto posso dire, correre tarcon --hard-dereferencesignifica che invece di ottenere un singolo file con due nomi di file distinti (come nell'esempio sopra), ottieni due file, ciascuno con un singolo nome file. tarprobabilmente controlla il conteggio dei collegamenti su ciascun file e, per impostazione predefinita, durante l'estrazione, crea un collegamento reale sul secondo nome file che ha per i dati del file collegato. Quando viene chiamato con --hard-dereferenceal momento della creazione dell'archivio, sembra creare un file completamente nuovo per il secondo nome di file quando viene richiamata l'estrazione dell'estrazione tar.


Ora capisco che "seguire i collegamenti reali" è una formulazione errata. Grazie. Ma cosa succede se uno dei due file identici non viene archiviato? In questi casi il conteggio dei collegamenti è fuorviante.
musa,

2
Non sono "due file identici", è un file con due nomi. Non importa quale file tar non archivia, poiché sono identici. Per impostazione predefinita, tar probabilmente mantiene comunque una sorta di "puntatore" dal secondo nome del file al primo, proprio come fa il filesystem.
Bruce Ediger,
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.