Diferencia de sincronización entre las opciones --checksum y --ignore-times

96

¿Alguien puede aclarar las diferencias entre las opciones --checksumy --ignore-timesde rsync?

Mi entendimiento es el siguiente:

--checksum
Si el tamaño del archivo y el tiempo coinciden, hará una suma de comprobación en ambos extremos para ver si los archivos son realmente idénticos.

--ignore-times
'Transferir' cada archivo, independientemente de si el tiempo de archivo es el mismo en ambos extremos. Como seguirá utilizando el algoritmo de transferencia delta, si un archivo es realmente idéntico, no se transfiere nada.

Esa es la diferencia técnica, pero que yo sepa, son semánticamente lo mismo.

Entonces, lo que me pregunto es:

  • ¿Cuál es la diferencia práctica entre las dos opciones?
  • ¿En qué casos usarías uno en lugar del otro?
  • ¿Hay alguna diferencia de rendimiento entre ellos?
Andy Madge
fuente

Respuestas:

100

Normalmente, rsyncomite archivos cuando los archivos tienen tamaños y tiempos idénticos en los lados de origen y destino. Esta es una heurística que generalmente es una buena idea, ya que evita rsynctener que examinar el contenido de los archivos que probablemente sean idénticos en los lados de origen y destino.

--ignore-timesle indica rsyncque desactive la heurística de tiempos y tamaños de archivo y, por lo tanto, transfiera incondicionalmente TODOS los archivos del origen al destino. rsyncluego procederá a leer cada archivo en el lado de origen, ya que necesitará usar su algoritmo de transferencia delta, o simplemente enviar cada archivo en su totalidad, dependiendo de si --whole-filese especificó la opción.

--checksumtambién modifica la heurística de tiempos y tamaños de archivo, pero aquí ignora los tiempos y examina solo los tamaños. Los archivos en los lados de origen y destino que difieren en tamaño se transfieren, ya que obviamente son diferentes. Los archivos con el mismo tamaño tienen una suma de verificación (con MD5 en la rsyncversión 3.0.0+, o con MD4 en versiones anteriores), y los que tienen sumas diferentes también se transfieren.

En los casos en que los lados de origen y destino son en su mayoría iguales, la --checksummayoría de los archivos se sumará a ambos lados. Esto podría llevar mucho tiempo, pero el resultado es que el mínimo mínimo de datos se transferirá realmente a través del cable, especialmente si se utiliza el algoritmo de transferencia delta. Por supuesto, esto es solo una victoria si tiene redes muy lentas y / o CPU muy rápida.

--ignore-times, por otro lado, enviará más datos a través de la red y hará que se lean todos los archivos de origen, pero al menos no impondrá la carga adicional de calcular muchos hashsums criptográficamente fuertes en las CPU de origen y destino. Esperaría que esta opción funcione mejor que --checksumcuando sus redes son rápidas y / o su CPU relativamente lenta.

Creo que solo lo usaría --checksumo --ignore-timessi estuviera transfiriendo archivos a un destino donde se sospechaba que el contenido de algunos archivos estaba dañado, pero cuyos tiempos de modificación no cambiaron. Realmente no puedo pensar en ninguna otra buena razón para usar cualquiera de las opciones, aunque probablemente haya otros casos de uso.

Steven Monday
fuente
12
He encontrado --checksumútil junto con --itemize-changespara verificar las copias de seguridad. De vez en cuando, mis scripts de respaldo ejecutan una comparación completa de esta manera después de que se completan las actualizaciones diarias / semanales actuales. Recibo un correo electrónico marcado como urgente si --itemize-changesmuestra algo inesperado, así que sé que hay un problema potencial que debería investigar.
David Spillett
10
--checksum es útil cuando se trabaja en Git y se cambia entre sucursales con archivos modificados, lo que cambia los tiempos de actualización en los archivos que no tiene la intención de enviar desde una sucursal en particular.
FriendlyDev
66
--ignore-timesy especialmente --checksumson necesarios si uno de sus "archivos" es un contenedor de archivos Truecrypt ya que, por defecto, la marca de tiempo del archivo no se actualiza. Vea productforums.google.com/forum/#!topic/drive/gnmDp3UXEgs y ask-leo.com/why_wont_my_truecrypt_volume_backup.html
Marcus Junius Brutus el
Nota: hice un experimento rápido, y ctime no se compara, solo mtime. En Mac, al menos. Esto puede ser útil para saber. Es por eso que tengo tantos problemas con los sistemas de archivos de Windows, que informan el mismo tiempo (ctime) para atime, mtime y ctime.
Edward Falk
¿La --checksumsuma de comprobación solo incluye los nombres de los archivos de origen en la máquina de destino o todos los archivos en el directorio de destino?
Greg
17

La suma de comprobación también es útil si ha estado utilizando otro sistema para sincronizar archivos, que no ha conservado las marcas de tiempo. La suma de comprobación solo transferirá archivos que son diferentes Y actualizará todas las marcas de tiempo en el extremo receptor para que coincidan

Paulus
fuente
4

Un detalle: la opción de suma de verificación verifica un archivo completo en un extremo, luego todo el archivo en el otro extremo. Si sus archivos son algo grandes, este tipo de paralelismo mata el paralelismo.

Además, si tiene archivos enormes, es más probable que se quede sin tiempo de espera --checksum, ya que no lo hace -I.

Francois
fuente
2

En info rsynclo que respecta a la --checksumopción: "Dado que esta suma de comprobación de todo el archivo de todos los archivos en ambos lados de la conexión se produce además de las verificaciones de suma de comprobación automática que se producen durante la transferencia de un archivo, esta opción puede ser bastante lenta".

LeoB
fuente
1
Esa frase no parece estar en mis páginas de manual ... entonces, ¿eso implica que la opción de suma de verificación usará sumas de verificación para identificar si los archivos son idénticos, y si no lo son, se transferirá, generando sumas de verificación nuevamente como parte de la transferencia? La opción --ignore-times simplemente omite el cheque y asume que han cambiado. Por lo tanto, en cuanto al rendimiento, ¿ignorar los tiempos es una mejor manera de lograr lo mismo? Todavía estoy luchando por ver por qué hay 2 opciones diferentes (además del hecho de que --checksum es más transparente)
Andy Madge
Debería consultar la última edición de documentación: gitweb.samba.org/…
Aleksandr Levchuk
2

La --ignore-timesopción probablemente dará como resultado que todos los archivos estén codificados en delta y el algoritmo de transferencia delta (codificación delta) sea al menos tan lento como la suma de comprobación.

No sé si rsync --ignore-timeses lo suficientemente inteligente como para evitar la "verificación automática después de la transferencia" en el caso frecuente en que la transferencia delta no hará que se transfiera nada.

Para --ignore-times:

  • En caso de que rsync no sea inteligente (o no confíe en la codificación delta), la verificación (suma de comprobación y codificación) se realizará dos veces.
  • También podría darse el caso de que la codificación delta sea mucho más lenta que la suma de comprobación MD4 de 128 bits.

Tanto --checksumy --ignore-timesserá "muy lenta", pero --ignore-timeses probable que incluso más lento (debido a las posibilidades anteriores 2).

Buena pregunta: publique si encuentra diferencias de rendimiento en la práctica.

Aleksandr Levchuk
fuente
Veo a que te refieres. Haré algunas pruebas y volveré a publicar.
Andy Madge