rsync continua a disconnettersi: tubo rotto


14

Sto usando rsyncper fare il backup della mia home directory. Funziona bene da molto tempo ormai. Ecco il comando che sto usando:

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

Tuttavia, ho cambiato il server su cui sto eseguendo il backup e ora si rsyncavvia e funziona per alcuni secondi (fino a pochi minuti), ma poi si interrompe con il messaggio di errore

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]

Dal momento che funziona su altri server, sospetto che il problema sia la connessione o il server stesso. La connessione sembra essere stabile. Sono collegato via cavo e non vedo alcuna interruzione. Ho anche provato a eseguire il ping del server mentre eseguivo il backup. Il ping ha un tasso di risposta del 100% anche quando il backup si sta rompendo.

Uso kerberosper autenticarmi sul server remoto.

Ho provato diverse combinazioni con ServerAliveInterval, ServerAliveCountMaxo ClientAliveIntervalnel mio ~/.ssh/config, ma senza risultati.

Potrebbe esserci qualcosa in esecuzione sul server che uccide il rsynccomando per qualche motivo, ma non so come investigare in questo. Qualche idea?


Forse dovrei aggiungere che utilizzo kerberosper l'autenticazione sul server remoto.
pfnuesel,

Questo è potenzialmente molto importante. Si prega di modificare la tua domanda per includere queste informazioni
roaima

Su questo server, la chiamata a rsync fallisce ogni volta o solo qualche volta? Inoltre, se si misura ripetutamente il tempo necessario per fallire, compaiono degli schemi? Sto pensando al timeout dell'autenticazione Kerberos o a qualcosa di simile.
Dhag,

vedere un errore io mi fa chiedere se il filesystem del lato remoto si sia riempito?
Jeff Schaller

1
@rubynorails Interessante. Sembra funzionare senza problemi.
pfnuesel,

Risposte:


6

Il tuo problema potrebbe essere (mancanza di) memoria. Ai tempi in cui 1 GB era grande per un server, rsync falliva con me per set di dati di grandi dimensioni. Forse l'algoritmo è migliorato delle capacità di memoria è aumentato, ma non vedo questo problema da circa 8 anni. Quindi davvero, questo è uno scatto esterno, ma vale la pena esplorare. Prova prima set di dati più piccoli. Potresti anche provare - come modulo per il controllo della sanità mentale - a fare un tar-tar:

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

Se anche dopo qualche minuto fallisce, non è memoria.


4

L'ho riscontrato anche rsyncin passato. La soluzione che lo ha riparato per me era eseguirlo da una screensessione, che era in grado di aiutare a mantenere la connessione al server remoto.

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

Puoi controllare lo stato eseguendo screen -x rsync(o qualunque cosa tu decida di nominare la sessione se le dai un nome, che non è richiesto). Questo ricollegherà la tua shell corrente a quella sessione. Ricorda di staccarti di nuovo dopo aver verificato lo stato in modo che continui a funzionare in background.

Puoi anche eseguire il comando per eseguire screenin background in un colpo solo facendo [qualcuno per favore correggimi se sbaglio] screen -dm 'command'. Potresti voler man screenprima di provare l'ultimo.

MODIFICARE:

Sto modificando la mia risposta perché hai confermato che screennon fornisce assistenza in questo scenario, ma hai risposto al mio commento suggerendo di provare a scpvedere che tipo di risultati ottieni, a cui hai risposto che stranamente, ha funzionato bene.

Quindi la mia nuova risposta è questa: usa scp- o ssh(con tar) - invece dirsync

Certo, scpnon supporta il vasto numero di caratteristiche come rsync, ma si sarebbe in realtà essere sorpresi di scoprire quanto molte caratteristiche che si fa supporto che sono quasi identiche a quella di rsync.

Scenari del mondo reale per scpe altre alternative a rsync:

