web-dev-qa-db-fra.com

rsync - que signifie le f +++++++++ sur les journaux rsync?

J'utilise rsync pour faire une sauvegarde de mes fichiers de serveur et j'ai deux questions:

  1. Au milieu du processus, je dois arrêter et redémarrer rsync à nouveau.
    rsync démarrera-t-il à partir du point où il s’est arrêté ou recommencera depuis le début?

  2. Dans les fichiers journaux, je vois "f+++++++++". Qu'est-ce que ça veut dire?

par exemple.:

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

Examinons le fonctionnement de rsync et comprenons mieux les lignes de résultat cryptées:

1 - Un avantage énorme de rsync est qu’après une interruption la prochaine fois, cela continue sans à-coups.

La prochaine invocation rsync ne transférera plus les fichiers, qu’ils avaient déjà transférés, s’ils n’ont pas été modifiés entre-temps. Mais il va commencer à vérifier tous les fichiers depuis le début pour le savoir, car il n'est pas au courant qu'il a été interrompu.

2 - Chaque caractère est un code qui peut être traduit si vous lisez la section pour -i, --itemize-changes dans man rsync

Décodage de votre exemple de fichier journal à partir de la question:

> 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 partie pertinente de la page de manuel rsync:

-i, --itemize-changes

Demande une simple liste détaillée des modifications apportées à chaque fichier, y compris les modifications d'attributs. Cela revient à spécifier --out-format = '% i% n% L'. Si vous répétez cette option, les fichiers non modifiés seront également générés, mais uniquement si la version rsync de destination est au moins la version 2.6.7 (vous pouvez utiliser -vv avec les anciennes versions de rsync, mais cela active également la sortie des autres messages verbeux. sages).

L'échappement "% i" a une sortie cryptée de 11 lettres. Le format général est semblable à la chaîne YXcstpoguax, où Y est remplacé par le type de mise à jour en cours, X par le type de fichier et les autres lettres représentent des attributs pouvant être affichés s'ils sont modifiés.

