rsync sigue desconectándose: tubería rota

14

Estoy usando rsyncpara hacer una copia de seguridad de mi directorio personal. Esto ha estado funcionando bien durante mucho tiempo ahora. Aquí está el comando que estoy usando:

rsync \
    -pavz \
    --delete \
    --exclude 'mnt/' \
    --exclude '.cache/' \
    --exclude 'Videos/' \
    --exclude 'Music/' \
    --exclude 'Documents/virtualbox' \
    /home/"${USER}" "${server}":"${dir}" 2>> "${errorFile}"

Sin embargo, cambié el servidor al que estoy haciendo una copia de seguridad y ahora se rsyncinicia y ejecuta durante unos segundos (hasta unos minutos), pero luego se detiene con el mensaje de error

packet_write_wait: Connection to x.x.x.x: Broken pipe
rsync: [sender] write error: Broken pipe (32)
rsync error: unexplained error (code 255) at io.c(820) [sender=3.1.1]

Como está funcionando en otros servidores, sospecho que el problema es la conexión o el servidor en sí. La conexión parece ser estable. Estoy conectado por cable y no veo interrupciones. También intenté hacer ping al servidor mientras hacía la copia de seguridad. El ping tiene una tasa de respuesta del 100% incluso cuando la copia de seguridad se está rompiendo.

Yo uso kerberospara autenticar en el servidor remoto.

Intenté varias combinaciones con ServerAliveInterval, ServerAliveCountMaxo ClientAliveIntervalen mi ~/.ssh/config, pero fue en vano.

Podría ser que hay algo ejecutándose en el servidor que mata el rsynccomando por alguna razón, pero no sé cómo investigar al respecto. ¿Algunas ideas?

pfnuesel
fuente
Tal vez debería agregar que uso kerberospara autenticar en el servidor remoto.
pfnuesel
Eso es potencialmente muy importante. Por favor, editar su pregunta para incluir esta información
roaima
En este servidor, ¿falla la llamada a rsync cada vez, o solo a veces? Además, si mide repetidamente el tiempo que lleva fallar, ¿aparece algún patrón? Estoy pensando en el tiempo de espera de autenticación Kerberos, o algo similar.
dhag
¿Ver un error io me hace preguntarme si el sistema de archivos del lado remoto se llenó?
Jeff Schaller
1
@rubynorails Interesante. Eso parece funcionar sin problemas.
pfnuesel

Respuestas:

6

Su problema podría ser (falta de) memoria. Cuando 1GB era grande para un servidor, rsync me fallaba para grandes conjuntos de datos. Quizás el algoritmo ha mejorado de las capacidades de memoria ha aumentado, pero no he visto ese problema en 8 años más o menos. Así que realmente, esta es una toma externa, pero vale la pena explorarla. Pruebe conjuntos de datos más pequeños primero. También puede intentar, como un formulario de verificación de cordura, hacer un tar-tar:

tar cf - $HOME | ssh ${server} tar xf -

Si eso también falla después de unos minutos, no es memoria.

Oteo
fuente
4

Me he encontrado con esto rsyncen el pasado también. La solución que lo arregló para mí fue ejecutarlo desde una screensesión, lo que ayudó a mantener la conexión con el servidor remoto.

screen -LS rsync
[execute your rsync command]
Ctrl-A+D to detach from the session

Puede verificar el estado ejecutando screen -x rsync(o lo que sea que decida nombrar la sesión si le da un nombre, que no es obligatorio). Esto volverá a adjuntar su shell actual a esa sesión. Solo recuerde desconectarse nuevamente después de haber verificado el estado para que siga ejecutándose en segundo plano.

También puede ejecutar el comando para ejecutar screenen segundo plano de una sola vez haciendo [alguien puede corregirme si estoy equivocado] screen -dm 'command'. Es posible que desee man screenantes de intentar ese último.

EDITAR:

Estoy editando mi respuesta porque has confirmado que screenno proporciona asistencia en este escenario, pero respondiste a mi comentario sugiriendo intentar scpver qué tipo de resultados obtienes, a lo que respondiste que, curiosamente, funcionó bien.

Entonces mi nueva respuesta es esta: use scp- o ssh(con tar) - en lugar dersync