Qualche tempo fa, mi è stato assegnato il compito di creare uno script di shell che estraesse i log dai nostri server di produzione e li memorizzasse localmente su un server Web in modo che gli sviluppatori potessero accedervi per scopi di risoluzione dei problemi. Dopo aver tentato senza successo di far installare rsyncil team Unix sui nostri server, ho escogitato una soluzione utilizzando anche scpquello funzionante.

Detto questo, ho recentemente modificato lo script in modo che tutto ciò che usa sia sshe tar- GNU tar/ gtar, per essere esatti. GNU tarsupporta molte delle opzioni che troverai in realtà rsync, come --include, --excludeconservazione di autorizzazioni / attributi, compressione, ecc.

Il modo in cui ora sshcompio questo è accedendo al server remoto (tramite pubkey auth) e usando gtar -czf - [other options such as --include='*.log' and --exclude='*core*', etc.]- questo scrive tutte le informazioni su stdout, che viene poi reindirizzato [localmente] in tar -xzfmodo che non vengano apportate modifiche sul server di produzione remoto e tutti i file estratti così come sono sul server locale. È un'ottima alternativa a rsyncin questo caso. L'unica cosa importante tarné il scpsupporto né i backup incrementali e il livello di errore a livello di blocco che controlla tali rsyncfunzionalità.

