Corrija um arquivo binário muito grande em uma conexão lenta

Corrija um arquivo binário muito grande em uma conexão lenta

para fins de backup, transferi um arquivo binário muito grande por meio de uma conexão lenta comparativamente upstream (a transferência levou 2 semanas), sincronizando-o novamente em um compartilhamento cifs montado (para que eu pudesse acessá-lo em bloco). Após 2 semanas, o rsync mostrou um erro (infelizmente não foi possível salvá-lo), mas o tamanho do arquivo correspondia.

tail -c 1000000000 myfile.img|md5sum # and
head -c 1000000000 myfile.img|md5sum

match, então o início e o fim do arquivo são idênticos.

Como meu downstream é muito mais rápido, baixei a imagem completa novamente e fiz somas MD5 em tudo, e elas NÃO correspondem. Então, aparentemente, em algum lugar desses 1,5 TB há pelo menos um bit diferente.

Existe uma maneira de gerar um "patch" a partir dos dois arquivos que baixei e depois aplicá-lo no arquivo remoto, para que apenas os blocos errados tenham que ser transferidos novamente?

Observe novamente: NÃO tenho o poder de executar código remotamente ou fazer uso dos recursos do rsync que exigem a execução remota do rsync. Acho que ainda poderia usar o rsync e ele funciona na ordem de magnitude da minha taxa de download, mas me pergunto se existe uma maneira melhor de aproveitar o fato de ter as duas versões localmente. Provavelmente não seria tão difícil escrever algo, mas eu preferiria usar algo testado e salvar o trabalho.

Responder1

(assumindo Linux) se você acredita que há apenas um bloco de dados corrompido, mas o tamanho do bloco não mudou, então você pode usar cmp -l. Ele compara byte por byte e -lfornece o deslocamento de quaisquer diferenças. Se você tem uma vaga ideia de por onde começar nos arquivos, você pode começar com -i. Quando você tiver os deslocamentos errados, poderá usá dd skip=...-los para recortá-los do arquivo original e dd seek=... conv=notrunccolá-los no arquivo quebrado. (Teste na cópia primeiro)

Responder2

Eu usaria o BitTorrent para recuperar o arquivo no lado remoto. O protocolo divide um arquivo em pequenos blocos e baixa automaticamente novamente os blocos cujos hashes não correspondem ao arquivo inicial.

Para fazê-lo funcionar em um ambiente privado:

  1. Desative o DHT nos clientes locais e remotos de bittorrent.
  2. Abra portas bit-torrent locais no firewall ou configure o encaminhamento de porta SSH.
  3. Crie um arquivo inicial no lado da origem. Não use um rastreador. Certifique-se de que o cliente comece a propagar o arquivo também.
  4. Faça backup do arquivo no lado remoto.
  5. Copie o arquivo seed para o lado remoto e abra-o com o cliente.
  6. Aponte o local do download para o arquivo corrompido e escolha a opçãonão inicie o download!! Desative também as opções de conexão com DHT, troca de pares, etc., se disponíveis.
  7. Peça ao cliente para verificar novamente o arquivo baixado. Deve relatar uma porcentagem de download quase completa.
  8. Adicione o cliente local como peer ao download
  9. Inicie o download

informação relacionada