Parchea un archivo binario muy grande a través de una conexión lenta

Parchea un archivo binario muy grande a través de una conexión lenta

Para fines de copia de seguridad, transfirí un archivo binario muy grande a través de una conexión lenta ascendente comparable (la transferencia tomó 2 semanas), sincronizándolo en un recurso compartido cifs montado (para poder acceder a él en bloques). Después de 2 semanas, rsync mostró un error (desafortunadamente no pude guardarlo) pero el tamaño del archivo coincidía.

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

coinciden, por lo que el principio y el final del archivo son idénticos.

Dado que mi flujo descendente es mucho más rápido, descargué la imagen completa nuevamente e hice sumas md5 en todo el asunto, y NO coinciden. Entonces, aparentemente, en algún lugar de esos 1,5 TB hay al menos un bit que difiere.

¿Hay alguna manera de generar un "parche" a partir de los dos archivos que descargué y luego aplicarlo en el archivo remoto, de modo que solo se tengan que transferir nuevamente los bloques incorrectos?

Tenga en cuenta nuevamente: NO tengo el poder para ejecutar código de forma remota ni hacer uso de las capacidades de rsync que requieren ejecutar rsync de forma remota. Supongo que aún podría usar rsync y funciona en el orden de magnitud de mi velocidad de descarga, pero me pregunto si hay una mejor manera de aprovechar el hecho de que tengo ambas versiones localmente. Probablemente no sería tan difícil escribir algo, pero preferiría usar algo probado y guardar el trabajo.

Respuesta1

(asumiendo Linux) si cree que solo hay un bloque de datos dañado, pero el tamaño del bloque no cambió, entonces puede usar cmp -l. Compara byte por byte y -lproporciona la compensación de cualquier diferencia. Si tiene una idea vaga de por dónde empezar dentro de los archivos, puede comenzar con -i. Cuando tenga las compensaciones por error, puede utilizarlas dd skip=...para recortarlas del archivo original y dd seek=... conv=notruncpegarlas en el archivo roto. (Pruebe primero en la copia)

Respuesta2

Usaría BitTorrent para recuperar el archivo en el lado remoto. El protocolo divide un archivo en pequeños bloques y vuelve a descargar automáticamente los bloques cuyos hashes no coinciden con el archivo semilla.

Para que funcione en un entorno privado:

  1. Deshabilite DHT en los clientes bit-torrent locales y remotos.
  2. Abra puertos bit-torrent locales en el firewall o configure el reenvío de puertos SSH.
  3. Cree un archivo semilla en el lado fuente. No utilice un rastreador. Asegúrese de que el cliente también comience a inicializar el archivo.
  4. Haga una copia de seguridad del archivo en el lado remoto.
  5. Copie el archivo semilla en el lado remoto y ábralo con el cliente.
  6. Señale la ubicación de descarga al archivo dañado y elija la opción parano iniciar la descarga!! También deshabilite las opciones para conectarse a DHT, intercambio de pares, etc., si están disponibles.
  7. Pídale al cliente que vuelva a verificar el archivo descargado. Debería informar un porcentaje de descarga que está casi completa.
  8. Agregue el cliente local como par a la descarga
  9. Iniciar la descarga

información relacionada