¿Cómo puedo verificar que un archivo de 1TB se transfirió correctamente?

25

Con frecuencia transfiero imágenes de VM de hipervisores a un servidor de archivo para el almacenamiento a largo plazo.

Transfiero usando netcat ya que es más rápido que scp, rsync, ect ..

hypervisor$ cat foo.box | nc <archive IP> 1234

archive$ nc -l -p 1234 > foo.box

Cuando el archivo ha terminado de transferirse, verifico que no hubo corrupción al ejecutar md5sumtanto en el destino como en la fuente.

Desafortunadamente, ejecutar un md5sum en un archivo grande puede llevar mucho tiempo. ¿Cómo puedo comparar más rápidamente la integridad de dos archivos grandes?

Actualizar:

  • Mi transmisión rara vez se interrumpe, por lo que la capacidad de reinicio no es un problema.
  • Por lo general, tarda de 3 a 4 horas en transferirse a través de NC y luego 40 minutos para obtener el md5sum.
  • La seguridad del hash no es un problema en este caso.
tbenz9
fuente
2
Puede probar una suma de comprobación diferente: en.wikipedia.org/wiki/Checksum . Sin embargo
tumchaaditya
¿Cuánto dura la transferencia real y cuánto tarda el md5sum?
Keith Thompson el
La transferencia generalmente demora entre 3 y 4 horas, y los md5sums tardan aproximadamente 40 minutos en computarse.
tbenz9

Respuestas:

18

Puede usar tee para hacer la suma sobre la marcha con algo como esto (adapte los comandos netcat a sus necesidades):

Servidor:

netcat -l -w 2 1111 | tee >( md5sum > /dev/stderr )

Cliente:

tee >( md5sum > /dev/stderr ) | netcat 127.0.0.1 1111
nerdwaller
fuente
1
Solo un pensamiento: md5deeptiene un modo "fragmento" ( md5deep.sourceforge.net/md5deep.html ) que puede ser útil para esto.
LawrenceC
@ultrasawblade: ese es un enlace increíble, tendré que comprobarlo para otros fines. Gracias por mencionarlo!
nerdwaller
10

La respuesta de Nerdwaller sobre el uso teepara transferir y calcular simultáneamente una suma de verificación es un buen enfoque si está principalmente preocupado por la corrupción en la red. Sin embargo, no lo protegerá contra la corrupción en el camino al disco, etc., ya que toma la suma de comprobación antes de que llegue al disco.

Pero me gustaría agregar algo:

1 TiB / 40 minutos ≈ 437 MiB / seg 1 .

Eso es bastante rápido, en realidad. Recuerde que a menos que tenga mucha RAM, eso tiene que volver del almacenamiento. Entonces, lo primero que debe verificar es observar iostat -kx 10mientras ejecuta sus sumas de verificación; en particular quieres prestar atención a la %utilcolumna. Si está vinculando los discos (cerca del 100%), la respuesta es comprar un almacenamiento más rápido.

De lo contrario, como se mencionó en otros carteles, puede probar diferentes algoritmos de suma de verificación. MD4, MD5 y SHA-1 están diseñados para ser hashes criptográficos (aunque ninguno de ellos debe usarse para ese fin; todos se consideran demasiado débiles). En cuanto a la velocidad, puede compararlos con openssl speed md4 md5 sha1 sha256. He lanzado SHA256 para tener al menos un hash lo suficientemente fuerte.

The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md4              61716.74k   195224.79k   455472.73k   695089.49k   820035.58k
md5              46317.99k   140508.39k   320853.42k   473215.66k   539563.35k
sha1             43397.21k   126598.91k   283775.15k   392279.04k   473153.54k
sha256           33677.99k    75638.81k   128904.87k   155874.91k   167774.89k

De lo anterior, puede ver que MD4 es el más rápido y SHA256 el más lento. Este resultado es típico en hardware similar a una PC, al menos.

Si desea aún más rendimiento (a costa de ser trivial para manipular, y también es menos probable que detecte la corrupción), desea ver un hash CRC o Adler. De los dos, Adler suele ser más rápido, pero más débil. Desafortunadamente, no conozco ninguna implementación de línea de comando realmente rápida; Los programas en mi sistema son todos más lentos que el md4 de OpenSSL.

