¿Rsync --inplace escribe en todo el archivo o solo en las partes que necesitan actualizarse? (para copias de seguridad btrfs + rsync)

21

Estaba leyendo varias guías sobre cómo combinar instantáneas de btrfs con rsync para crear una solución de respaldo eficiente con historial. Sin embargo, todo depende de si rsync --inplacemodifica solo aquellas partes de los archivos que realmente cambiaron, o si sobrescribe todo el archivo secuencialmente. Si escribe todo el archivo, parece que btrfs siempre creará una nueva copia del archivo, lo que haría que la idea fuera mucho menos eficiente.

Petr Pudlák
fuente
¿Cómo sabría si puede evitar escribir en todo el archivo? ¿No es necesario leer primero todo el archivo para descubrir qué ha cambiado?
Mehrdad
2
@Mehrdad, sí, pero leer el conjunto no es un problema. Si rsynclee todo el archivo y luego busca y actualiza solo aquellas partes que son necesarias, btrfs copiará solo estos bloques actualizados. Pero si rsynclee y escribe todo el archivo, entonces será un problema.
Petr Pudlák 01 de
1
@Mehrdad rsyncno solo sabe que puede evitar escribir todo el archivo, sino que logra hacerlo sin copiarlo completamente en la red. Pequeño programa inteligente.
Gunther Piez

Respuestas:

31

Si pasa rsync dos rutas locales, se usará de forma predeterminada "--whole-file", y no delta-transfer. Entonces, lo que está buscando es "--no-full-file". También obtiene delta-transfer si solicitó '-c'.

Así es como puedes verificar:

$ mkdir a b
$ dd if=/dev/zero of=a/1 bs=1k count=64
$ dd if=/dev/zero of=a/2 bs=1k count=64
$ dd if=/dev/zero of=a/3 bs=1k count=64
$ rsync -av a/ b/
sending incremental file list
./
1
2
3

sent 196831 bytes  received 72 bytes  393806.00 bytes/sec
total size is 196608  speedup is 1.00

Luego toca un archivo y vuelve a sincronizar

$ touch a/1
$ rsync -av --inplace a/ b/
sending incremental file list
1

sent 65662 bytes  received 31 bytes  131386.00 bytes/sec
total size is 196608  speedup is 2.99

Puede verificar que reutilizó el inodo con "ls -li", pero observe que envió un total de 64K bytes. Intente nuevamente con --no-full-file

$ touch a/1
$ rsync -av --inplace --no-whole-file a/ b/
sending incremental file list
1

sent 494 bytes  received 595 bytes  2178.00 bytes/sec
total size is 196608  speedup is 180.54

Ahora solo has enviado 494 bytes. Puede usar strace para verificar si alguno de los archivos fue escrito, pero esto muestra que al menos usó delta-transfer.

Tenga en cuenta (vea los comentarios) que para los sistemas de archivos locales, --whole-filese supone (vea la página del manual para rsync). Por otro lado, --no-whole-filese supone que a través de una red , por --inplacesí solo se comportará como --inplace --no-whole-file.

sin datos
fuente
¿Por qué no --inplaceimplica --no-whole-file?
Geremia
¿No es --no-whole-filepredeterminado de todos modos?
Geremia
2
@Geremia no si ambos caminos son locales. Y mi ejemplo muestra que eso --inplaceno implica --no-whole-filela versión de rsync que estaba usando en 2013, pero puede repetir este experimento con su propia versión de rsync.
datos el
Bueno, inplaceno se trata de 'escanear en busca de bloques iguales / diferentes', se trata de sobrescribir el archivo existente de inmediato, desde el desplazamiento 0. (de lo contrario, se crea una copia temporal, y solo entonces se borra el archivo de destino anterior y se renombra la copia tempopary Probablemente se considere "más seguro" mantener el archivo antiguo el mayor tiempo posible, si el proceso se interrumpe. Por supuesto, esto es peor para el rendimiento, el consumo máximo de almacenamiento (piense en archivos grandes), posiblemente fragmentación ...) ...
Frank Nocke
1
Supongo que es al revés, --no-whole-filesiempre implica --inplace, de lo contrario, la mayor parte de su ganancia de rendimiento se habría ido. Sin embargo, no pude encontrar esto documentado ...
Frank Nocke
15

Aquí la respuesta definitiva, supongo, citando la parte correcta del manual:

   --inplace

          [...]

          This option is useful for transferring large files
          with  block-based  changes  or  appended data, and
          also on systems that are disk bound,  not  network
          bound.   It  can  also  help  keep a copy-on-write
                                               *************
          filesystem snapshot from diverging the entire con‐
          *******************
          tents of a file that only has minor changes.
fuujuhi
fuente
4

--inplacesobrescribe solo las regiones que han cambiado. Úselo siempre cuando escriba en Btrfs.

Gabriel
fuente
¿Y tiene alguna evidencia que muestre que no sobrescribe otras partes de los archivos?
Petr Pudlák
¿Se aplica lo mismo a ZFS?
ewwhite
@ewwhite: Dado que ZFS es COW (copia en escritura) como BTRFS, entonces sí.
Geremia
@ PetrPudlák -vvvmuestra que omite bloques coincidentes
Tom Hale
3

El algoritmo de transferencia delta de rsync trata de si se transmite todo el archivo o solo las partes que difieren. Este es el comportamiento predeterminado al sincronizar un archivo entre dos máquinas para ahorrar ancho de banda. Esto se puede anular con --whole-file(o -W) para forzar la rsynctransmisión de todo el archivo.

--inplacese ocupa de si rsync, durante la transferencia, creará un archivo temporal o no. El comportamiento predeterminado es crear un archivo temporal. Esto proporciona una medida de seguridad ya que si se interrumpe la transferencia, el archivo existente en la máquina de destino permanece intacto / intacto. --inplaceanula este comportamiento y le dice rsyncque actualice el archivo existente directamente. Con esto, corre el riesgo de tener un archivo inconsistente en la máquina de destino si se interrumpe la transferencia.

Mike T.
fuente
2

Desde la página del manual:

This  option  changes  how  rsync transfers a file when its data
needs to be updated: instead of the default method of creating a
new  copy  of  the file and moving it into place when it is com-
plete, rsync instead writes the updated  data  directly  to  the
destination file.

Esto me lleva a creer que escribe sobre el archivo en su totalidad: me imagino que sería casi imposible que rsync funcione de otra manera.

Laxsnor
fuente
2
Después de determinar qué partes necesitan actualización, podría buscar esas partes y actualizarlas, en lugar de escribir el archivo completo.
Petr Pudlák 01 de
0

El trabajo teórico sobre rsync in situ se describe en este documento. .

Referencia del trabajo: D. Rasch y R. Burns. In-Place Rsync: sincronización de archivos para dispositivos móviles e inalámbricos. Conferencia técnica anual de USENIX, pista FREENIX, 91-100, USENIX, 2003.

Desde el enlace:

... Modificamos la implementación rsync existente para apoyar la reconstrucción en el lugar.

Resumen: [...] hemos modificado rsync para que funcione en dispositivos con espacio limitado. Los archivos en el host de destino se actualizan en el mismo almacenamiento que ocupa la versión actual del archivo. Los dispositivos con espacio limitado no pueden usar rsync tradicional porque requiere memoria o almacenamiento tanto para la versión antigua como para la nueva del archivo. Los ejemplos incluyen la sincronización de archivos en teléfonos celulares y PC de mano, que tienen pequeños recuerdos. El algoritmo rsync in situ codifica la representación comprimida de un archivo en un gráfico, que luego se ordena topológicamente para lograr la propiedad in situ. [...]

Así que esto parece ser los detalles técnicos de lo que está haciendo rsync --inplace. Según el comienzo del artículo:

Hemos modificado rsync para que realice tareas de sincronización de archivos con reconstrucción in situ. [...] En lugar de utilizar el espacio temporal, los cambios en el archivo de destino tienen lugar en el espacio ya ocupado por la versión actual. Esta herramienta se puede utilizar para sincronizar dispositivos donde el espacio es limitado.

Como queda claro por la respuesta de @ dataless , esto implica que --inplaceestá usando el mismo espacio de almacenamiento, pero aún puede copiar todo el archivo en ese espacio. Específicamente, cuando se realizan copias desde / a sistemas de archivos locales, rsync asume la --whole-fileopción. Pero, por otro lado, cuando se trata de sistemas en red, asume la --no-whole-fileopción.

usuario92979
fuente
1
¿Cuál es la respuesta?
Xen2050
Mis disculpas. No estaba prestando suficiente atención. Con la respuesta de @ dataless, esto debería aclarar las cosas.
Diagon