Posso validar um download grande de arquivos em partes por http

5

Estou fazendo o download de um arquivo grande em http via wget , 1,2TB. O download leva cerca de uma semana e já conteve corrupções duas vezes (falha na verificação do md5, que leva dias para ser executada sozinha).

Existe uma boa maneira de validar o arquivo em vez de http usando curl ? Ou dividi-lo em blocos separados, de modo que eu pudesse identificar um bloco ruim específico e baixar novamente apenas essa seção?

O arquivo é um arquivo tar , então acredito que os danos por bloco possam ser identificados sequencialmente durante a descompactação.

    
por davidparks21 24.10.2017 / 21:19

3 respostas

6

No lado do servidor, você pode usar dd e md5sum na soma de verificação de cada parte do arquivo:

#!/bin/bash
FILENAME="$1"
FILESIZE='stat --printf="%s" $FILENAME'
CHUNKSIZE=536870912 # 512MB
CHUNKNUM=0
while ! grep -q 'cannot skip' hash.log 2> /dev/null ; do
    dd if=$FILENAME bs=$CHUNKSIZE skip=$CHUNKNUM count=1 2> hash.log | md5sum >> $FILENAME.md5
    CHUNKNUM=$(( CHUNKNUM + 1 ))
done
rm hash.log

Você ficará com um único arquivo $FILENAME.md5 com todos os hashes de fragmentos.

Agora você pode fazer o download desse arquivo grande e das somas de verificação, executar esse script no arquivo e comparar os hashes. Se alguma peça tiver um hash incompatível, você poderá usar o curl para baixar apenas parte do arquivo (se o servidor suportar RANGE) e corrigir o arquivo com dd.

Por exemplo, se o bloco 2 tiver uma incompatibilidade de hash:

curl -s -r 536870912-1073741824 | dd of=somelargetarfile.tar seek=536870912 conv=notrunc

Isso fará o download do fragmento 2 e corrigirá o arquivo tar grande com ele.

    
por 24.10.2017 / 22:19
3

A resposta do ThoriumBR é boa, mas eu gostaria de adicionar alguns conselhos adicionais caso você não consiga acessar o servidor remoto.

Você já tem um (ou mais) mau (s) download (s) localmente.
Usando o truque dividido fornecido pelo ThoriumBR, você pode dividir esses arquivos localmente e usar as partes boas.
Compare cada um desses trechos com o mesmo trecho baixado usando o curl (conforme a última instrução do ThoriumBR). Se você tem 2 pedaços idênticos (diff binário, sem necessidade de slow md5) você pode ter certeza de que é um bom pedaço. Então, salve-o em outro lugar e repita com o próximo pedaço.

Então: Para cada trecho: Compare suas cópias locais (se você tiver mais de 1) e adicione cópias recém-baixadas e compare até encontrar 2 trechos idênticos: esse é o único a guardar.

É um pouco de trabalho manual, mas factível. Você pode até mesmo roteirizar todo o processo, mas fazer isso (e depurar o script) pode não valer o esforço.

    
por 25.10.2017 / 16:38
0

No servidor de origem, crie um BitTorrent .torrent e adicione o local existente como um URL de semente da web. O BitTorrent irá verificar os pedaços. Qualquer cliente que conseguir baixar uma cópia pode propagá-la, se desejar.

Isso requer uma boa cópia do arquivo para criar o arquivo .torrent. Muito semelhante à solução do ThoriumBR, com diferentes ferramentas.

Se você ainda tiver arquivos e / ou somas de verificação com falha, compare todos os dados e a soma de verificação. O mesmo resultado de cada vez pode indicar que a sua transferência está correta, mas o arquivo remoto não está de acordo com a soma de verificação conhecida.

    
por 29.10.2017 / 00:56