![Desreferenciando links físicos](https://rvso.com/image/23933/Desreferenciando%20links%20f%C3%ADsicos.png)
Na página de manual do tar
comando, uma opção para seguir 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 tar
saber que um arquivo é um link físico? Como é queseguiristo?
E se eu não escolher esta opção? Como é quenãodesreferência difícil?
Responder1
Por padrão, se você solicitar tar
arquivar um arquivo com links físicos e mais de um desses links 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ê extrair esse arquivo, os links físicos serão restaurados.
Se você usar a --hard-dereference
opção, tar
entãonãopreservar links físicos. Em vez disso, ele os trata como arquivos independentes que possuem o mesmo conteúdo e metadados. Ao extrair o arquivo, os arquivos serão independentes.
Nota: Ele reconhece links físicos 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.)
Responder2
Você pode distinguir um arquivo com link(s) físico(s) de um arquivo sem link físico com a "contagem de links". 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
Aquele 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 do struct stat, que é preenchido por uma stat()
chamada do sistema.
Pelo que posso dizer, executar tar
with --hard-dereference
significa que, em vez de obter um único arquivo com dois nomes de arquivo 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 que possui para os dados do arquivo com link físico. Quando chamado --hard-dereference
na criação do arquivo, parece criar um arquivo inteiramente novo para o segundo nome de arquivo quando a chamada de extração é tar
executada.