risposta-alla-domanda-sullo-sviluppo-web-bd.com

rsync - cosa significa f +++++++++ sui registri rsync?

Sto usando rsync per fare un backup dei miei file del server e ho due domande:

  1. Nel mezzo del processo ho bisogno di fermarmi e ricominciare rsync.
    rsync inizierà dal punto in cui si è interrotto o si riavvierà 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
92
GodFather

Diamo un'occhiata a come funziona rsync e comprendiamo meglio le linee di risultato criptiche:

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

La successiva chiamata 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 del fatto che è stato interrotto.

2 - Ogni personaggio è un codice che può essere tradotto se leggi la sezione per -i, --itemize-changes nel man rsync

Decodifica del 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-changes

Richiede un semplice elenco dettagliato delle modifiche 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 invariati, ma solo se rsync ricevente è almeno la versione 2.6.7 (puoi usare -vv con le versioni precedenti di rsync, ma ciò attiva anche l'output di altri messaggi dettagliati- saggi).

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

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

  • A < significa che un file viene trasferito sull'host remoto (inviato).
  • A > indica che un file viene trasferito sull'host locale (ricevuto).
  • Un c indica che si sta verificando una modifica/creazione locale per l'elemento (come la creazione di una directory o la modifica di un collegamento simbolico, ecc.).
  • Un h indica che l'elemento è un collegamento reale a un altro elemento (richiede --hard-links).
  • A . significa che l'elemento non è in fase di aggiornamento (anche se potrebbe avere attributi che vengono modificati).
  • A * indica che il resto dell'area di output dettagliata contiene un messaggio (ad es. "eliminazione").

I tipi di file che sostituiscono la X sono: f per un file, un d per una directory, un L per un collegamento simbolico, un D per un dispositivo e un S per un file speciale (ad es. nome socket e fifos).

Le altre lettere nella stringa sopra sono le lettere effettive che verranno emesse se l'attributo associato per l'elemento viene aggiornato o un "." per nessun cambiamento. Tre eccezioni a questo 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:

  • Un c indica che un file normale ha un checksum diverso (richiede --checksum) o che un collegamento simbolico, dispositivo o file speciale ha un valore modificato. Si noti che se si inviano file a un rsync precedente alla 3.0.1, questo flag di modifica sarà presente solo per i file regolari con differenza di checksum.
  • Un s indica che la dimensione di un file normale è diversa e verrà aggiornata dal trasferimento del file.
  • Un t indica che il tempo di modifica è diverso e viene aggiornato al valore del mittente (richiede --times). Un valore alternativo di T indica che il tempo di modifica verrà impostato sul tempo di trasferimento, che si verifica quando un file/collegamento simbolico/dispositivo viene aggiornato senza --times e quando viene modificato un collegamento simbolico e il ricevitore 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 anziché il flag T corretto per questo errore di impostazione dell'ora.)
  • Un p indica che le autorizzazioni sono diverse e vengono aggiornate al valore del mittente (richiede --perms).
  • Un o indica che il proprietario è diverso e viene aggiornato in base al valore del mittente (richiede i privilegi di proprietario e superutente).
  • Un g indica che il gruppo è diverso e viene aggiornato in base al valore del mittente (richiede --group e l'autorità per impostare il gruppo).
  • Lo slot u è riservato per uso futuro.
  • a indica che le informazioni ACL sono cambiate.
  • x indica che le informazioni sull'attributo esteso sono cambiate.

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

162
mit

Qualche tempo fa, avevo bisogno di capire l'output rsync per 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 di altre fonti, per creare il mio primer sui bit flag e su come ottenere rsync per l'output dei flag di bit per tutte le azioni (non lo fa per impostazione predefinita).

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

Con la combinazione di --itemize-changes flag e il -vvv flag, rsync ci 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 bit flag prodotti da rsync possono 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 ciascun bit nell'output di rsync:

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 dell'output di rsync (incentrato sui flag di bit):

Nella mia sperimentazione, sia il --itemize-changes flag e il -vvv flag sono necessari per ottenere rsync per generare una voce per le modifiche del file system all. Senza il triplo verboso (-vvv) flag, non vedevo le modifiche alla directory, al link e al dispositivo elencate. Vale la pena sperimentare con la tua versione di rsync per assicurarti che stia osservando e notando tutto ciò che ti aspettavi.

Un utile uso di questa tecnica è l'aggiunta di --dry-run contrassegna il comando e raccogli l'elenco delle modifiche, come determinato da rsync, in una variabile (senza apportare modifiche) in modo da poter eseguire personalmente l'elaborazione sull'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 rsync viene reindirizzato a grep (tramite stdin) in modo da poter isolare solo le linee che contengono flag di bit.

Elaborazione dell'output acquisito:

Il contenuto della variabile può quindi essere registrato per un uso successivo o ripetuto immediatamente per gli elementi di interesse. Uso questa tattica esatta nello script che ho scritto durante la ricerca di più su 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, contenuti diversi), nonché i cambiamenti nelle strutture della sottodirectory.

77

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

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

2
Joao Figueiredo

1.) "riavvierà la sincronizzazione", ma non trasferirà file della stessa dimensione e timestamp, ecc. In primo luogo crea un elenco di file da trasferire e durante questa fase vedrà che ha già trasferito alcuni file e li salterà. Dovresti dire a rsync di conservare i timestamp ecc. (Ad es. Usando rsync -a ...)

Mentre rsync sta trasferendo un file, lo chiamerà in qualche modo come .filename.XYZABC anziché filename. Quindi, una volta terminato il trasferimento di 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 ricominciare da zero.

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

EDIT: Secondo http://ubuntuforums.org/showthread.php?t=1342171 questi codici sono definiti nella pagina man di rsync nella sezione per il -i, --itemize-changes opzione.

Risolto il problema se la mia risposta si basava su quella di Joao

1
Wodin