tar: Erro potencial (?) quando arquivo incremental selecionado - Excluindo arquivos no destino

1

Eu tenho uma observação bastante interessante, que talvez seja um manifesto de um bug.

Meu caso de uso é:

  • faça um backup de uma pasta, adicionando um conjunto de arquivos dessa pasta ao arquivo --exclude-from. Estou trabalhando com backup incremental (conjunto de opções -g)
  • em uma nova máquina, restaurando o tar no mesmo local da máquina original. Note que a nova máquina já possui alguns arquivos no local; se houver alguma coisa, quero substituir / sobrescrever.

Etapas para reproduzir

  1. Crie a estrutura de arquivos e pastas conforme abaixo:

    /tmp/src
    └── etc
        ├── A.cfg
        └── config
            ├── 1.cfg
            ├── 2.cfg
            └── 3.cfg
    
  2. Crie arquivos de exclusão e inclusão

    mbp:tarTests jhartman$ cat /tmp/include.cfg
    /tmp/src/etc/
    mbp:tarTests jhartman$ cat /tmp/exclude.cfg
    /tmp/src/etc/config/*.cfg
    
  3. Crie um arquivo

    $ rm -f /tmp/snapshot 
    $ tar -g /tmp/snapshot -cvz -f /tmp/test.tar.gz -X /tmp/exclude.cfg -T /tmp/include.cfg
    
    
    ./tar-1.27/src/tar: /tmp/src/etc: Directory is new
    ./tar-1.27/src/tar: /tmp/src/etc/config: Directory is new
    ./tar-1.27/src/tar: Removing leading '/' from member names
    /tmp/src/etc/
    /tmp/src/etc/config/
    /tmp/src/etc/A.cfg
    
  4. Descompacte em um novo servidor. Antes de desarquivar arquivos no novo servidor:

    /tmp/src
    └── etc
        ├── A.cfg
        └── config
            ├── 3.cfg
            ├── 4.cfg
            └── 5.cfg
    
    • descompactar (na máquina de destino)

      $TAR_BASE/src/tar --overwrite --extract --force-local --listed-incremental=/dev/null --file /tmp/test.tar.gz -v -C /
      
      tmp/src/etc/
      tmp/src/etc/config/
      ./tar-1.30/src/tar: Deleting ‘tmp/src/etc/config/4.cfg’
      ./tar-1.30/src/tar: Deleting ‘tmp/src/etc/config/5.cfg’
      tmp/src/etc/A.cfg
      

Então, eventualmente, arquivos nesta pasta:

/tmp/src
└── etc
    ├── A.cfg
    └── config
        └── 3.cfg

Como você vê, apesar de 4.cfg e 5.cfg não estarem int src machine, eles desapareceram. Eu estou supondo que é por causa de usar /tmp/src/etc/config/*.cfg no arquivo de exclusão.

Vale mencionar que esse comportamento estava mudando nas versões: 1.30, 1.27, 1.27.1, 1.29 - NOK, 1.25, 1.26, 1.28 - OK (onde NOK significa - eu pude ver Deletando mensagem para os arquivos em minha preocupação ).

O que você acha?

Obrigado Jarek

Atualização, 2018-08-21, 20:51

Independentemente da versão que eu executo, a saída da operação --list é a mesma e mostra D na pasta config :

tar --list --incremental --verbose --verbose --file /tmp/test.tar.gz

drwxr-xr-x jhartman/staff   16 2018-08-21 20:44 tmp/src/etc/
Y A.cfg
D config

drwxr-xr-x jhartman/staff   22 2018-08-21 20:44 tmp/src/etc/config/
N 1.cfg
N 2.cfg
N 3.cfg

-rw-r--r-- jhartman/staff   30 2018-08-21 20:44 tmp/src/etc/A.cfg

Atualização 21:03

Para referência, os scripts que usei para os testes estão armazenados no link repo.

Veja output.txt para resultados detalhados dos testes.

    
por Jarek 21.08.2018 / 17:28

0 respostas