Por supuesto, scpno soporta la gran cantidad de características como rsync, pero que en realidad se sorprendería al descubrir cómo muchas características que hace de soporte que son casi idénticas a la de rsync.

Escenarios del mundo real scpy otras alternativas para rsync:

Hace un tiempo, tuve la tarea de crear un script de shell que extrajera registros de nuestros servidores de producción y los almacenara localmente en un servidor web para que los desarrolladores pudieran acceder a ellos con el fin de solucionar problemas. Después de intentar sin éxito que el equipo de Unix se instale rsyncen nuestros servidores, se me ocurrió una solución alternativa scpque funcionó igual de bien.

Dicho esto, recientemente modifiqué el script para que todo lo que usa sea sshy tar- GNU tar/ gtar, para ser exactos. GNU es tarcompatible con muchas de las opciones que realmente encontrará rsync, tales como --include, --excludepreservación de permisos / atributos, compresión, etc.

La forma en que ahora lo logro es mediante sshel uso del servidor remoto (a través de pubkey auth) y el uso gtar -czf - [other options such as --include='*.log' and --exclude='*core*', etc.]: esto escribe toda la información en stdout, que luego se canaliza [localmente] para tar -xzfque no se realicen cambios en el servidor de producción remoto , y todos los archivos extraídos tal cual al servidor local. Es una gran alternativa para rsyncen este caso. Lo único importante, tarni el scpsoporte son las copias de seguridad incrementales y el nivel de verificación de errores a nivel de bloque que rsynccaracterísticas.

El comando completo al que me refiero cuando uso sshy tarsería algo como esto (remoto es Solaris 10; local es Debian, por lo que vale):

cd /var/www/remotelogs
ssh -C user@remotehost "cd /path/to/remote/app.directories; gtar -czf - --include='*.log' --exclude='*.pid' --exlude='*core*' *" | tar -xz

En su caso, sería todo lo contrario: tar -cf -localmente y canalizar a través de un servidor remoto ssh user@remotehost "tar -xf -": hay otra respuesta que hace referencia a este tipo de comportamiento pero que no entra en tantos detalles.

Hay algunas otras opciones que he incluido para acelerar las cosas. He cronometrado todo sin descanso para que el tiempo de ejecución sea lo más bajo posible. Pensaría que usar la compresión con tarsería inútil, pero en realidad acelera un poco las cosas, al igual que usar el -Cindicador con sshpara habilitar la sshcompresión también. Puedo actualizar esta publicación en una fecha posterior para incluir el comando exacto que uso (que es muy similar a lo que publiqué), pero no tengo ganas de entrar en VPN en este momento ya que estoy de vacaciones esta semana.

En Solaris 10, también lo uso -c blowfish, porque es el cifrado más rápido para autenticar y también ayuda a acelerar las cosas un poco, pero nuestro Solaris 11 no lo admite o tiene esta suite de cifrado desactivada.

Además, si elige ir con la opción ssh/ tar, en realidad sería una buena idea implementar mi solución original de usar screensi está haciendo una copia de seguridad que llevará un tiempo. De lo contrario, asegúrese de que la configuración de keepalive / timeout en su ssh_configesté ajustada a la perfección, o este método también puede causar una tubería rota.

Incluso si sigue adelante scp, siempre me parece una práctica recomendada para usar screeno tmuxcuando se realiza una operación de este tipo, por si acaso . Muchas veces no sigo mis propios consejos y no lo hago, pero de hecho es una buena práctica usar una de estas herramientas para garantizar que el trabajo remoto no se arruine debido a que su sesión de shell activa se desconecta de alguna manera.

Sé que quieres descubrir la causa raíz de tu rsyncproblema. Sin embargo, si esto es realmente importante, estas son dos grandes soluciones con las que puede experimentar mientras tanto.

rubynorails
fuente
1
Lo intenté con screen, el resultado es el mismo.
pfnuesel
@pfnuesel: al menos es bueno saber que puedes descartarlo.
rubynorails
3

Estaba teniendo el mismo problema en OSX El Capitan y lo solucioné actualizando a rsync v3.11. El problema me estaba sucediendo en v2.6.9.

