¿Rsync verifica los archivos copiados entre dos unidades locales?


65

Quiero hacer una nueva copia nueva de una gran cantidad de archivos de una unidad local a otra.

He leído que rsync hace una comparación de archivos de suma de comprobación cuando los envía a una máquina remota a través de una red.

  1. ¿Hará rsync la comparación al copiar los archivos entre dos unidades locales?

  2. Si hace una verificación, ¿es una apuesta segura? ¿O es mejor hacer una comparación byte por byte?

Respuestas:


77

rsync siempre usa sumas de verificación para verificar que un archivo se transfirió correctamente. Si el archivo de destino ya existe, rsync puede omitir la actualización del archivo si la hora y el tamaño de la modificación coinciden con el archivo de origen, pero si rsync decide que los datos deben transferirse, las sumas de verificación siempre se usan en los datos transferidos entre los procesos rsync de envío y recepción . Esto verifica que los datos recibidos son los mismos que los datos enviados con alta probabilidad, sin la pesada sobrecarga de una comparación de nivel de bytes a través de la red.

Una vez que se reciben los datos del archivo, rsync escribe los datos en el archivo y confía en que si el núcleo indica una escritura exitosa, los datos se escribieron sin daños en el disco. rsync no vuelve a leer los datos y se compara con la suma de verificación conocida como una verificación adicional.

En cuanto a la verificación en sí, para el protocolo 30 y más allá (admitido por primera vez en 3.0.0), rsync usa MD5 . Para protocolos más antiguos, la suma de comprobación utilizada es MD4 .

Si bien durante mucho tiempo se consideró obsoleto para los hashes criptográficos seguros, MD5 y MD4 siguen siendo adecuados para verificar la corrupción de archivos.

Fuente: la página man y mirando el código fuente rsync para verificar.


3
Odio reventar la burbuja de todos, ¡pero rsync solo verifica la verificación de la suma si se agrega la bandera -c!

27
@clint No, la respuesta es correcta. De la explicación de la página del manual de la -cbandera: "Tenga en cuenta que rsync siempre verifica que cada archivo transferido fue reconstruido correctamente en el lado receptor al verificar una suma de verificación de todo el archivo que se genera a medida que se transfiere el archivo, pero que después de la transferencia la verificación no tiene nada que ver con esta opción antes de la transferencia "¿Es necesario actualizar este archivo?"
Michael Mrozek

77
Esta respuesta no deja en claro si realmente verifica el archivo después de una copia. Si la suma de verificación se calcula a medida que se recibe el archivo, entonces no es una suma de verificación posterior a la copia y no puede estar seguro de que el archivo esté escrito correctamente. Entonces necesitaría realizar una comparación adicional.
Andre Miller

77
Votación negativa porque no me gusta el hecho de que esta respuesta está bien escrita y es técnicamente correcta y, al mismo tiempo, está tan fuera de tema que engaña a los lectores. El problema es que la respuesta entra en gran detalle sobre lo que sucede durante la transferencia, mientras que el interlocutor declara específicamente que le importan las copias locales y no las transferencias de red. Estoy bastante seguro de que Kyle Jones no quería engañar a nadie, pero esta respuesta (en mi humilde opinión) sí.
ndemou

44
Kyle, no creo que tu respuesta sea incorrecta. Ya noté que es "detallado, bien escrito y técnicamente correcto", pero requiere que el lector esté innecesariamente enfocado y cuidadoso. ¿Por qué cubrir la falta de verificación de los datos del disco que se cuestiona a la mitad de su respuesta después de 117 palabras que describen repetidamente otro proceso de verificación irrelevante? De todos modos, gracias por su tiempo e interés en esta discusión. Sinceramente lo aprecio
ndemou

40

rsyncno no hacer la verificación posterior a la copia de la copia de archivos locales. Puede verificar que no es así rsyncal copiar un archivo grande en una unidad lenta (es decir, USB) y luego copiar el mismo archivo con cp, es decir:

time rsync bigfile /mnt/usb/bigfile

time cp bigfile /mnt/usb/bigfile

Ambos comandos toman aproximadamente la misma cantidad de tiempo, por rsynclo tanto, no es posible que estén haciendo la suma de verificación, ya que eso implicaría volver a leer el archivo de destino del disco lento.

La manpágina lamentablemente es engañosa sobre esto. También verifiqué esto con: una vez que stracela copia está completa, rsyncno emite read()llamadas en el archivo de destino, por lo que no puede ser suma de verificación. Una más que puedes verificar es con algo como iotop: ves rsynchaciendo lectura y escritura simultáneamente (copiando desde el origen al destino), luego sale. Si se verificara la integridad, habría una fase de solo lectura.