Por lo tanto, su mejor apuesta en cuanto a velocidad es openssl md4 -r( -rlo que hace que se vea como salida md5sum)

Si está dispuesto a hacer una compilación y / o programación mínima, vea el código de Mark Adler en Stack Overflow y también xxhash . Si tiene SSE 4.2, no podrá superar la velocidad de la instrucción CRC de hardware.


1 1 TiB = 1024⁴ bytes; 1 MiB = 1024² bytes. Viene a ≈417MB / seg con potencias de 1000 unidades.

derobert
fuente
Es rápido, estoy copiando de una gran matriz RAID a una segunda gran matriz RAID.
tbenz9
@ tbenz9 pensé, ¡de ninguna manera es un solo disco! He agregado algunos punteros a algunos hashes realmente rápidos, que desafortunadamente requerirán al menos compilarlos ... Pero seguramente se ejecutarán tan rápido como sus discos (o incluso su RAM) puedan proporcionar los datos. (Y si te estás preguntando acerca de Mark Adler v. Adler32, sí, parece ser el creador de Adler32)
derobert
@derobert, en lugar de usar archivos pequeños para probar, ¿no deberías haberlo probado con un archivo grande como 1TB?
Pacerier
@derobert, ¿por qué no usas en su shasumlugar?
Pacerier
@Pacerier que es el resultado del benchmark incorporado de OpenSSL. Sin duda con bloques más largos, será un poco más rápido, pero es poco probable que cambie la clasificación (fue consistente en todos los tamaños que probó). ¿Shasum tiene una implementación más rápida que OpenSSL? Aunque honestamente hoy en día si quieres un hash criptográfico rápido, usarías BLAKE2.
derobert
9

El opensslcomando admite varios resúmenes de mensajes. De los que pude probar, md4parece ejecutarse en aproximadamente el 65% del tiempo md5y aproximadamente el 54% del tiempo sha1(para el archivo con el que probé).

También hay un md2en la documentación, pero parece dar los mismos resultados que md5.

En términos generales, la velocidad parece estar inversamente relacionada con la calidad, pero dado que (probablemente) no le preocupa que un adversario cree una colisión deliberada, eso no debería ser un gran problema.

Es posible que busque resúmenes de mensajes más antiguos y simples (¿hubo un md1, por ejemplo)?

Un punto menor: tienes un uso inútil decat . Más bien que:

cat foo.box | nc <archive IP> 1234

puedes usar:

nc <archive IP> 1234 < foo.box

o incluso:

< foo.box nc <archive IP> 1234

Hacerlo ahorra un proceso, pero probablemente no tendrá ningún efecto significativo en el rendimiento.

Keith Thompson
fuente
1
Gracias por el consejo sobre gato, no relacionado con la pregunta, pero un consejo útil, no obstante. ¡Aclamaciones!
tbenz9
@ tbenz9: el código legible es más fácil de depurar, mantener y cambiar. "Inútil cat", por lo tanto, no es necesariamente del todo malo. Si no hay aumento de rendimiento al evitarlo, entonces es mejor ir con lo que sea que le resulte más cómodo, suponiendo que será el encargado de mantener este código.
iconoclasta
1
@Keith, Link down ..
Pacerier
4

Dos opciones:

Utilizar sha1sum

sha1sum foo.box

En algunas circunstancias, sha1sum es más rápido .


Utilizar rsync

La transferencia llevará más tiempo, pero rsync verifica que el archivo llegó intacto.

Desde la página de manual de rsync

Tenga en cuenta que rsync siempre verifica que cada archivo transferido se haya reconstruido correctamente en el lado receptor al verificar una suma de comprobación de todo el archivo que se genera a medida que se transfiere el archivo ...

Spuder
fuente
1
Gracias por el consejo sobre sha1sum, rsync tarda más de 10 horas en transferirse, puedo transferir el mismo archivo y ejecutar md5sums en aproximadamente 4 horas usando nc y md5sum. Estoy tratando de bajar mis 4 horas aún más.
tbenz9
3

