Cosa significa f +++++++++ nei log di rsync?


116

Sto usando rsyncper fare un backup dei file del mio server e ho due domande:

  1. A metà del processo ho bisogno di fermarmi e ricominciare rsync.
    Partirà rsyncdal punto in cui si è fermato o ricomincerà dall'inizio?

  2. Nei file di registro vedo "f+++++++++". Cosa significa?

per esempio:

2010/12/21 08:28:37 [4537] >f.st...... iddd/logs/website-production-access_log
2010/12/21 08:29:11 [4537] >f.st...... iddd/web/website/production/shared/log/production.log
2010/12/21 08:29:14 [4537] .d..t...... iddd/web/website/production/shared/sessions/
2010/12/21 08:29:14 [4537] >f+++++++++ iddd/web/website/production/shared/sessions/ruby_sess.017a771cc19b18cd
2010/12/21 08:29:14 [4537] >f+++++++++ iddd/web/website/production/shared/sessions/ruby_sess.01eade9d317ca79a

Risposte:


197

Diamo un'occhiata a come funziona rsync e comprendiamo meglio le linee criptiche dei risultati:

1 - Un enorme vantaggio di rsync è che dopo un'interruzione la volta successiva continua senza intoppi.

Il successivo richiamo di rsync non trasferirà nuovamente i file che erano già stati trasferiti, se nel frattempo non sono stati modificati. Ma ricomincerà a controllare tutti i file dall'inizio per scoprirlo, poiché non è a conoscenza di essere stato interrotto.

2 - Ogni carattere è un codice che può essere tradotto se leggi la sezione per -i, --itemize-changesinman rsync

Decodifica il tuo file di registro di esempio dalla domanda:

> F.st ......

> - the item is received
f - it is a regular file
s - the file size is different
t - the time stamp is different

.d..t ......

. - the item is not being updated (though it might have attributes 
    that are being modified)
d - it is a directory
t - the time stamp is different

> F +++++++++

> - the item is received
f - a regular file
+++++++++ - this is a newly created item

La parte rilevante della pagina man di rsync:

-i, --itemize-cambia

