Come correggere l'errore di pacchetto danneggiato con rsync per file (relativamente) di grandi dimensioni?


10

Tentativo di aggiornare i file su un server, con il rsynccomando:

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

corrupt packet gli errori continuano a essere generati, in particolare:

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]

Ciò è probabilmente correlato a un sshtimeout, come sembra accadere con file di grandi dimensioni (r). Inoltre, continuo a ricevere timeout utilizzando WinSCP. Questo sta accadendo solo a me; molte delle persone con cui lavoro che usano questo server non hanno lo stesso problema.

Utilizzo rsyncda un terminale Cygwin in Windows 7, contro un server Centos 6.3.

Non sono sicuro di quali altre informazioni possano essere utili o come ottenerle. Aggiornerò la domanda o aggiungerò commenti secondo qualsiasi suggerimento.

Come dovrei risolverlo?

Grazie mille!

Risposte:


12

Non sono sicuro di ciò che potrebbe causare il corrupt packetproblema che interrompe la connessione, ma potresti trovare utili rsync --partialo --partial-diropzioni utili durante il trasferimento di file di grandi dimensioni in modo che quando riavvii il trasferimento continui da dove era stato interrotto il trasferimento invece di ricominciare da capo trasferendo il file intero di nuovo:

--partial-dir = .rsync-parziale

Quindi puoi modificare il tuo comando originale in questo modo:

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

Nota che per questo esempio ho rimosso l' opzione -q( --quiet) e ho aggiunto l' --progressopzione nel primo esempio e --partial-dir=.rsync-partialnel secondo esempio.

La differenza tra --partiale --partial-dir=.rsync-partialè che in seguito crea una directory che mantiene i file parziali separati dai file trasferiti completamente se questo è importante per te sul lato ricevente (server).

La manpage rsync spiegherà questo in modo più dettagliato, anche se sottolineerò anche un'importante nota di sicurezza dalla manpage:

IMPORTANTE: --partial-dir non deve essere scrivibile da altri utenti o è un rischio per la sicurezza. Ad esempio, EVITARE "/ tmp".


Ho provato entrambe le opzioni e non ho risolto il problema. Grazie per il suggerimento, però.
Juan Carlos Coto,

1

La corruzione suggerisce un driver NIC o NIC errato nella macchina; ce l'avevo una volta sulla scatola di Windows di mia moglie: ho dovuto provare più volte a installare rsync. Una volta che ciò è riuscito, ho potuto invocare ripetutamente rsync per trasferire e correggere l'altro software necessario, che includeva in particolare i driver NIC aggiornati e uno strumento di checksum.


0

Se il valore ulimit è 0 o un piccolo numero, dovrebbe dare quell'errore. Prova ad aumentare il valore ulimit (such as 9999999999)e riprova. puoi scrivere un piccolo script di shell (a.sh)e usare qualcosa del genere:

#!/bin/sh
ulimit 99999999999

rsync -avrz --perms --delete --chmod=u+rwx,g+rx,o+x /dir1/ /dir2/

1
Interessante. Non ci sto lavorando da un po 'di tempo; tuttavia, se desideri spiegare perché funziona, penso che sarebbe davvero utile per chiunque legga questa domanda. Grazie!
Juan Carlos Coto,

-1

basta loop fino a quando non si trasferisce finalmente

while ! sshpass -p 'xxxx' rsync --partial --append-verify --progress -a -e 'ssh -p 22' /source/ remoteuser@1.1.1.1:/dest/; do sleep 5;done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.