Bruno
fuente
Estoy corriendo rsync 3.1.1.
pfnuesel
Es posible que desee verificar que su enrutador no tenga habilitada la protección contra inundación de paquetes (o cualquier protección similar). ¿Te estás conectando a través de algún tipo de VPN?
Bruno
Eso podría ser el problema. Lamentablemente, no tengo acceso a los dispositivos de red. Sin embargo, funciona bien en otros servidores, así que supongo que este servidor en particular tiene algún tipo de protección contra inundaciones de paquetes.
pfnuesel
2

Kerberos es solo para autenticación, eso no debería causar ningún problema después de haber creado una conexión exitosa.

¿Has intentado usar el demonio rsync también?

¿Están sus servidores en la misma red o tiene un firewall / enrutador entre ellos?

Puede intentar configurar una sesión de netcat entre los servidores, esa es una manera simple de intentarlo si tiene algún problema de conexión entre sus servidores.

En el primer servidor:

nc -lk <port-number>

Y en el cliente

nc <server> <port-number>

Puede dejar la conexión abierta y ver si la conexión la mantiene o si la pierde. También puede intentar escribir algo en el cliente, ver que termina en el otro lado.

tocado
fuente
Desafortunadamente, no tengo acceso de root en el servidor. Esto significa que no puedo ejecutar un demonio rsync o una sesión netcat.
pfnuesel
@pfnusel puede ejecutarse netcaten cualquier puerto> 1024 sin necesidad de privilegios de root
roaima
1

Tiene algo en el servidor remoto que escribe en stdout . Esto podría estar en su .profileo .bash_profile. Podría ser algo menos obvio como sttyo mesg. En caso de duda, copie una transcripción en su pregunta de iniciar sesión en el servidor (redacte el nombre de host por todos los medios).

roaima
fuente
No entiendo. Ni lo que está mal, ni lo que se supone que debo hacer para averiguar qué está escribiendo en stdout.
pfnuesel
@pfnuesel si copia la transcripción de su inicio de sesión y la publica aquí, alguien puede ver qué pasa. Mejor, publique su .profileo .bash_profilepara su revisión. Estás buscando cosas como mesgostty
roaima 25/11/2015
No hay mesg, o sttyen cualquiera de mis dotfiles.
pfnuesel
@pfnuesel ¿Algo más que escriba en el terminal durante el inicio de sesión?
roaima
No, pero incluso si agrego algo que escribe en stdout. No cambia nada.
pfnuesel
1

la única vez que tuve un problema como este con rsync, lo rastreé hasta un puerto ethernet de repuesto en otra máquina que tenía la misma dirección IP que mi servidor de destino. Si rsync es escamoso, es casi seguro que es un problema de confiabilidad de red o (en mi caso) de configuración.

Nathan Siemers
fuente
1

Encontré un problema similar al ejecutar rsynco manualmente (ya sea con cp, scpo en Gnome Nautilus) copiar grandes archivos de un escritorio Linux a un NAS Linux basado en ARM de baja potencia a través de una red cableada gigabit (no kerberosen mi configuración). Las unidades NAS se comparten usando samba, y se montan en el cliente usando cifs. La solución para mí fue montar el sistema de archivos NAS desde el cliente sin almacenamiento en caché (consulte también las páginas de manual de mount.cifs ):

sudo mount -t cifs //server.lan/somedir /mnt/somedir/ -o cache=none

Alternativamente, cuando se monta la unidad NAS en el cliente utilizando gvfsen nautiluseste problema no persistiría al copiar archivos de gran tamaño (pero que no funciona en combinación con rsyncembargo).

Hacer que Linux escriba en el sistema de archivos de la red simultáneamente con las lecturas de disco local explica en detalle por qué podría estar ocurriendo este problema.

davidovitch
fuente
0

Simplemente actualice sus versiones de rsync para asegurarse de que sean exactamente iguales en las PC de envío y de recepción. Vea mi respuesta aquí: /server/883487/unable-to-rsync-due-to-broken-pipe/988794#988794 .

Gabriel Staples
fuente
1
¿Por qué el voto negativo? Esto debería ser un comentario, no una respuesta, ¿tal vez? ¿Nadie? ¿Nadie?
Gabriel Staples
1
Ya no puedo reproducir el problema, ya que ya no tengo acceso a ese servidor. Pero es una respuesta razonable y no merece el voto negativo.
pfnuesel