gunzip: dados compactados inválidos - formato violado

3

Definição do problema: Eu transferi um arquivo tar.gz de uma máquina Linux para uma partição do Windows. A partição do Windows foi montada com o servidor Linux como cifs.

SO: Servidor Red Hat Enterprise Linux versão 5

Sintoma:

Após o processo de cópia ser bem-sucedido, faça uma verificação de integridade com gunzip -t e o processo recebe o seguinte erro:

gunzip -t Backup-28--Jun--2011--Tuesday.tar.gz

gunzip: Backup-28--Jun--2011--Tuesday.tar.gz: invalid compressed data--format violated

E ainda tentou descompactar ( tar -xvzf ) e o processo também falhou.

    
por Arunjith 28.06.2011 / 07:19

2 respostas

2

Parece que o arquivo pode não ter sido transferido corretamente no modo binário. Você pode conseguir que ele funcione com unix2dos Backup-28--Jun--2011--Tuesday.tar.gz , mas se não, você terá que tentar transferi-lo novamente, certificando-se de que ele use o modo binário.

    
por 28.06.2011 / 07:27
0

A verificação da origem dos arquivos de origem e destino é uma boa ideia.

Para ter uma ideia mais específica do que é a corrupção, você poderia fazer uma comparação byte a byte com cmp -l source.gz dest.gz ; também de interesse é se a contagem de bytes difere ( ls -l ).

Aqui está mais uma pequena ferramenta de análise para informar como um dos arquivos pode estar corrompido. Um arquivo zip ou gzip de tamanho razoavelmente grande terá uma distribuição quase uniforme de bytes. Abaixo está um script perl que histograma arquivos. arquivos zip e gzip que foram corrompidos por transferências no modo ASCII terão frequência incomum de retornos de carro e novas linhas, por exemplo, freqüência ou contar duas vezes a norma, ou zero, ou ambos. (Eu vi diferentes servidores FTP ou clientes em diferentes manchetes, por exemplo, adicionando NL após CR, ou excluindo CR de CRLF, ou transformando cada NL em um CR, ou vice-versa. Todos eles interrompem a frequência do caractere exatamente como descrevi. )

Salve isso como hist.pl e execute-o com perl hist.pl *.gz ; olhando para as frequências na distribuição de valores de byte irá dizer-lhe se uma transferência fez algo como excluído cada CR, ou adicionou um CR para cada LF, etc.

#!/usr/bin/perl -w
use strict;

die "filename arguments expected\n" if ($#ARGV < 0);

foreach my $filename (@ARGV) {
    if (!open IN, "<$filename") {
    warn "can't open '$filename'\n";
    next;
    }
    print "$filename\n";
    binmode(IN);
    my @hist = ();
    my $total = 0;
    while (read IN, my $buf, 1024) {
    foreach my $octet (unpack "C*", $buf) {
        $hist[$octet]++;
        $total++;
    }
    }
    close(IN);

    for (my $i = 0;  $i < 256;  $i++) {
    my $count = $hist[$i] || 0;
    my $p = sprintf("%.5f", $count/$total);
    print "[$i] $count $p\n";
    }
    print "total $total\n\n";
}
exit 0;
    
por 28.06.2011 / 14:40