Dereferenciando hard links

18

Na página de manual do comando tar , uma opção para seguir hard links é listada.

-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

Como o tar sabe que um arquivo é um link físico? Como ele segue isso?

E se eu não escolher essa opção? Como isso não desrefere com ênfase?

    
por musa 14.07.2012 / 05:55

2 respostas

21

Por padrão, se você disser tar para arquivar um arquivo com links físicos, e mais de um desses links for incluído entre os arquivos a serem arquivados, arquiva o arquivo apenas uma vez e registra o segundo (e qualquer arquivo adicional). nomes) como links físicos. Isso significa que, ao extrair esse arquivo, os links físicos serão restaurados.

Se você usar a opção --hard-dereference , o tar não não preservará os links físicos. Em vez disso, trata-os como arquivos independentes que, por acaso, possuem o mesmo conteúdo e metadados. Quando você extrai o arquivo, os arquivos serão independentes.

Nota: Ele reconhece hard links verificando primeiro a contagem de links do arquivo. Ele registra o número do dispositivo e o inode de cada arquivo com mais de um link e usa isso para detectar quando o mesmo arquivo está sendo arquivado novamente. (Quando você usa --hard-dereference , isso não acontece.)

    
por 14.07.2012 / 07:17
6

Você pode distinguir um arquivo com link (s) rígido (s) para ele de um arquivo não com link físico com a "contagem de links". Eu vejo duas maneiras de conseguir isso na linha de 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: -

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

Esse solitário '2' antes de "bediger" é a contagem de links. Observe que ambos os nomes de arquivos têm o mesmo número de inode, 932815.

Tenho certeza de que ambos os comandos obtêm a contagem de links do campo st_nlink de struct stat, que é preenchido por uma chamada de sistema stat() .

Por mais que eu saiba, executar tar com --hard-dereference significa que, em vez de obter um único arquivo com dois nomes de arquivos distintos (como no exemplo acima), você obtém dois arquivos, cada um com um único nome de arquivo. tar provavelmente verifica a contagem de links em cada arquivo e, por padrão, ao extrair, cria um link físico no segundo nome de arquivo para os dados do arquivo com link físico. Quando chamado com --hard-dereference na criação de archive, parece criar um arquivo inteiramente novo para o segundo nome de arquivo quando a chamada de extração de tar for executada.

    
por 14.07.2012 / 06:24

Tags