¿Cómo reparar el error de paquete corrupto con rsync para archivos (relativamente) grandes?

10

Intentando actualizar archivos en un servidor, con el rsynccomando:

rsync -ravq -e "ssh -o ConnectTimeout=2 -o ServerAliveInterval=2 -ServerAliveCountMax=2" --delete ./local_dir user@$SERVER:/dest_dir

corrupt packet los errores siguen apareciendo, específicamente:

rsync: writefd_unbuffered failed to write 4092 bytes to socket [sender]: Broken pipe (32)
rsync: connection unexpectedly closed (11337 bytes received so far) [sender]
rsync error: unexplained error (code 255) at /home/lapo/package/rsync-3.0.9-1/src/rsync-3.0.9/io.c(605) [sender=3.0.9]

Esto probablemente esté relacionado con un sshtiempo de espera, ya que parece suceder con archivos grandes (r). Además, sigo obteniendo tiempos de espera usando WinSCP. Esto me está pasando solo a mí; Varias de las personas con las que trabajo que usan este servidor no tienen el mismo problema.

Utilizando rsyncdesde un terminal Cygwin en Windows 7, contra un servidor Centos 6.3.

No estoy seguro de qué otra información podría ser útil o cómo obtenerla. Actualizaré la pregunta o agregaré comentarios según cualquier sugerencia.

¿Cómo debería resolver esto?

¡Muchas gracias!

Juan Carlos Coto
fuente

Respuestas:

12

No estoy seguro de qué podría causar el corrupt packetproblema que desconecta su conexión, pero es posible que encuentre rsync --partialu --partial-diropción útil al transferir archivos grandes, de modo que cuando reinicie la transferencia continuará donde la transferencia se detuvo en lugar de tener que comenzar de nuevo a transferir archivo completo de nuevo:

- dir-parcial = .rsync-parcial

Para que pueda modificar su comando original de esta manera:

rsync -rav --progress --partial -e "ssh -o ConnectTimeout=2 -o ServerAliveInterval=2 -ServerAliveCountMax=2" --delete ./local_dir user@$SERVER:/dest_dir

o

rsync -rav --progress --partial-dir=.rsync-partial -e "ssh -o ConnectTimeout=2 -o ServerAliveInterval=2 -ServerAliveCountMax=2" --delete ./local_dir user@$SERVER:/dest_dir

Tenga en cuenta que para este ejemplo eliminé la opción -q( --quiet) y agregué la --progressopción en el primer ejemplo y --partial-dir=.rsync-partialen el segundo ejemplo.

La diferencia entre --partialy --partial-dir=.rsync-partiales que el último crea un directorio que mantiene los archivos parciales separados de los archivos completamente transferidos si eso es importante para usted en el lado receptor (servidor).

La página de manual de rsync explicará esto con más detalle, aunque también señalaré una nota de seguridad importante de la página de manual:

IMPORTANTE: el directorio parcial no debe ser escrito por otros usuarios o es un riesgo de seguridad. Por ejemplo, EVITE "/ tmp".

aculich
fuente
Probé ambas opciones y ninguna solucionó el problema. Gracias por la pista, sin embargo.
Juan Carlos Coto
1

La corrupción sugiere un controlador NIC o NIC incorrecto en su máquina; tuve esto una vez en el cuadro de Windows de mi esposa: tuve que intentar repetidamente instalar rsync. Una vez que tuvo éxito, pude invocar repetidamente rsync para transferir y corregir el otro software necesario, que incluía principalmente controladores NIC actualizados y una herramienta de suma de verificación.

Phil P
fuente
0

Si el valor ulimit es 0 o un pequeño número, debería estar dando ese error. Intente aumentar el valor de ulimit (such as 9999999999)e intente nuevamente. puedes escribir un pequeño script de shell (a.sh)y usar algo como esto:

#!/bin/sh
ulimit 99999999999

rsync -avrz --perms --delete --chmod=u+rwx,g+rx,o+x /dir1/ /dir2/
COA
fuente
1
Eso es interesante. No he estado trabajando en esto por un tiempo; sin embargo, si desea explicar por qué funciona, creo que sería realmente útil para quien lea esta pregunta. ¡Gracias!
Juan Carlos Coto
-1

simplemente bucle hasta que se transfiera finalmente

while ! sshpass -p 'xxxx' rsync --partial --append-verify --progress -a -e 'ssh -p 22' /source/ [email protected]:/dest/; do sleep 5;done
Kit de herramientas
fuente