Reanudar la transferencia de un solo archivo por rsync

52

En Ubuntu, quiero copiar un archivo grande de mi disco duro a un disco extraíble rsync. Por alguna otra razón, la operación no puede completarse en una sola ejecución. Así que estoy tratando de descubrir cómo usar rsyncpara reanudar la copia del archivo desde donde lo dejó la última vez.

He intentado usar la opción --partialo --inplace, pero junto con --progress, encontré rsynccon --partialo --inplacerealmente comienza desde el principio en lugar de lo que quedó la última vez. Parar manualmente rsynctemprano y verificar el tamaño del archivo recibido también confirmó lo que encontré.

Pero con --append, rsync comienza desde lo que quedó la última vez.

Estoy confundido como vi en la página del manual --partial , --inplacey --appendparecen relacionarse con la reanudación de la copia de lo que quedaba última vez. ¿Alguien puede explicar la diferencia? ¿Por qué no --partialo --inplacetrabajar para reanudar la copia? ¿Es cierto que para reanudar la copia, rsynctiene que funcionar con la --appendopción?

Además, si rsync dejó un archivo parcial mvo cpno, ¿ rsync --appendreanudará correctamente la copia del archivo?

Tim
fuente

Respuestas:

39

Para reanudar una copia interrumpida, debe usar rsync --append. De la explicación de la página del manual de --append:

Esto hace que rsync actualice un archivo agregando datos al final del archivo, lo que supone que los datos que ya existen en el lado receptor son idénticos al inicio del archivo en el lado emisor. [...] Implica --inplace, [...]

La opción --inplacehace rsync(sobre) escribir el contenido del archivo de destino directamente; sin --inplace , rsynclo haría:

  1. crear un nuevo archivo con un nombre temporal,
  2. copiar contenido actualizado en él,
  3. cámbielo por el archivo de destino y finalmente
  4. elimine la copia anterior del archivo de destino.

El modo normal de operación evita principalmente conflictos con aplicaciones que pueden tener abierto el archivo de destino, y algunos otros percances que están debidamente enumerados en la página de rsyncmanual.

Tenga en cuenta que, si una operación de copia / actualización falla en los pasos 1.-3. anterior, rsynceliminará el archivo de destino temporal; la --partial opción deshabilita este comportamiento y rsyncdejará archivos temporales parcialmente transferidos en el sistema de archivos de destino. Por lo tanto, reanudar una operación de copia de un solo archivo no ganará mucho a menos que llame al primero rsynccon --partialo --partial-dir(el mismo efecto que --partial, además, le indica rsync que cree todos los archivos temporales en un directorio específico).

Riccardo Murri
fuente
¡Gracias! Si mv o cp dejaron un archivo parcial, no rsync, ¿rsync --append reanudará correctamente la copia del archivo?
Tim
1
@Tim En resumen, --appendhace rsynccreer que, si dos archivos correspondientes tienen una longitud diferente, entonces el más corto es idéntico a la parte inicial del más largo. Entonces, sí, si comienza a copiar un archivo grande cpe interrumpe el proceso de copia, rsync --appendcopiará solo la parte restante del archivo. ( Nota: si cpse interrumpe un bloqueo del sistema, existe una pequeña posibilidad de que el contenido del archivo y los metadatos no estén sincronizados, es decir, el archivo está dañado. En este caso, la ejecución rsyncuna vez más sin --append solucionar el problema.)
Riccardo Murri
2
Entonces, si entiendo esto correctamente, ¿no hay forma de decirle a rsync que verifique un archivo parcial y reanude la transferencia a ese archivo parcialmente transferido ?
Winny
1
@Winny, muy tardíamente: para una copia local no hay una manera sensata de hacer esto. Para una copia de red, este es el modo predeterminado cuando especifica --partialsin --append.
roaima
1
@Winny --appendy --append-verifytiene un caso de falla peligrosa: cuando el archivo del receptor es del mismo tamaño o más grande pero tiene datos diferentes. Sugiero una solución basada en su--no-whole-file lugar.
Tom Hale
21

Tenga en cuenta que eso --appendimplica --inplace, lo que en sí mismo implica --partial.

  • Con solo usarlo --partial, debe rsyncdejar las transferencias parciales y reanudarlas en intentos posteriores.

  • Al usarlo --append, debe rsyncdejar ambos archivos parciales y reanudarlos la próxima vez. Después de la transferencia rsyncdebe verificar la suma de verificación de los datos transmitidos solamente

  • --append-verify incluye todo el archivo en la verificación de suma de verificación, incluida cualquier parte transferida en una transferencia anterior.

  • Con cualquiera --appendo con --append-verifyuna verificación de suma de verificación fallida, el archivo se retransmitirá completamente (usando --inplace)

Debería poder reanudar una operación mvu cpoperación, rsyncpero es posible que desee utilizar la --append-verifyopción para su tranquilidad.

Tenga en cuenta que el uso --appendcausa rsyncque solo se copien aquellos archivos que tienen un tamaño en el receptor más corto que el tamaño en el remitente (independientemente de las marcas de tiempo) o que están ausentes en el receptor. Por documentación sobre esta opción:

Si un archivo necesita ser transferido y su tamaño en el receptor es igual o mayor que el tamaño en el remitente, se omite el archivo.

Más información en la página del manual

TomG
fuente
--appendy --append-verifytiene un caso de falla peligrosa: cuando el archivo del receptor es del mismo tamaño o más grande pero tiene datos diferentes. Sugiero una solución basada en su--no-whole-file lugar.
Tom Hale
@TomHale la documentación sugiere que para que un archivo sea omitido necesitaría tener exactamente el mismo tamaño y tiempo de modificación en ambos extremos. Si esto es una preocupación plausible, entonces --checksumdebe usarse. No puedo encontrarlo especificado explícitamente, pero lógicamente cualquiera de las opciones para reanudar debería implicar --no-whole-fileporque --whole-filedebería ser incompatible.
TomG
--append-verifyomitirá archivos del mismo tamaño o de mayor tamaño con fechas diferentes , lo que puede ser "inesperado". No hay necesidad de --checksum todos los archivos, ya rsyncque de todos modos hará una suma de comprobación de archivo completo, pero solo en lo que transfiere.
Tom Hale
--checksumle indica rsynca la suma de comprobación los archivos antes del envío, lo que garantiza que todos los archivos modificados se transfieran, independientemente del tamaño / tiempo. ¿Tiene una fuente para el --append-verifycomportamiento inesperado ya que lo que describe no coincide con la documentación o mi experiencia (limitada)?
TomG
--append-verifyse refiere a lo --appendque dice: If a file needs to be transferred and its size on the receiver is the same or longer than the size on the sender, the file is skipped.Incluso si un archivo necesita ser transferido debido a --checksumello, aún puede omitirse.
Tom Hale
6

David Schwartz tiene razón, --partial(o mejor, -P) hace lo que quieres. Verifiqué esto en un archivo 37G que se detuvo ~ 8g en él, a través de una red. rsync escaneó rápidamente las primeras partes del parcial (mostrando el progreso a medida que avanzaba -P), y luego reanudó la transferencia al final del archivo parcial.

Steve Byrne
fuente
Una copia de red se trata de manera diferente a una copia local, que es el problema aquí.
roaima
@roaima ¿Tiene una fuente para eso o un documento que explique con más detalle cuáles son las diferencias? No lo encuentro en la página de manual (enorme).
Jonas Schäfer
@JonasWielicki, la página del manual lo alude en la --whole-filedescripción de la opción.
roaima
@roaima Muchas gracias! Esto también significa que la solución adecuada es --no-W(¡que realmente funciona!)
Jonas Schäfer
@JonasWielicki es extremadamente ineficiente, por lo que está deshabilitado de forma predeterminada. Realmente no desea utilizarlo a --no-Wmenos que comprenda exactamente qué configuración significa para los archivos locales. Ver unix.stackexchange.com/a/181018/100397
roaima
2

Lo estabas haciendo bien, --partialhace lo que quieres. Parece estar comenzando desde el principio porque siempre comienza al principio de la lista de fragmentos de datos de archivo que necesita copiar. La --appendopción es peligrosa y dará como resultado un archivo corrupto si los datos no coinciden por alguna razón.

David Schwartz
fuente
Las copias locales no se comparan, simplemente se sobrescriben (o --appendcontinúan desde el desplazamiento de bytes).
roaima
1

Por defecto, rsyncse habilitará --whole-filesi se transfiere del disco local al disco local. Esto reiniciará una transferencia interrumpida desde el principio, en lugar de verificar las partes que ya están allí.

Para deshabilitar esto, use:

--no-whole-file

La combinación de esto con --inplaceo --partialpermitirá reanudar la transferencia más tarde.

Mi alias para usar rsyncpara copiar es:

rscp='rsync -ax --inplace --sparse --no-whole-file --protect-args'

Advertencia : tenga cuidado de usarlo, --append-verifyya que omitirá cualquier archivo de destino que sea del mismo tamaño o más grande.

Tom Hale
fuente
Para las transferencias de red, rsynccompara los archivos de origen y de destino correspondientes antes de la transferencia para enviar solo aquellas partes que han cambiado (transferencia delta). --no-whole-filele dice rsyncque haga lo mismo para la copia local a local. La documentación no sugiere que tendría ningún efecto en la reanudación de transferencias parciales de archivos individuales. rsyncsaltará los archivos con exactamente el mismo tamaño y marcas de tiempo por diseño. Ni --append-verifytampoco --no-whole-filedebería cambiar ese comportamiento, pero --checksumdebería funcionar con cualquiera de ellos para su tranquilidad a costa del disco IO
TomG
--append-verifyomitirá archivos del mismo tamaño o de mayor tamaño con fechas diferentes , lo que puede ser "inesperado". No hay necesidad de --checksum todos los archivos, ya rsyncque de todos modos hará una suma de comprobación de archivo completo, pero solo en lo que transfiere.
Tom Hale