Eu freqüentemente transfiro imagens de VM de hipervisores para um servidor de arquivamento para armazenamento a longo prazo.
Eu transfiro usando netcat desde que é mais rápido que scp, rsync, ect ..
hypervisor$ cat foo.box | nc <archive IP> 1234
archive$ nc -l -p 1234 > foo.box
Quando o arquivo terminou de ser transferido, verifiquei que não havia corrupção executando md5sum
tanto no alvo quanto na fonte.
Infelizmente, executar um md5sum em um arquivo grande pode levar muito tempo. Como posso comparar mais rapidamente a integridade de dois arquivos grandes?
Atualizar:
- Minha transmissão raramente é interrompida, portanto a capacidade de reiniciar não é um problema.
- Geralmente, leva de 3 a 4 horas para transferir via NC e depois 40 minutos para obter o md5sum.
- A segurança do hash não é um problema neste caso.
Respostas:
Você pode usar camiseta para fazer a soma na hora com algo parecido com isto (adapte os comandos netcat para suas necessidades):
Servidor:
Cliente:
fonte
md5deep
tem um modo "chunk" ( md5deep.sourceforge.net/md5deep.html ) que pode ser útil para isso.Resposta de Nerdwaller sobre o uso
tee
para transferir e calcular simultaneamente uma soma de verificação é uma boa abordagem se você estiver preocupado principalmente com a corrupção na rede. Ele não irá protegê-lo contra a corrupção no caminho para o disco, etc., porém, já que ele está recebendo a soma de verificação antes de chegar ao disco.Mas gostaria de acrescentar algo:
1 TiB / 40 minutos ≈ 437 MiB / seg 1 .
Isso é bem rápido, na verdade. Lembre-se que a menos que você tenha um muito de RAM, isso tem que voltar do armazenamento. Então, a primeira coisa a verificar é assistir
iostat -kx 10
como você executa suas somas de verificação; em particular, você quer prestar atenção ao%util
coluna. Se você está atrelando os discos (perto de 100%), a resposta é comprar um armazenamento mais rápido.Caso contrário, como outros pôsteres mencionados, você pode tentar diferentes algoritmos de soma de verificação. MD4, MD5 e SHA-1 são todos projetados para serem hashes criptográficos (embora nenhum deles deva ser usado para essa finalidade; todos são considerados muito fracos). Velocidade sábia, você pode compará-los com
openssl speed md4 md5 sha1 sha256
. Eu joguei SHA256 para ter pelo menos um hash ainda forte o suficiente.Acima, você pode ver que o MD4 é o mais rápido e o SHA256 o mais lento. Esse resultado é típico de hardware semelhante a um PC, pelo menos.
Se você quiser ainda mais desempenho (ao custo de ser trivial para adulterar, e também menos propensos a detectar corrupção), você quer olhar para um hash CRC ou Adler. Dos dois, Adler é tipicamente mais rápido, mas mais fraco. Infelizmente, não estou ciente de nenhuma implementação de linha de comando realmente rápida; os programas no meu sistema são todos mais lentos que o md4 do OpenSSL.
Então, sua melhor aposta de velocidade é
openssl md4 -r
(a-r
faz com que pareça uma saída md5sum).Se você estiver disposto a fazer alguma programação e / ou programação mínima, veja O código de Mark Adler acabou no Stack Overflow e também xxhash . Se você tiver o SSE 4.2, não será capaz de superar a velocidade da instrução CRC de hardware.
1 1 TiB = 1024 ⁴ bytes; 1 MiB = 1024 ² bytes. Vem para 17417MB / s com potências de 1000 unidades.
fonte
shasum
em vez de?o
openssl
comando suporta vários resumos de mensagens. Dos que eu pude tentar,md4
parece correr em cerca de 65% do tempo demd5
e cerca de 54% do tempo desha1
(para o arquivo que testei com).Há também um
md2
na documentação, mas parece dar os mesmos resultados quemd5
.Mais ou menos, a velocidade parece estar inversamente relacionada à qualidade, mas como você (provavelmente) não está preocupado com a possibilidade de um adversário criar uma colisão deliberada, isso não deve ser um grande problema.
Você pode procurar por compilações de mensagens mais antigas e simples (houve
md1
, por exemplo)?Um ponto menor: você tem um Uso inútil de
cat
. Ao invés de:você pode usar:
ou até mesmo:
Isso economiza um processo, mas provavelmente não terá nenhum efeito significativo no desempenho.
fonte
cat
"Portanto, não é necessariamente totalmente ruim. Se não há ganho de desempenho, evitando-o, então é melhor ir com o que você está mais confortável com, assumindo você será o mantenedor deste código.Duas opções:
Usar
sha1sum
Em algumas circunstâncias sha1sum é mais rápido .
Usar
rsync
Levará mais tempo para ser transferido, mas o rsync verifica se o arquivo chegou intacto.
Na página do manual do rsync
fonte
A ciência está progredindo. Parece que a nova função de hash BLAKE2 é mais rápida que a MD5 (e criptograficamente muito mais forte para inicializar).
Referência: https://leastauthority.com/blog/BLAKE2-harder-better-faster-stronger-than-MD5.html
Dos slides de Zooko:
fonte
Você provavelmente não pode fazer nada melhor do que um bom hash. Você pode querer verificar outras funções hash / checksum para ver se algum é significativamente mais rápido do que
md5sum
. Note que você pode não precisar de algo tão forte quanto o MD5. MD5 (e coisas como SHA1) são projetados para serem criptograficamente fortes, então é inviável para um atacante / impostor criar um novo arquivo que possui o mesmo valor de hash que um valor existente (isto é, dificultar a falsificação de e-mails assinados e outros documentos). Se você não está preocupado com um ataque às suas comunicações, mas apenas um erro de comunicação comum, algo como uma verificação cíclica de redundância (CRC) pode ser boa o suficiente. (Mas eu não sei se seria mais rápido.)Outra abordagem é tentar fazer o hash em paralelo com a transferência. Isso pode reduzir o tempo total, e definitivamente poderia reduzir o fator de irritação de precisar esperar a transferência terminar, e espere novamente para o MD5 terminar. Eu não testei isso, mas deveria ser possível fazer algo assim:
Na máquina de origem:
Na máquina de destino:
É claro que verificar os tamanhos dos arquivos é uma maneira boa e rápida de detectar se algum byte foi descartado.
fonte
Enviar arquivos enormes é uma dor. Por que não tentar dividir os arquivos gerando um hash para cada fragmento e depois enviá-lo para o destino e, em seguida, verificar o hash e juntar os fragmentos.
Você também pode configurar uma rede BitTorrent pessoal. Isso garantiria que tudo isso chegue com segurança.
fonte