1
"La página del manual es, por desgracia, engañosa acerca de esto. También verifiqué esto con strace" ¿Se estranguló el proceso rsync remoto o local o el local? Hay dos ... uno se ejecuta en el destino, incluso cuando usa ssh.
user129070

8
No hay verificación posterior a la copia para ninguna copia, local o remota. Corres de rsync -cnuevo si quieres forzarlo a verificar.
psusi

La verificación se realiza en la transmisión entrante a medida que avanza. No es necesario volver a leerlo desde el disco si el sistema de archivos ha confirmado que se ha escrito.
Deja de dañar a Monica el

17

rsyncrealiza una comparación de suma de comprobación antes de copiar (en algunos casos), para evitar copiar lo que ya está allí. El objetivo de la comparación de la suma de verificación no es verificar que la copia haya sido exitosa. Ese es el trabajo de la infraestructura subyacente: los controladores del sistema de archivos, los controladores de disco, los controladores de red, etc. Las aplicaciones individuales como las rsyncque no necesitan molestarse con esta locura. Todo lo que rsyncdebe hacer (¡y lo hace!) Es verificar los valores de retorno de las llamadas al sistema para asegurarse de que no haya ningún error.


1
Esto parece contradecir la respuesta aceptada ...
djule5

2
@ djule5 ¿De qué manera? La respuesta aceptada parece ser principalmente sobre cómo rsync comprueba los archivos transferidos , pero la pregunta y mi respuesta son sobre copias locales .
Gilles 'SO- deja de ser malvado'

3
Ok, bueno, en ese contexto, estoy de acuerdo, tiene más sentido. Entonces, "El objetivo de la comparación de la suma de verificación no es verificar que la copia haya sido exitosa" solo es cierto para las copias locales ; y "las sumas de verificación siempre se usan en los datos transferidos entre los procesos rsync de envío y de recepción" solo se aplican a las copias transferidas . Encuentro que la respuesta aceptada es engañosa con respecto a la pregunta y creo que su respuesta debería ser la aceptada (solo mis 2 centavos).
djule5

Todavía siento que esta respuesta es un poco engañosa. Por ejemplo, dice que los controladores de red en particular verifican si la copia fue exitosa, pero si dijiste que la comparación de suma de verificación no verifica si la copia fue exitosa solo para locales, los controladores de red no entrarían en juego.
Ken

1
@ Ken No entiendo el punto que estás tratando de hacer. Sospecho que leíste mal algo. Los controladores de red entran en juego solo si hay una copia de red. Rsync hace una comparación de suma de comprobación antes de hacer cualquier copia, para decidir si copiar. Rsync no realiza ninguna comparación de suma de comprobación después de copiar (porque no tendría sentido: sabe lo que acaba de copiar).
Gilles 'SO- deja de ser malvado'

4

Respuestas rápidas y sucias, directamente a las preguntas.

P: ¿Hará rsyncla comparación al copiar los archivos entre dos unidades locales? R: Hará una comparación para descubrir qué copiar.

P: Si hace una verificación, ¿es una apuesta segura? ¿O es mejor hacer una comparación byte por byte? A: tan seguro como las matemáticas detrás de la suma de comprobación MD5 del archivo. Puede intentar hacer un experimento simple para aprender y confiar en la herramienta.

Respuesta larga: supongo que querías rsynchacer una comparación de archivos (poco a poco o por suma de verificación) después de copiar los archivos. Si usted es uno de los pocos que valora la integridad de los datos, puede encontrar útil lo siguiente:

rsync -avh [source] [destination] && rsync -avhc [source] [destination] 

la rsynccarpeta de archivos de código anterior en la primera ejecución y, si se completa sin problemas, se ejecutará rsyncnuevamente inmediatamente mientras se realiza la comparación del mismo nombre de archivo utilizando el hash de todo el archivo.


1

Usando rsync para verificar la integridad de un duplicado

Para garantizar que esta prueba vuelva a leer físicamente los archivos de los medios de la unidad, sugiero apagar ambas unidades y reiniciarlas antes de ejecutar esta prueba. Esto eliminará sus cachés volátiles internos.

Si no también reinicia Linux, al menos debe soltar los cachés ( * ) con:

sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

Luego, para volver a leer ambos árboles y comparar sus sumas de verificación:

rsync --dry-run --checksum --itemize-changes --archive SRC DEST

La suma de comprobación rsync moderna usa MD5, que es de 128 bits. La probabilidad de que esto no detecte un error en un archivo individual es astronómicamente baja (alguna discusión aquí ), pero no imposible.



Buena suerte con los cortes finales correctos.
nobar

La ausencia de malas noticias son buenas noticias.
nobar

No te molestes --checksumhasta que la prueba haya pasado sin ella.
nobar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.