¿Se puede reanudar rsync después de ser interrumpido?


188

Solía rsynccopiar una gran cantidad de archivos, pero mi sistema operativo (Ubuntu) se reinició inesperadamente.

Después de reiniciar, volví a ejecutar rsync, pero desde la salida en el terminal, descubrí que rsynctodavía copiaba los que ya había copiado antes. Pero escuché que rsynces capaz de encontrar diferencias entre el origen y el destino y, por lo tanto, simplemente copiar las diferencias. Entonces, me pregunto en mi caso si rsyncpuedo reanudar lo que quedó la última vez.


Sí, rsync no volverá a copiar archivos que ya se han copiado. Hay algunos casos extremos donde su detección puede fallar. ¿Copió todos los archivos ya copiados? ¿Qué opciones usaste? ¿Cuáles fueron los sistemas de archivos de origen y destino? Si ejecuta rsync nuevamente después de haber copiado todo, ¿se copia nuevamente?
Gilles

@Gilles: ¡Gracias! (1) Creo que vi que rsync volvió a copiar los mismos archivos desde su salida en el terminal. (2) Las opciones son las mismas que en mi otra publicación, es decir sudo rsync -azvv /home/path/folder1/ /home/path/folder2. (3) La fuente y el destino son ambos NTFS, la fuente de compra es un HDD externo y el objetivo es un HDD interno. (3) Ahora se está ejecutando y aún no ha terminado.
Tim

También existe el indicador parcial para reanudar archivos parcialmente transferidos (útil para archivos grandes)
jwbensley

3
@Tim En la parte superior de mi cabeza, hay al menos un sesgo de reloj y diferencias en la resolución de tiempo (un problema común con los sistemas de archivos FAT que almacenan tiempos en incrementos de 2 segundos, la --modify-windowopción ayuda con eso).
Gilles

1
si no tuviste / o /. al final del argumento de la ruta de origen del archivo, se realizará una copia adicional en un subdirectorio que tenga el mismo nombre que el directorio de origen
Skaperen

Respuestas:


285

En primer lugar, con respecto a la parte de "reanudar" de su pregunta, --partialsolo le dice al destinatario que mantenga los archivos transferidos parcialmente si el envío desaparece como si se hubieran transferido por completo.

Al transferir archivos, se guardan temporalmente como archivos ocultos en sus carpetas de destino (por ejemplo .TheFileYouAreSending.lRWzDC), o en una carpeta elegida específicamente si configura el --partial-dirinterruptor. Cuando una transferencia falla y --partialno se establece, este archivo oculto permanecerá en la carpeta de destino con este nombre críptico, pero si --partialse establece, el archivo cambiará de nombre al nombre de archivo de destino real (en este caso TheFileYouAreSending), aunque el archivo no está completo El punto es que luego puede completar la transferencia ejecutando rsync nuevamente con --appendo --append-verify.

Por lo tanto, --partialno significa en sí reanudar una transferencia fallida o cancelada. Para reanudarlo, tendrá que usar una de las banderas mencionadas en la próxima ejecución. Por lo tanto, si necesita asegurarse de que el destino nunca contendrá archivos que parecen estar bien pero que en realidad están incompletos, no debe usarlos --partial. Por el contrario, si desea asegurarse de que nunca deja atrás archivos perdidos perdidos que están ocultos en el directorio de destino, y sabe que podrá completar la transferencia más tarde, --partialestá ahí para ayudarlo.

Con respecto al --appendconmutador mencionado anteriormente, este es el conmutador "reanudar" real, y puede usarlo ya sea que lo esté utilizando o no --partial. En realidad, cuando está usando --append, nunca se crean archivos temporales. Los archivos se escriben directamente en sus objetivos. A este respecto, --appendda el mismo resultado que --partialen una transferencia fallida, pero sin crear esos archivos temporales ocultos.

En resumen, si está moviendo archivos grandes y desea la opción de reanudar una operación rsync cancelada o fallida desde el punto exacto que se rsyncdetuvo, debe usar --appendo --append-verifyactivar el siguiente intento.