La ciencia está progresando. Parece que la nueva función hash BLAKE2 es más rápida que MD5 (y criptográficamente mucho más fuerte para arrancar).

Referencia: https://leastauthority.com/blog/BLAKE2-harder-better-faster-stronger-than-MD5.html

De las diapositivas de Zooko:

ciclos por byte en la función Intel Core i5-3210M (Ivy Bridge) 
ciclos por byte
mensaje largo 4096 B 64 B MD5 5.0 5.2 13.1 SHA1 4.7 4.8 13.7 SHA256 12.8 13.0 30.0 Keccak 8.2 8.5 26.0 BLAKE1 5.8 6.0 14.9 BLAKE2 3.5 3.5 9.3
Nínive
fuente
2

Probablemente no puedas hacer nada mejor que un buen hash. Es posible que desee comprobar otras funciones hash / checksum para ver si alguna es significativamente más rápida que md5sum. Tenga en cuenta que es posible que no necesite algo tan fuerte como MD5. MD5 (y cosas como SHA1) están diseñadas para ser criptográficamente fuertes, por lo que no es factible que un atacante / impostor cree un nuevo archivo que tenga el mismo valor hash que un valor existente (es decir, dificultar la manipulación de e firmado -mails y otros documentos). Si no le preocupa un ataque a sus comunicaciones, pero solo un error de comunicación común, algo como una verificación de redundancia cíclica (CRC) podría ser lo suficientemente bueno. (Pero no sé si sería más rápido).

Otro enfoque es intentar hacer el hash en paralelo con la transferencia. Esto podría reducir el tiempo total, y definitivamente podría reducir el factor de irritación de la necesidad de esperar a que termine la transferencia y luego esperar nuevamente a que termine el MD5. No he probado esto, pero debería ser posible hacer algo como esto:

  • En la máquina fuente:

    mkfifo myfifo
    tee myfifo < archivo_origen | nc dest_host  número_puerto y md5sum myfifo
    
  • En la máquina de destino:

    mkfifo myfifo
    nc -l -p número_puerto | tee myfifo> dest_file & md5sum myfifo
    

Por supuesto, verificar el tamaño de los archivos es una forma buena y rápida de detectar si se eliminó algún byte.

Scott
fuente
2

Enviar archivos enormes es una molestia. ¿Por qué no intentar fragmentar los archivos generando un hash para cada fragmento y luego enviarlo al destino y luego verificar el hash y unir los fragmentos?

También puede configurar una red personal de BitTorrent. Eso aseguraría que todo llegue a salvo.

Gaurav Joseph
fuente
Según tengo entendido, dado que es una fuente y un destino, una red BitTorrent no sería beneficiosa. ¿Eso no se beneficia solo cuando va a muchos destinos de muchas fuentes?
tbenz9
Pensé en sugerir este enfoque (dividir el archivo de entrada en fragmentos, enviarlos por separado y volver a ensamblarlos en el otro extremo) y no pude encontrar la manera de hacerlo neutral en cuanto al rendimiento, y mucho menos una mejora. Todavía tiene la misma cantidad de tiempo de transferencia de red, pero tiene muchos más gastos generales en cada extremo. Esto esencialmente implica copiar el archivo desde la máquina fuente a la máquina fuente , luego copiarlo a la máquina de destino y luego copiarlo desde la máquina de destino a la máquina de destino . Incluso con grandes discos RAM, esto no es gratis.
Scott
1
El único beneficio de este enfoque es la reiniciabilidad, incluida la recuperación más rápida de una falla de transmisión. El OP no dijo con qué frecuencia tiene fallas, y no indicó que esto era algo que quería optimizar.
Scott
@ tben9 Bittorrent es la herramienta de elección actual para la transferencia única de archivos. Tener la información hash con el archivo significa que el cliente final puede verificar los datos descargados y corregirlos si es necesario. Las múltiples fuentes son para la velocidad. Entonces, sí, en este caso es beneficioso usar BT para garantizar que un archivo se transfiera correctamente.
Underverse