Desreferenciando links físicos

22

Na página de tarcomando manual , uma opção para seguir os links físicos é 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 tarsabe que um arquivo é um link físico? Como se segue ?

E se eu não escolher essa opção? Como isso não faz uma dereferência dura?

musa
fonte

Respostas:

24

Por padrão, se você pedir tarpara arquivar um arquivo com links físicos, e mais de um link estiver incluído entre os arquivos a serem arquivados, ele arquivará o arquivo apenas uma vez e registrará o segundo (e quaisquer nomes adicionais) como links físicos. Isso significa que, quando você extrai esse arquivo, os links físicos serão restaurados.

Se você usar a --hard-dereferenceopção, em seguida, tarse não preservam ligações fortes. Em vez disso, trata-os como arquivos independentes que, por acaso, têm o mesmo conteúdo e metadados. Quando você extrai o arquivo, os arquivos serão independentes.

Nota: Reconhece links físicos, primeiro verificando 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 o utiliza para detectar quando o mesmo arquivo está sendo arquivado novamente. (Quando você usa --hard-dereference, ele não faz isso.)

cjm
fonte
7

Você pode distinguir um arquivo com links físicos de um arquivo não vinculado com a "contagem de links". Eu vejo duas maneiras de obter 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 '2' solitário antes de "bediger" é a contagem de links. Observe que os dois nomes de arquivos têm o mesmo número de inode, 932815.

Estou certo de que esses dois comandos obtêm a contagem de links do campo st_nlink do struct stat, que é preenchido por uma stat()chamada do sistema.

Tão perto quanto eu posso dizer, executar tarcom --hard-dereferencesignifica 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. tarprovavelmente verifica a contagem de links em cada arquivo e, por padrão, ao extrair, cria um link físico no segundo nome do arquivo para os dados do arquivo vinculado. Quando chamado --hard-dereferencena criação do arquivo morto, ele parece criar um arquivo totalmente novo para o segundo nome de arquivo quando a chamada de extração taré executada.

Bruce Ediger
fonte
Agora entendo que 'siga os links físicos' está na formulação errada. Obrigado. Mas e se um dos dois arquivos idênticos não for arquivado? A contagem de links é enganosa nesses casos.
Musa
2
Não são "dois arquivos idênticos", é um arquivo com dois nomes. Não importa qual arquivo tar não arquiva, pois eles são idênticos. Por padrão, o tar provavelmente mantém algum tipo de "ponteiro" do segundo nome do arquivo de volta ao primeiro, assim como o sistema de arquivos.
12Preço: