¿Qué significa f +++++++++ en los registros de rsync?

116

Estoy usando rsyncpara hacer una copia de seguridad de los archivos de mi servidor y tengo dos preguntas:

  1. En medio del proceso, necesito detenerme y comenzar de rsyncnuevo.
    ¿ rsyncComenzará desde el punto donde se detuvo o se reiniciará desde el principio?

  2. En los archivos de registro que veo "f+++++++++". Qué significa eso?

p.ej:

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
Padrino
fuente

Respuestas:

197

Echemos un vistazo a cómo funciona rsync y comprendamos mejor las líneas de resultado crípticas:

1 - Una gran ventaja de rsync es que después de una interrupción, la próxima vez continúa sin problemas.

La próxima invocación de rsync no transferirá los archivos de nuevo, que ya se habían transferido, si no se modificaron mientras tanto. Pero volverá a comprobar todos los archivos desde el principio para averiguarlo, ya que no sabe que se ha interrumpido.

2 - Cada carácter es un código que puede traducirse si lee la sección de -i, --itemize-changesenman rsync

Decodificando su archivo de registro de ejemplo de la pregunta:

> primero ......

> - 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 relevante de la página de manual de rsync:

-i, --itemize-changes

Solicita una lista detallada simple de los cambios que se están realizando en cada archivo, incluidos los cambios de atributos. Esto es exactamente lo mismo que especificar --out-format = '% i% n% L'. Si repite la opción, también se generarán archivos sin cambios, pero solo si el rsync receptor es al menos la versión 2.6.7 (puede usar -vv con versiones anteriores de rsync, pero eso también activa la salida de otros mensajes detallados- sabios).

El escape "% i" tiene una salida críptica de 11 letras. El formato general es como la cadena YXcstpoguax, donde Y se reemplaza por el tipo de actualización que se está realizando, X se reemplaza por el tipo de archivo y las otras letras representan atributos que pueden aparecer si se modifican.

Los tipos de actualización que reemplazan la Y son los siguientes:

  • A <significa que se está transfiriendo un archivo al host remoto (enviado).
  • A >significa que se está transfiriendo un archivo al host local (recibido).
  • A csignifica que se está produciendo un cambio / creación local para el elemento (como la creación de un directorio o el cambio de un enlace simbólico, etc.).
  • A hsignifica que el elemento es un vínculo fijo a otro elemento (requiere --hard-links).
  • A .significa que el elemento no se está actualizando (aunque puede tener atributos que se están modificando).
  • A *significa que el resto del área de salida detallada contiene un mensaje (por ejemplo, "borrando").

Los tipos de archivo que reemplazan a la X son: fpara un archivo, a dpara un directorio, un Lpara un enlace simbólico, a Dpara un dispositivo y a Spara un archivo especial (por ejemplo, sockets con nombre y FIFos).

Las otras letras en la cadena anterior son las letras reales que se generarán si el atributo asociado para el artículo se actualiza o un "." sin cambios. Tres excepciones a esto son: (1) un elemento recién creado reemplaza cada letra con un "+", (2) un elemento idéntico reemplaza los puntos con espacios y (3) un atributo desconocido reemplaza cada letra con un "?" (esto puede suceder cuando se habla con un rsync más antiguo).

El atributo que se asocia a cada letra es el siguiente:

  • A csignifica que un archivo normal tiene una suma de verificación diferente (requiere --checksum) o que un enlace simbólico, dispositivo o archivo especial tiene un valor modificado. Tenga en cuenta que si está enviando archivos a un rsync anterior a 3.0.1, este indicador de cambio estará presente solo para archivos regulares que difieran de la suma de comprobación.
  • A ssignifica que el tamaño de un archivo normal es diferente y se actualizará mediante la transferencia del archivo.
  • A tsignifica que la hora de modificación es diferente y se actualiza al valor del remitente (requiere - veces). Un valor alternativo de T significa que el tiempo de modificación se establecerá en el tiempo de transferencia, lo que ocurre cuando un archivo / enlace simbólico / dispositivo se actualiza sin --times y cuando se cambia un enlace simbólico y el receptor no puede establecer su tiempo. (Nota: al usar un cliente rsync 3.0.0, es posible que vea el indicador s combinado con t en lugar del indicador T adecuado para este error de establecimiento de tiempo).
  • A psignifica que los permisos son diferentes y se están actualizando al valor del remitente (requiere --perms).
  • Un osignifica que el propietario es diferente y se actualiza al valor del remitente (requiere privilegios de propietario y superusuario).
  • A gsignifica que el grupo es diferente y se está actualizando al valor del remitente (requiere --group y la autoridad para configurar el grupo).
  • La uranura está reservada para uso futuro.
  • Los amedios que la información de ACL cambian.
  • Los xmedios que la información de atributo extendido cambiado.

Otra salida es posible: al eliminar archivos, "% i" generará la cadena "* eliminando" para cada elemento que se está eliminando (asumiendo que está hablando con un rsync lo suficientemente reciente que registra las eliminaciones en lugar de generarlas como un mensaje detallado).

mit
fuente
Esta publicación / respuesta es muy antigua ahora, pero tuve que escribir un comentario al respecto. Es una de las mejores respuestas que he visto sobre rsync. Gracias mit
Jorge
101

Hace algún tiempo, necesitaba comprender el rsyncresultado de un guión que estaba escribiendo. Durante el proceso de escritura de ese script busqué en Google y encontré lo que @mit había escrito arriba . Usé esa información, así como la documentación de otras fuentes, para crear mi propio manual sobre los indicadores de bits y cómo llegar rsynca los indicadores de bits de salida para todas las acciones (no hace esto de forma predeterminada).

Estoy publicando esa información aquí con la esperanza de que ayude a otros que (como yo) se encuentran con esta página a través de la búsqueda y necesitan una mejor explicación de rsync.

Con la combinación de la --itemize-changesbandera y la -vvvbandera, rsyncnos da una salida detallada de todos los cambios del sistema de archivos que se identificaron en el directorio de origen en comparación con el directorio de destino. Las banderas de bits producidas por rsyncse pueden decodificar para determinar qué cambió. Para decodificar el significado de cada bit, use la siguiente tabla.

Explicación de cada posición de bit y valor en rsyncla salida:

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")

Algunos ejemplos de salida de rsync para varios escenarios:

>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/

Capturando rsyncla salida (enfocada en las banderas de bits):

En mi experimentación, tanto el --itemize-changesindicador como el -vvvindicador son necesarios rsyncpara generar una entrada para todos los cambios del sistema de archivos. Sin el -vvvindicador triple verbose ( ), no veía los cambios de directorio, enlace y dispositivo en la lista. Vale la pena experimentar con su versión de rsync para asegurarse de que está observando y anotando todo lo que esperaba.

Un uso útil de esta técnica es agregar la --dry-runbandera al comando y recopilar la lista de cambios, según lo determinado por rsync, en una variable (sin realizar ningún cambio) para que pueda procesar la lista usted mismo. Algo como lo siguiente capturaría la salida en una variable:

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

En el ejemplo anterior, la salida (stdout) de rsyncse redirige a grep(a través de stdin) para que podamos aislar solo las líneas que contienen indicadores de bits.

Procesando la salida capturada:

El contenido de la variable se puede registrar para su uso posterior o se puede iterar inmediatamente para los elementos de interés. Utilizo esta táctica exacta en el guión que escribí mientras investigaba más rsync. Puede consultar el script ( https://github.com/jmmitchell/movestough ) para ver ejemplos de posprocesamiento de la salida capturada para aislar archivos nuevos, archivos duplicados (mismo nombre, mismo contenido), colisiones de archivos (mismo nombre, diferentes contenidos), así como los cambios en las estructuras de subdirectorios.

John Mark Mitchell
fuente
1
¡muy útil! ¿Qué es -T en la salida del registro?
Pol Hallen
Pol, ¿estás preguntando por la bandera - T para rsync?
John Mark Mitchell
Pol, si entiendo tu pregunta correctamente, la t en el registro de rsync significa que los dos archivos comparados tienen marcas de tiempo diferentes. Lo que significa que fueron creados o modificados en diferentes momentos.
John Mark Mitchell
3
Creo que "T" en la salida significa que la hora se actualizó a la hora actual, "<f..T ...... Rise.mp3". Al menos esto es lo que estoy observando. "t" sería la hora del archivo local.
C. Kelly
1
Llego un par de años tarde, pero "t" vs "T" se explica en la página de manual: A t significa que la hora de modificación es diferente y se está actualizando al valor del remitente (requiere - veces). Un valor alternativo de T significa que el tiempo de modificación se establecerá en el tiempo de transferencia, lo que ocurre cuando un archivo / enlace simbólico / dispositivo se actualiza sin --times y cuando se cambia un enlace simbólico y el receptor no puede establecer su tiempo. (Nota: al usar un cliente rsync 3.0.0, es posible que vea el indicador s combinado con t en lugar del indicador T adecuado para este error de establecimiento de tiempo).
user187557
2

1) Wodin, eso no es del todo cierto. Si usa la etiqueta --partial o -P (igual que --partial --progress), rsync reanuda las transferencias interrumpidas.

2) Exactamente, esa es la salida común para la etiqueta --itemize-changes.

Joao Figueiredo
fuente
2

1.) "Reiniciará la sincronización", pero no transferirá archivos del mismo tamaño y marca de tiempo, etc. Primero crea una lista de archivos para transferir y durante esta etapa verá que ya ha transferido algunos archivos. y los saltará. Debe decirle a rsync que conserve las marcas de tiempo, etc. (por ejemplo, usando rsync -a ...)

Mientras rsync está transfiriendo un archivo, lo llamará algo como en .filename.XYZABClugar de filename. Luego, cuando haya terminado de transferir ese archivo, le cambiará el nombre. Entonces, si mata rsync mientras está transfiriendo un archivo grande, tendrá que usar la opción --partial para continuar con la transferencia en lugar de comenzar desde cero.

2.) No sé qué es eso. ¿Puedes pegar algunos ejemplos?

EDITAR: Según http://ubuntuforums.org/showthread.php?t=1342171, esos códigos se definen en la página de manual de rsync en la sección de la -i, --itemize-changesopción.

Parte fija si mi respuesta se basa en la de Joao.

Wodin
fuente
Pongo algunos ejemplos de registro arriba. Gracias.
GodFather
Actualicé mi respuesta. Los códigos se explican en la página de manual.
Miércoles