Les types de mise à jour qui remplacent le Y sont les suivants:

  • UNE < signifie qu'un fichier est en cours de transfert sur l'hôte distant (envoyé).
  • UNE > signifie qu'un fichier est en cours de transfert sur l'hôte local (reçu).
  • Un c signifie qu'une modification/création locale est en cours pour l'élément (telle que la création d'un répertoire ou la modification d'un lien symbolique, etc.).
  • Un h signifie que l'élément est un lien physique vers un autre élément (requiert --hard-links).
  • UNE . signifie que l'élément n'est pas mis à jour (bien qu'il puisse avoir des attributs en cours de modification).
  • UNE * signifie que le reste de la zone de sortie détaillée contient un message (par exemple, "supprimer").

Les types de fichiers qui remplacent le X sont: f pour un fichier, un d pour un répertoire, un L pour un lien symbolique, un D pour un périphérique et un S pour un fichier spécial (par exemple, sockets nommés et fifos).

Les autres lettres de la chaîne ci-dessus sont les lettres réelles qui seront sorties si l'attribut associé à l'élément est mis à jour ou un "." pour pas de changement. Trois exceptions à cela: (1) un élément nouvellement créé remplace chaque lettre par un "+", (2) un élément identique remplace les points par des espaces et (3) un attribut inconnu remplace chaque lettre par un "?" (Cela peut arriver lorsque vous parlez à un ancien rsync).

L'attribut associé à chaque lettre est le suivant:

  • Un c signifie qu'un fichier normal a une somme de contrôle différente (nécessite --checksum) ou qu'un lien symbolique, un périphérique ou un fichier spécial a une valeur modifiée. Notez que si vous envoyez des fichiers à un rsync antérieur à la version 3.0.1, cet indicateur de modification ne sera présent que pour les fichiers normaux dont la somme de contrôle est différente.
  • Un s signifie que la taille d'un fichier normal est différente et sera mise à jour par le transfert de fichier.
  • Un t signifie que l’heure de modification est différente et qu’elle est mise à jour à la valeur de l’expéditeur (requiert --times). Une autre valeur de T signifie que l’heure de modification sera définie sur l’heure de transfert, ce qui se produit lorsqu’un fichier/lien symbolique/appareil est mis à jour sans - fois et quand un lien symbolique est modifié et que le destinataire ne peut pas définir son heure. (Remarque: lors de l'utilisation d'un client rsync 3.0.0, vous pouvez voir l'indicateur s combiné avec t au lieu de l'indicateur T approprié pour cet échec de la mise à l'heure.)
  • Un p signifie que les autorisations sont différentes et qu’elles sont mises à jour avec la valeur de l’expéditeur (nécessite --perms).
  • Un o signifie que le propriétaire est différent et qu'il est mis à jour à la valeur de l'expéditeur (requiert les privilèges - propriétaire et superutilisateur).
  • Un g signifie que le groupe est différent et qu’il est mis à jour avec la valeur de l’expéditeur (requiert --group et l’autorité permettant de définir le groupe).
  • L'emplacement u est réservé pour une utilisation future.
  • Le a signifie que les informations de la liste de contrôle d'accès ont changé.
  • Le x signifie que les informations d'attribut étendu ont changé.

Une autre sortie est possible: lors de la suppression de fichiers, "% i" générera la chaîne "* deleting" pour chaque élément en cours de suppression (en supposant que vous parlez à un rsync assez récent pour qu'il enregistre les suppressions au lieu de les afficher comme suit: un message verbeux).

162
mit

Il y a quelque temps, j'avais besoin de comprendre la sortie de rsync d'un script que j'écrivais. Pendant le processus d'écriture de ce script, j'ai cherché sur Google et suis arrivé à ce que @mit avait écrit ci-dessus . J'ai utilisé ces informations, ainsi que la documentation d'autres sources, pour créer mon propre amorce sur les indicateurs de bits et comment obtenir rsync pour générer des indicateurs de bits pour toutes les actions (il ne le fait pas par défaut).

Je publie cette information ici dans l’espoir d’aider d’autres personnes (comme moi) à trébucher sur cette page via une recherche et à besoin d’une meilleure explication de rsync.

Avec la combinaison de la --itemize-changes drapeau et le -vvv flag, rsync nous fournit la sortie détaillée de toutes les modifications du système de fichiers identifiées dans le répertoire source par rapport au répertoire cible. Les indicateurs de bits produits par rsync peuvent ensuite être décodés pour déterminer ce qui a changé. Pour décoder la signification de chaque bit, utilisez le tableau suivant.

Explication de la position et de la valeur de chaque bit dans la sortie de 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")

Quelques exemples de sortie de rsync pour différents scénarios:

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

Capture de la sortie de rsync (axée sur les indicateurs de bits):

Dans mon expérimentation, le --itemize-changes drapeau et le -vvv sont nécessaires pour que rsync puisse générer une entrée pour tous modifications du système de fichiers. Sans le triple verbose (-vvv), je ne voyais pas les modifications apportées aux répertoires, aux liens et aux périphériques. Il est utile d’expérimenter votre version de rsync pour vous assurer qu’elle observe et note tout ce que vous attendiez.

Une utilisation pratique de cette technique consiste à ajouter le --dry-run marque la commande et rassemble la liste de modifications, telle que déterminée par rsync, dans une variable (sans apporter de modification) afin que vous puissiez effectuer certains traitements sur la liste. Quelque chose comme ce qui suit capture la sortie dans une variable:

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

Dans l'exemple ci-dessus, la sortie (stdout) de rsync est redirigée vers grep (via stdin) afin que nous puissions isoler uniquement les lignes contenant des indicateurs de bits.

Traitement de la sortie capturée:

Le contenu de la variable peut ensuite être enregistré pour une utilisation ultérieure ou immédiatement itéré pour les éléments qui vous intéressent. J'utilise cette tactique exacte dans le script que j'ai écrit lors de mes recherches sur rsync. Vous pouvez consulter le script ( https://github.com/jmmitchell/movestough ) pour obtenir des exemples de post-traitement de la sortie capturée pour isoler les nouveaux fichiers, les fichiers en double (même nom, même contenu), collisions de fichiers (même nom, contenu différent), ainsi que les modifications apportées aux structures de sous-répertoires.

77
John Mark Mitchell

1) Wodin, ce n'est pas tout à fait vrai. Si vous utilisez les balises --partial ou -P (identiques à --partial --progress), rsync reprend les transferts interrompus.

2) Exactement, c'est la sortie commune pour la balise --itemize-changes.

2
Joao Figueiredo

1.) Il "redémarrera la synchronisation", mais il ne transférera pas les fichiers de la même taille, du même horodatage, etc. Il construit d'abord une liste de fichiers à transférer et pendant cette étape, il verra qu'il a déjà transféré certains fichiers et va les sauter. Vous devez indiquer à rsync de conserver les horodatages, etc. (par exemple, en utilisant rsync -a ...)

Pendant que rsync transfère un fichier, il l’appellera comme suit: .filename.XYZABC au lieu de filename. Ensuite, une fois le fichier transféré, il le renommera. Ainsi, si vous supprimez rsync pendant le transfert d’un fichier volumineux, vous devrez utiliser l’option --partial pour continuer le transfert au lieu de repartir à zéro.

2.) Je ne sais pas ce que c'est. Pouvez-vous coller des exemples?

EDIT: Selon http://ubuntuforums.org/showthread.php?t=1342171 ces codes sont définis dans la page de manuel de rsync dans la section relative au -i, --itemize-changes option.

Partie fixe si ma réponse est basée sur celle de Joao

1
Wodin