Il comando completo a cui mi riferisco quando uso sshe tarsarebbe qualcosa di simile (il telecomando è Solaris 10; locale è Debian, per quello che 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

Nel tuo scenario, sarebbe l'opposto - tar -cf -localmente, e inoltra a un server remoto tramite ssh user@remotehost "tar -xf -"- c'è un'altra risposta che fa riferimento a questo tipo di comportamento ma non entra nei dettagli.

Ci sono alcune altre opzioni che ho incluso per accelerare le cose. Ho cronometrato tutto incessantemente per ridurre al minimo il tempo di esecuzione. Penseresti che usare la compressione con tarsarebbe inutile, ma in realtà accelera un po 'le cose, così come usare il -Cflag con sshper abilitare anche la sshcompressione. Potrei aggiornare questo post in un secondo momento per includere il comando esatto che utilizzo (che è molto simile a quello che ho pubblicato), ma al momento non ho voglia di accedere alla VPN da quando sono in vacanza questa settimana.

Su Solaris 10, lo uso anche -c blowfishperché è la cifra più veloce con cui autenticarsi e aiuta anche ad accelerare un po 'le cose, ma il nostro Solaris 11 non lo supporta o ha disabilitato questa suite di cifratura.

Inoltre, se si sceglie di utilizzare l' opzione ssh/ tar, in realtà sarebbe una buona idea implementare la mia soluzione originale di utilizzo screense si sta eseguendo un backup che richiederà del tempo. In caso contrario, assicurati che le tue impostazioni keepalive / timeout nel tuo ssh_configsiano ottimizzate, altrimenti questo metodo sarà molto probabilmente causa di un tubo rotto.

Anche se ci vai scp, trovo sempre che sia una buona pratica da usare screeno tmuxquando eseguo un'operazione di questo tipo, per ogni evenienza . Molte volte non seguo il mio consiglio e non riesco a farlo, ma è davvero una buona pratica utilizzare uno di questi strumenti per garantire che il lavoro remoto non si rovini a causa della disconnessione della sessione di shell attiva in qualche modo.

So che vuoi capire la causa principale del tuo rsyncproblema. Tuttavia, se questo è davvero importante, queste sono due grandi soluzioni alternative che puoi sperimentare nel frattempo.


1
L'ho provato con screen, il risultato è lo stesso.
pfnuesel,

@pfnuesel - almeno è bene sapere che puoi escluderlo.
rubynorails,

3

Stavo avendo lo stesso problema su OSX El Capitan e risolto aggiornando a rsync v3.11. Il problema si stava verificando per me su v2.6.9.


Sto correndo rsync 3.1.1.
pfnuesel,

Potresti voler controllare che il tuo router non abbia la protezione da allagamenti di pacchetti (o protezione simile) abilitata. Ti stai collegando tramite qualsiasi tipo di VPN?
Bruno,

Questo potrebbe essere il problema. Sfortunatamente, non ho accesso ai dispositivi di rete. Funziona bene su altri server, tuttavia, quindi suppongo che questo particolare server abbia una sorta di protezione contro l'inondazione di pacchetti.
pfnuesel,

2

Kerberos è solo per l'autenticazione, che non dovrebbe causare problemi dopo aver creato una connessione corretta.

Hai provato a usare anche il demone rsync?

I tuoi server sono sulla stessa rete o hai un firewall / router tra?

Potresti provare a configurare una sessione netcat tra i server, questo è un modo semplice per provare se hai problemi di connessione tra i tuoi server.

Sul primo server:

nc -lk <port-number>

E sul cliente

nc <server> <port-number>

È possibile lasciare la connessione aperta e vedere se la connessione la mantiene o se si perde la connessione. Puoi anche provare a scrivere qualcosa sul client, vedi che finisce dall'altra parte.


Sfortunatamente, non ho accesso come root sul server. Questo significa che non posso eseguire un demone rsync o una sessione netcat.
pfnuesel,

@pfnusel è possibile eseguire netcatsu qualsiasi porta> 1024 senza i privilegi di root
roaima

1

Hai qualcosa sul server remoto che scrive su stdout . Questo potrebbe essere nel tuo .profileo .bash_profile. Potrebbe essere qualcosa di meno ovvio come sttyo mesg. In caso di dubbi, copia una trascrizione nella tua domanda di accesso al server (riduci il nome host con tutti i mezzi).


Non capisco. Né cosa non va, né cosa dovrei fare per scoprire cosa sta scrivendo su stdout.
pfnuesel,

@pfnuesel se copi la trascrizione del tuo accesso e la pubblichi qui, qualcuno potrebbe vedere che succede. Meglio, pubblica il tuo .profileo .bash_profileper la revisione. Stai cercando cose come mesgostty
roaima,

Non c'è mesgo sttyin nessuno dei miei dotfile.
pfnuesel,

@pfnuesel qualcos'altro che scrive sul terminale durante il login?
roaima,

No, ma anche se aggiungo qualcosa che scrive a stdout. Non cambia nulla.
pfnuesel,

1

l'unica volta che ho avuto un problema come questo con rsync, l'ho rintracciato in una porta ethernet di riserva su un'altra macchina che aveva lo stesso indirizzo IP del mio server di destinazione. Se rsync è traballante, è quasi sicuramente un problema di affidabilità della rete o (nel mio caso) di configurazione.


1

Ho incontrato un problema simile quando si esegue rsynco manualmente (o con cp, scpo in Gnome Nautilus) la copia di file di grandi dimensioni da un desktop Linux ad una bassa potenza ARM basato su Linux NAS su una rete gigabit cablata (non kerberosnel mio setup). Le unità NAS vengono condivise utilizzando sambae vengono montate sul client utilizzando cifs. La soluzione per me era montare il file system NAS dal client senza alcuna memorizzazione nella cache (vedi anche le pagine man mount.cifs ):

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

In alternativa, quando si monta l'unità NAS sul client utilizzando gvfsin nautilusquesto problema non sarebbe persistere durante la copia di file di grandi dimensioni (ma non funziona in combinazione con rsyncperò).

Fare in modo che Linux scriva sul filesystem di rete contemporaneamente alle letture del disco locale spiega ulteriormente perché questo problema potrebbe verificarsi.


0

Aggiorna semplicemente le tue versioni di rsync per assicurarti che siano esattamente le stesse su entrambi i PC di invio e ricezione. Vedi la mia risposta qui: /server/883487/unable-to-rsync-due-to-broken-pipe/988794#988794 .


1
Perché il downvote? Questo dovrebbe essere un commento, non una risposta, forse? Chiunque? Chiunque?
Gabriel Staples,

1
Non riesco più a riprodurre il problema, poiché non ho più accesso a quel server. Ma è una risposta ragionevole e non merita il voto negativo.
pfnuesel,
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.