Comprimindo arquivos .tar.gz compactados deterministicamente

3

Eu quero realizar uma série de recompressões de arquivos compactados para estudar suas propriedades.

Primeiro, tentei simplesmente recompactar .zip arquivos em um loop:

for f in $(seq 1 100)
do 
  zip $f.zip -9 -v $(($f-1)).zip
done

A partir de um arquivo 0.zip fixo, percebi que, se eu reproduzisse essas linhas, todos os primeiros arquivos, exceto os primeiros, teriam tamanhos diferentes. Depois de alguma investigação, percebi que isso era causado pelos registros de data e hora dos arquivos compactados. Então, eu reconfixo os timestamps antes de recomprimir:

for f in $(seq 1 100)
do
  touch $(($f-1)).zip -t 200101010101
  zip $f.zip -9 -v $(($f-1)).zip
done

E dessa vez obtive resultados determinísticos para a compactação usando zip . No entanto, usar tar com o algoritmo gzip ainda não funciona. Toda vez que eu corro:

for f in $(seq 1 100)
do
  touch $(($f-1)).tar.gz -t 200101010101
  tar cvfz $f.tar.gz $(($f-1)).tar.gz
done

Eu obtenho tamanhos de arquivo diferentes, de 4.tar.gz até 100.tar.gz . Por que isso acontece e o que posso fazer para evitar que isso aconteça?

    
por anol 23.01.2014 / 15:28

3 respostas

3

Ok, acho que finalmente encontrei uma maneira de fazer as coisas do jeito que eu queria, e envolve usar tar e gzip separadamente (estou usando as ferramentas GNU, tar 1.26 e gzip 1.6). / p>

Ao usar a opção z em tar , ele primeiro cria o arquivo tar e, em seguida, imediatamente, ele usa o carimbo de data / hora aquele para criar o arquivo gzip. Em outras palavras, não consigo controlar o timestamp do arquivo intermediário (não encontrei nenhuma opção para fazer isso, além de alterar o mtime dos arquivos originais que estão sendo arquivados), para que o arquivo .tar.gz acabe sendo não-arquivado. determinístico.

No entanto, se eu usar primeiro o tar sem o gzip, então modifique o timestamp do arquivo tar (usando touch por exemplo), e então eu compilei usando o gzip, eu obtive resultados determinísticos.

Aliás, os arquivos resultantes usando o processo de duas etapas são muito menores (~ 400 KB no meu exemplo, em vez dos ~ 1,2 MB que recebo quando uso o tar com a opção z). Isso deve estar relacionado às configurações padrão ao usar tar + gzip e gzip sozinho. Como meu arquivo original estava vazio, não sei se a redução de tamanho é significativa.

De qualquer forma, a resposta curta à minha pergunta seria:

  • É possível obter resultados determinísticos, mas usando tar e gzip separadamente;

  • Não parece ser possível obter resultados determinísticos ao usar tar -z , devido ao timestamp do arquivo tar intermediário antes da compactação gzip. Este registro de data e hora não está sob controle do usuário.

por 29.04.2014 / 14:47
3

Para ativar o uso de tar para backups incrementais, algumas versões do tar armazenam a hora em que um arquivo é adicionado a um arquivo. Isso pode resultar em saídas diferentes toda vez que você executar seu teste e, portanto, em resultados que pareçam não-determinísticos.

    
por 29.04.2014 / 09:54
1

Como você mencionou, você precisará fazer as etapas tar e gzip separadamente, no entanto, você não precisa de um arquivo intermediário, basta canalizar a entrada de tar para gzip e especificar a opção -n no gzip. A partir do manpage: Esta opção impede que o nome do arquivo e o registro de data e hora sejam armazenados no arquivo de saída.

tar cvf - /path/to/files | gzip -n > archive.tar.gz

Execute o comando acima duas vezes em momentos diferentes no mesmo conjunto de arquivos e verifique a soma md5. Você deve ver os dois arquivos são idênticos.

    
por 28.12.2015 / 04:19