Como @Alex señala a continuación, ya que la versión 3.0.0 rsyncahora tiene una nueva opción --append-verify, que se comporta como lo --appendhizo antes de que existiera ese cambio. Probablemente siempre desee el comportamiento de --append-verify, así que verifique su versión con rsync --version. Si está en una Mac y no usa rsyncdesde homebrew, tendrá (al menos hasta El Capitán incluido) una versión anterior y deberá usarla en --appendlugar de hacerlo --append-verify. Por qué no mantuvieron el comportamiento --appendy nombraron al recién llegado --append-no-verifyes un poco desconcertante. De cualquier manera, --appenden rsyncantes de la versión 3 es la misma que --append-verifyen las versiones más recientes.

--append-verifyno es peligroso: siempre leerá y comparará los datos en ambos extremos y no solo asumirá que son iguales. Hace esto usando sumas de verificación, por lo que es fácil en la red, pero requiere leer la cantidad compartida de datos en ambos extremos del cable antes de que pueda reanudar la transferencia agregando al objetivo.

En segundo lugar, dijo que "escuchó que rsync puede encontrar diferencias entre el origen y el destino y, por lo tanto, simplemente copiar las diferencias".

Eso es correcto, y se llama transferencia delta, pero es algo diferente. Para habilitar esto, agregue -co --checksumcambie. Una vez que se usa este interruptor, rsync examinará los archivos que existen en ambos extremos del cable. Lo hace en fragmentos, compara las sumas de verificación en ambos extremos y, si difieren, transfiere solo las diferentes partes del archivo. Pero, como señala @Jonathan a continuación, la comparación solo se realiza cuando los archivos tienen el mismo tamaño en ambos extremos: los diferentes tamaños harán que rsync cargue todo el archivo, sobrescribiendo el destino con el mismo nombre.

Esto requiere un poco de cómputo en ambos extremos inicialmente, pero puede ser extremadamente eficiente para reducir la carga de la red si, por ejemplo, con frecuencia realiza copias de seguridad de archivos muy grandes de tamaño fijo que a menudo contienen cambios menores. Los ejemplos que vienen a la mente son los archivos de imagen de disco duro virtual utilizados en máquinas virtuales u objetivos iSCSI.

Es notable que si utiliza --checksumpara transferir un lote de archivos que son completamente nuevos en el sistema de destino, rsync seguirá calculando sus sumas de comprobación en el sistema de origen antes de transferirlas. Por qué no lo sé :)

Entonces, en resumen:

Si a menudo usa rsync para simplemente "mover cosas de A a B" y desea la opción de cancelar esa operación y luego reanudarla, no la use --checksum, pero sí la use --append-verify.

Si usas rsync para hacer copias de seguridad de cosas a menudo, usar --append-verifyprobablemente no hará mucho por ti, a menos que tengas la costumbre de enviar archivos grandes que crecen continuamente pero que rara vez se modifican una vez escritos. Como consejo adicional, si realiza una copia de seguridad en un almacenamiento que admite instantáneas como btrfso zfs, agregar el --inplaceinterruptor lo ayudará a reducir el tamaño de las instantáneas ya que los archivos modificados no se recrean, sino que los bloques modificados se escriben directamente sobre los antiguos. Este modificador también es útil si desea evitar que rsync cree copias de archivos en el destino cuando solo se hayan producido cambios menores.

Cuando se usa --append-verify, rsync se comportará como siempre en todos los archivos del mismo tamaño. Si difieren en la modificación u otras marcas de tiempo, sobrescribirá el destino con la fuente sin examinar más a fondo esos archivos. --checksumcomparará el contenido (sumas de verificación) de cada par de archivos de nombre y tamaño idénticos.

ACTUALIZADO 2015-09-01 Cambiado para reflejar los puntos hechos por @Alex (¡gracias!)

ACTUALIZADO 2017-07-14 Cambiado para reflejar los puntos hechos por @Jonathan (¡gracias!)


44
Esto dice que --partiales suficiente.
Cees Timmerman


2
@CMCDragonkai En realidad, --partial-dirmira la respuesta de Alexander a continuación sobre : parece que es la bala perfecta para esto. Puede que me haya perdido algo por completo;)
DanielSmedegaardBuus

2
@DanielSmedegaardBuus Lo probé yo mismo en una conexión lenta, y esto es lo que veo solo con --partial: rsync copia el archivo en el nombre temporal, la conexión se interrumpe, el rsync remoto eventualmente mueve ese archivo al nombre normal y se cierra, luego Al volver a ejecutarse con --partialy sin --append , el nuevo archivo temporal se inicializa con una copia del archivo remoto parcialmente transferido, luego la copia continúa desde donde se cortó la conexión. (Ubuntu 14.04 / rsync 3.1)
Izkata

44
¿Cuál es su nivel de confianza en el comportamiento descrito --checksum? De acuerdo con manesto, tiene más que ver con decidir qué archivos marcar para la transferencia que con delta-transfer (que, presumiblemente, es rsyncel comportamiento predeterminado).
Jonathan Y.

56

TL; DR:

Simplemente especifique un directorio parcial como lo recomiendan las páginas de manual de rsync:

--partial-dir=.rsync-partial

Explicación más larga:

En realidad, hay una función incorporada para hacer esto usando la --partial-diropción, que tiene varias ventajas sobre la --partialy --append-verify/ --appendalternativa.

Extracto de las páginas del manual de rsync:

--partial-dir=DIR
      A  better way to keep partial files than the --partial option is
      to specify a DIR that will be used  to  hold  the  partial  data
      (instead  of  writing  it  out to the destination file).  On the
      next transfer, rsync will use a file found in this dir  as  data
      to  speed  up  the resumption of the transfer and then delete it
      after it has served its purpose.

      Note that if --whole-file is specified (or  implied),  any  par-
      tial-dir  file  that  is  found for a file that is being updated
      will simply be removed (since rsync  is  sending  files  without
      using rsync's delta-transfer algorithm).

      Rsync will create the DIR if it is missing (just the last dir --
      not the whole path).  This makes it easy to use a relative  path
      (such  as  "--partial-dir=.rsync-partial")  to have rsync create
      the partial-directory in the destination file's  directory  when
      needed,  and  then  remove  it  again  when  the partial file is
      deleted.

      If the partial-dir value is not an absolute path, rsync will add
      an  exclude rule at the end of all your existing excludes.  This
      will prevent the sending of any partial-dir files that may exist
      on the sending side, and will also prevent the untimely deletion
      of partial-dir items on the receiving  side.   An  example:  the
      above  --partial-dir  option would add the equivalent of "-f '-p
      .rsync-partial/'" at the end of any other filter rules.

De forma predeterminada, rsync usa un nombre de archivo temporal aleatorio que se elimina cuando falla una transferencia. Como se mencionó, el uso --partialpuede hacer que rsync mantenga el archivo incompleto como si se hubiera transferido con éxito , para que luego sea posible agregarlo usando las opciones --append-verify/ --append. Sin embargo, hay varias razones por las cuales esto es subóptimo.

  1. Es posible que sus archivos de copia de seguridad no estén completos y, sin verificar el archivo remoto que aún debe estar inalterado, no hay forma de saberlo.

  2. Si está intentando usar --backupy --backup-dir, acaba de agregar una nueva versión de este archivo que nunca antes había salido de su historial de versiones.

Sin embargo, si usamos --partial-dir, rsync preservará el archivo parcial temporal y reanudará la descarga usando ese archivo parcial la próxima vez que lo ejecute, y no sufriremos los problemas anteriores.


38

Es posible que desee agregar la -Popción a su comando.

De la manpágina:

--partial By default, rsync will delete any partially transferred file if the transfer
         is interrupted. In some circumstances it is more desirable to keep partially
         transferred files. Using the --partial option tells rsync to keep the partial
         file which should make a subsequent transfer of the rest of the file much faster.

  -P     The -P option is equivalent to --partial --progress.   Its  pur-
         pose  is to make it much easier to specify these two options for
         a long transfer that may be interrupted.

Entonces en lugar de:

sudo rsync -azvv /home/path/folder1/ /home/path/folder2

Hacer:

sudo rsync -azvvP /home/path/folder1/ /home/path/folder2

Por supuesto, si no desea las actualizaciones de progreso, simplemente puede usar --partial, es decir:

sudo rsync --partial -azvv /home/path/folder1/ /home/path/folder2

@Flimm no del todo correcto. Si hay una interrupción (en la red o en el lado receptor), cuando se usa --partial, el archivo parcial se mantiene Y se usa cuando se reanuda rsync. Desde la página de manual: "El uso de la opción --partial le dice a rsync que mantenga el archivo parcial que debería <b> hacer una transferencia posterior del resto del archivo mucho más rápido </b>".
Gaoithe

2
@Flimm y @gaoithe, mi respuesta no fue muy precisa, y definitivamente no estaba actualizada. Lo actualicé para reflejar la versión 3+ de rsync. Sin embargo, es importante destacar que --partialno se reanuda una transferencia fallida. Ver mi respuesta para más detalles :)
DanielSmedegaardBuus

