
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 -l
fornece 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=notrunc
colá-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:
- Desative o DHT nos clientes locais e remotos de bittorrent.
- Abra portas bit-torrent locais no firewall ou configure o encaminhamento de porta SSH.
- 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.
- Faça backup do arquivo no lado remoto.
- Copie o arquivo seed para o lado remoto e abra-o com o cliente.
- 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.
- Peça ao cliente para verificar novamente o arquivo baixado. Deve relatar uma porcentagem de download quase completa.
- Adicione o cliente local como peer ao download
- Inicie o download