Richiede un semplice elenco dettagliato delle modifiche che vengono apportate a ciascun file, comprese le modifiche agli attributi. È esattamente lo stesso che specificare --out-format = '% i% n% L'. Se ripeti l'opzione, verranno emessi anche file non modificati, ma solo se l'rsync ricevente è almeno la versione 2.6.7 (puoi usare -vv con versioni precedenti di rsync, ma questo attiva anche l'output di altri messaggi dettagliati saggi).

L'escape "% i" ha un output criptico di 11 lettere. Il formato generale è come la stringa YXcstpoguax, dove Y è sostituito dal tipo di aggiornamento in corso, X è sostituito dal tipo di file e le altre lettere rappresentano attributi che possono essere emessi se vengono modificati.

I tipi di aggiornamento che sostituiscono la Y sono i seguenti:

  • Un <significa che un file è stato trasferito all'host remoto (inviato).
  • Un >significa che un file viene trasferito all'host locale (ricevuto).
  • Un csignifica che è in corso una modifica / creazione locale per l'elemento (come la creazione di una directory o la modifica di un collegamento simbolico, ecc.).
  • Un hsignifica che l'elemento è un collegamento fisico a un altro elemento (richiede --hard-link).
  • Un .significa che l'articolo non è in fase di aggiornamento (anche se potrebbe avere attributi in fase di modifica).
  • A *significa che il resto dell'area di output dettagliato contiene un messaggio (ad esempio "eliminazione").

I tipi di file che sostituiscono la X sono: fper un file, a dper una directory, Lper un collegamento simbolico, a Dper un dispositivo e a Sper un file speciale (es. Named sockets e fifos).

Le altre lettere nella stringa sopra sono le lettere effettive che verranno emesse se l'attributo associato per l'articolo viene aggiornato o un "." per nessun cambiamento. Tre eccezioni sono: (1) un elemento appena creato sostituisce ogni lettera con un "+", (2) un elemento identico sostituisce i punti con spazi e (3) un attributo sconosciuto sostituisce ogni lettera con un "?" (questo può accadere quando si parla con un vecchio rsync).

L'attributo associato a ciascuna lettera è il seguente:

  • A csignifica che un file normale ha un checksum diverso (richiede --checksum) o che un collegamento simbolico, un dispositivo o un file speciale ha un valore modificato. Nota che se stai inviando file a un rsync precedente alla 3.0.1, questo flag di modifica sarà presente solo per i file regolari che differiscono da checksum.
  • A ssignifica che la dimensione di un file normale è diversa e verrà aggiornata dal trasferimento del file.
  • A tsignifica che l'ora di modifica è diversa e viene aggiornata al valore del mittente (richiede --times). Un valore alternativo di T significa che l'ora di modifica sarà impostata sul tempo di trasferimento, che si verifica quando un file / collegamento simbolico / dispositivo viene aggiornato senza --times e quando un collegamento simbolico viene modificato e il destinatario non può impostare l'ora. (Nota: quando si utilizza un client rsync 3.0.0, è possibile che venga visualizzato il flag s combinato con t invece del flag T appropriato per questo errore di impostazione dell'ora.)
  • A psignifica che le autorizzazioni sono diverse e vengono aggiornate al valore del mittente (richiede --perms).
  • Un osignifica che il proprietario è diverso e viene aggiornato al valore del mittente (richiede i privilegi --owner e superutente).
  • A gsignifica che il gruppo è diverso e viene aggiornato al valore del mittente (richiede --group e l'autorità per impostare il gruppo).
  • Lo uslot è riservato per un utilizzo futuro.
  • I amezzi che le informazioni ACL cambiati.
  • I xmezzi che le informazioni attributi estesi cambiato.

Un altro outputèpossibile: quando elimini i file, "% i" produrrà la stringa "* deleting" per ogni elemento che viene rimosso (supponendo che tu stia parlando con un rsync abbastanza recente da registrare le eliminazioni invece di inviarle come output un messaggio dettagliato).


Questo post / risposta è molto vecchio ora, ma ho dovuto scrivere un commento a riguardo. È una delle migliori risposte che abbia mai visto su rsync. Grazie mit
Jorge

101

Qualche tempo fa, avevo bisogno di capire l' rsyncoutput di uno script che stavo scrivendo. Durante il processo di scrittura di quella sceneggiatura ho cercato su Google e sono arrivato a ciò che @mit aveva scritto sopra . Ho usato queste informazioni, così come la documentazione da altre fonti, per creare il mio primer sui flag di bit e su come ottenere rsynci flag di bit per tutte le azioni (non lo fa per impostazione predefinita).

Sto postando queste informazioni qui nella speranza che aiutino altri che (come me) si imbattono in questa pagina tramite la ricerca e hanno bisogno di una migliore spiegazione rsync.

Con la combinazione del --itemize-changesflag e del -vvvflag, rsyncci fornisce un output dettagliato di tutte le modifiche al file system che sono state identificate nella directory di origine rispetto alla directory di destinazione. I flag di bit prodotti da rsyncpossono quindi essere decodificati per determinare cosa è cambiato. Per decodificare il significato di ogni bit, utilizzare la tabella seguente.

Spiegazione della posizione e del valore di ogni bit rsyncnell'uscita di:

YXcstpoguax  path/to/file
|||||||||||
||||||||||╰- x: The extended attribute information changed
|||||||||╰-- a: The ACL information changed
||||||||╰--- u: The u slot is reserved for future use
|||||||╰---- g: Group is different
||||||╰----- o: Owner is different
|||||╰------ p: Permission are different
||||╰------- t: Modification time is different
|||╰-------- s: Size is different
||╰--------- c: Different checksum (for regular files), or
||              changed value (for symlinks, devices, and special files)
|╰---------- the file type:
|            f: for a file,
|            d: for a directory,
|            L: for a symlink,
|            D: for a device,
|            S: for a special file (e.g. named sockets and fifos)
╰----------- the type of update being done::
             <: file is being transferred to the remote host (sent)
             >: file is being transferred to the local host (received)
             c: local change/creation for the item, such as:
                - the creation of a directory
                - the changing of a symlink,
                - etc.
             h: the item is a hard link to another item (requires 
                --hard-links).
             .: the item is not being updated (though it might have
                attributes that are being modified)
             *: means that the rest of the itemized-output area contains
                a message (e.g. "deleting")

Alcuni esempi di output da rsync per vari scenari:

>f+++++++++ some/dir/new-file.txt
.f....og..x some/dir/existing-file-with-changed-owner-and-group.txt
.f........x some/dir/existing-file-with-changed-unnamed-attribute.txt
>f...p....x some/dir/existing-file-with-changed-permissions.txt
>f..t..g..x some/dir/existing-file-with-changed-time-and-group.txt
>f.s......x some/dir/existing-file-with-changed-size.txt
>f.st.....x some/dir/existing-file-with-changed-size-and-time-stamp.txt 
cd+++++++++ some/dir/new-directory/
.d....og... some/dir/existing-directory-with-changed-owner-and-group/
.d..t...... some/dir/existing-directory-with-different-time-stamp/

Cattura rsyncdell'output di (focalizzato sui flag di bit):

Nella mia sperimentazione, sia il --itemize-changesflag che il -vvvflag sono necessari per ottenere rsyncuna voce per tutte le modifiche al file system. Senza il -vvvflag triple verbose ( ), non vedevo le modifiche alla directory, al collegamento e al dispositivo elencate. Vale la pena sperimentare con la propria versione di rsync per assicurarsi che stia osservando e annotando tutto ciò che ci si aspettava.

Un uso pratico di questa tecnica è aggiungere il --dry-runflag al comando e raccogliere l'elenco delle modifiche, come determinato da rsync, in una variabile (senza apportare modifiche) in modo da poter eseguire autonomamente alcune elaborazioni nell'elenco. Qualcosa di simile al seguente catturerebbe l'output in una variabile:

file_system_changes=$(rsync --archive --acls --xattrs \
    --checksum --dry-run \
    --itemize-changes -vvv \
    "/some/source-path/" \
    "/some/destination-path/" \
| grep -E '^(\.|>|<|c|h|\*).......... .')

Nell'esempio sopra, l'output (stdout) da rsyncviene reindirizzato a grep(tramite stdin), quindi possiamo isolare solo le righe che contengono flag di bit.

Elaborazione dell'output acquisito:

Il contenuto della variabile può quindi essere registrato per un uso successivo o immediatamente ripetuto per elementi di interesse. Uso questa tattica esatta nella sceneggiatura che ho scritto durante la ricerca di più rsync. Puoi guardare lo script ( https://github.com/jmmitchell/movestough ) per esempi di post-elaborazione dell'output catturato per isolare nuovi file, file duplicati (stesso nome, stesso contenuto), collisioni di file (stesso nome, diverso content), così come i cambiamenti nelle strutture delle sottodirectory.


1
molto utile! cos'è -T nell'output del registro?
Pol Hallen

Pol, stai chiedendo del flag - T per rsync?
John Mark Mitchell

Pol, se ho capito correttamente la tua domanda, la t nel registro rsync significa che i due file confrontati hanno timestamp diversi. Significa che sono stati creati o modificati in tempi diversi.
John Mark Mitchell

3
Credo che "T" nell'output significhi che l'ora è stata aggiornata all'ora corrente, "<f..T ...... Rise.mp3". Almeno questo è quello che sto osservando. "t" sarebbe l'ora del file locale.
C. Kelly

1
Sono in ritardo di un paio d'anni, ma "t" vs "T" è spiegato nella pagina man: A t significa che l'ora di modifica è diversa e viene aggiornata al valore del mittente (richiede --times). Un valore alternativo di T significa che l'ora di modifica sarà impostata sul tempo di trasferimento, che si verifica quando un file / collegamento simbolico / dispositivo viene aggiornato senza --times e quando un collegamento simbolico viene modificato e il destinatario non può impostare l'ora. (Nota: quando si utilizza un client rsync 3.0.0, è possibile che venga visualizzato il flag s combinato con t invece del flag T appropriato per questo errore di impostazione dell'ora.)
user187557

2

1) Wodin, non è del tutto vero. Se si utilizza il tag --partial o -P (uguale a --partial --progress) rsync riprende i trasferimenti interrotti.

2) Esattamente, questo è un output comune per il tag --itemize-changes.


2

1.) "Riavvia la sincronizzazione", ma non trasferirà file della stessa dimensione e timestamp ecc. Per prima cosa crea un elenco di file da trasferire e durante questa fase vedrà che alcuni file sono già stati trasferiti e li salterà. Dovresti dire a rsync di conservare i timestamp ecc. (Es. Usando rsync -a ...)

Mentre rsync sta trasferendo un file, lo chiamerà qualcosa di simile .filename.XYZABCinvece di filename. Quindi, quando avrà finito di trasferire quel file, lo rinominerà. Quindi, se uccidi rsync mentre sta trasferendo un file di grandi dimensioni, dovrai usare l'opzione --partial per continuare il trasferimento invece di iniziare da zero.

2.) Non so cosa sia. Puoi incollare alcuni esempi?

EDIT: Come per http://ubuntuforums.org/showthread.php?t=1342171 quei codici sono definiti nella pagina man di rsync nella sezione relativa -i, --itemize-changesall'opzione.

Parte fissa se la mia risposta basata su Joao's


Ho messo alcuni esempi di log sopra. Grazie.
GodFather

Ho aggiornato la mia risposta. I codici sono spiegati nella pagina man.
Wodin
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.