2
@DanielSmedegaardBuus Lo probé y -Pes suficiente en mi caso. Versiones: el cliente tiene 3.1.0 y el servidor tiene 3.1.1. Interrumpí la transferencia de un solo archivo grande con ctrl-c. Supongo que me estoy perdiendo algo.
guettli

¿Por qué vv? es decir, vusado 2 veces?
mrgloom

¿Dónde rsync guardar parte del archivo -azvvP?
mrgloom

1

Creo que está llamando a la fuerza rsyncy, por lo tanto, todos los datos se descargan cuando los recupera nuevamente. use la --progressopción para copiar solo aquellos archivos que no se copian y la --deleteopción para eliminar cualquier archivo si ya se copió y ahora no existe en la carpeta de origen ...

rsync -avz --progress --delete -e  /home/path/folder1/ /home/path/folder2

Si está utilizando ssh para iniciar sesión en otro sistema y copiar los archivos,

rsync -avz --progress --delete -e "ssh -o UserKnownHostsFile=/dev/null -o \
StrictHostKeyChecking=no" /home/path/folder1/ /home/path/folder2

avíseme si hay algún error en mi comprensión de este concepto ...


1
¿Puede editar su respuesta y explicar qué hace su llamada ssh especial y por qué aconseja hacerlo?
Fabien

2
@Fabien Le dice a rsync que establezca dos opciones de ssh (rsync usa ssh para conectarse). El segundo le dice a ssh que no solicite confirmación si el host al que se está conectando aún no se conoce (al existir en el archivo "hosts conocidos"). El primero le dice a ssh que no use el archivo de hosts conocido predeterminado (que sería ~ / .ssh / known_hosts). En su lugar, utiliza / dev / null, que por supuesto siempre está vacío, y como ssh no encontraría el host allí, normalmente solicitaría confirmación, de ahí la opción dos. Al conectarse, ssh escribe el host ahora conocido en / dev / null, olvidándolo efectivamente al instante :)
DanielSmedegaardBuus

1
... pero probablemente se preguntaba qué efecto, si es que tiene alguno, tiene en la operación rsync. La respuesta es ninguna. Solo sirve para no tener el host al que se está conectando agregado a su archivo de hosts conocidos SSH. Quizás es un administrador de sistemas que a menudo se conecta a una gran cantidad de nuevos servidores, sistemas temporales o cualquier otra cosa. No lo sé :)
DanielSmedegaardBuus

44
"use la opción --progress para copiar solo aquellos archivos que no se copian" ¿Qué?
moi

1
Hay un par de errores aquí; uno es muy serio: --deleteeliminará archivos en el destino que no existen en la fuente. La menos grave es que --progressno modifica la forma en que se copian las cosas; solo le da un informe de progreso en cada archivo a medida que se copia. (Solucioné el error grave; lo reemplacé con --remove-source-files.)
Paul d'Aoust

1

Estoy usando este simple script. Siéntase libre de ajustar ciertas banderas y / o paramterizarlo.

#!/bin/bash

while [ 1 ]
do
    rsync -avz --partial [source] [dest]:
    if [ "$?" = "0" ] ; then
        echo "rsync completed normally"
        exit
    else
        echo "Rsync failure. Backing off and retrying..."
        sleep 180
    fi
done

1

Llegué tarde a esto, pero tenía la misma pregunta y encontré una respuesta diferente.

La --partialmarca ("mantener archivos parcialmente transferidos" en rsync -h) es útil para archivos grandes, como es --append("agregar datos en archivos más cortos"), pero la pregunta es sobre una gran cantidad de archivos.

Para evitar los archivos que ya se han copiado, use -u(o --update: "omita los archivos que son más nuevos en el receptor").

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.