Déréférencer des liens durs

22

Dans la page de manuel de tarcommande, une option pour suivre les liens durs est répertoriée.

-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

Comment tarsavoir qu'un fichier est un lien dur? Comment le suit- il?

Et si je ne choisis pas cette option? Comment cela ne déroge- t-il pas dur?

musa
la source

Réponses:

24

Par défaut, si vous demandez tard'archiver un fichier avec des liens durs et que plusieurs de ces liens sont inclus parmi les fichiers à archiver, il archive le fichier une seule fois et enregistre le second (et tout nom supplémentaire) en tant que liens durs. Cela signifie que lorsque vous extrayez cette archive, les liens matériels seront restaurés.

Si vous utilisez l' --hard-dereferenceoption, alors tarne conserve pas les liens durs. Au lieu de cela, il les traite comme des fichiers indépendants qui ont simplement le même contenu et les mêmes métadonnées. Lorsque vous extrayez l'archive, les fichiers seront indépendants.

Remarque: Il reconnaît les liens durs en vérifiant d'abord le nombre de liens du fichier. Il enregistre le numéro de périphérique et l'inode de chaque fichier avec plus d'un lien, et l'utilise pour détecter quand le même fichier est à nouveau archivé. (Lorsque vous utilisez --hard-dereference, il ne fait pas cela.)

cjm
la source
7

Vous pouvez distinguer un fichier avec des liens durs vers celui-ci d'un fichier non lié avec le "nombre de liens". Je vois deux façons d'obtenir cela à partir de la ligne de commande:

% 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: -

Ou

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

Ce «2» solitaire devant «bediger» est le nombre de liens. Notez que les deux noms de fichiers ont le même numéro d'inode, 932815.

Je suis certain que ces deux commandes obtiennent le nombre de liens du champ st_nlink de struct stat, qui est rempli par un stat()appel système.

Pour autant que je sache, courir taravec --hard-dereferencesignifie qu'au lieu d'obtenir un seul fichier avec deux noms de fichiers distincts (comme dans l'exemple ci-dessus), vous obtenez deux fichiers, chacun avec un seul nom de fichier. tarvérifie probablement le nombre de liens sur chaque fichier, et par défaut lors de l'extraction, il crée un lien dur sur le deuxième nom de fichier qu'il a pour les données du fichier lié. Lorsqu'il est appelé --hard-dereferencelors de la création de l'archive, il semble créer un fichier entièrement nouveau pour le deuxième nom de fichier lors de l'appel d'extraction des tarexécutions.

Bruce Ediger
la source
Maintenant, je comprends que «suivre les liens en dur» est une mauvaise formulation. Merci. Mais que faire si l'un des deux fichiers identiques n'est pas archivé? Le nombre de liens est trompeur dans de tels cas.
musa
2
Ce n'est pas "deux fichiers identiques", c'est un fichier avec deux noms. Peu importe quel fichier tar ne archive pas, car ils sont identiques. Par défaut, tar conserve probablement une sorte de "pointeur" du deuxième nom de fichier au premier, comme le fait le système de fichiers.
Bruce Ediger