Reprendre le transfert d'un seul fichier par rsync

52

Dans Ubuntu, je veux copier un gros fichier de mon disque dur vers un lecteur amovible en rsync. Pour une autre raison, l'opération ne peut pas être terminée en une seule fois. J'essaie donc de comprendre comment utiliser rsyncpour reprendre la copie du fichier là où il s'était arrêté la dernière fois.

J'ai essayé d'utiliser l'option --partialou --inplace, mais avec --progress, je l' ai trouvé rsyncavec --partialou --inplacecommence en fait dès le début au lieu de partir de ce qui restait la dernière fois. Arrêter manuellement rsynctôt et vérifier la taille du fichier reçu a également confirmé ce que j’ai trouvé.

Mais avec --append, rsync commence à partir de ce qui restait la dernière fois.

Je suis confus que j'ai vu sur la page de manuel --partial , --inplaceet --appendsemble se rapporter à la copie de reprendre ce qui restait la dernière fois. Est-ce que quelqu'un est capable d'expliquer la différence? Pourquoi ne pas --partialou --inplacetravailler pour reprendre la copie? Est-il vrai que pour reprendre la copie, rsyncdoit travailler avec l' --appendoption?

De plus, si un fichier partiel a été laissé par, mvou cpnon par rsync, la rsync --appendcopie sera-t-elle correctement reprise?

Tim
la source

Réponses:

39

Pour reprendre une copie interrompue, vous devez utiliser rsync --append. De la page de manuel expliquant --append:

Cela amène rsync à mettre à jour un fichier en ajoutant des données à la fin du fichier, ce qui suppose que les données qui existent déjà du côté de la réception sont identiques au début du fichier du côté de l'envoi. [...] implique --inplace, [...]

Option --inplacefait rsync(écraser) directement le contenu du fichier de destination; sans --inplace , rsyncserait:

  1. créer un nouveau fichier avec un nom temporaire,
  2. copiez-y le contenu mis à jour,
  3. échangez-le avec le fichier de destination, et enfin
  4. supprimer l'ancienne copie du fichier de destination.

Le mode de fonctionnement normal évite principalement les conflits avec les applications susceptibles d’ouvrir le fichier de destination et quelques autres incidents dûment répertoriés dans la rsyncpage de manuel.

Notez que si une opération de copie / mise à jour échoue aux étapes 1. à 3. ci-dessus, rsyncsupprimera le fichier de destination temporaire; l' --partial option désactive ce comportement et rsynclaisse les fichiers temporaires partiellement transférés sur le système de fichiers de destination. Ainsi, la reprise d'une opération de copie de fichier unique ne rapportera pas grand-chose à moins que vous ayez appelé la première rsyncavec --partialou --partial-dir(même effet que --partial, indique en outre rsync de créer tous les fichiers temporaires dans un répertoire spécifique).

Riccardo Murri
la source
Merci! Si un fichier partiel a été laissé par mv ou cp pas par rsync, rsync --append reprendra-t-il correctement la copie du fichier?
Tim
1
@Tim En bref, --appendfait rsynccroire que, si deux fichiers correspondants ont une longueur différente, le plus court est identique à la partie initiale du plus long. Donc, oui, si vous commencez à copier un fichier volumineux avec cpet interrompez le processus de copie, alors vous rsync --appendne copiez que la partie restante du fichier. ( Remarque: si cpest interrompu par une panne système, il y a une petite chance que le contenu du fichier et les métadonnées ne soient pas synchronisés, c'est-à-dire que le fichier est corrompu. Dans ce cas, rsyncune nouvelle exécution sans --append corriger le problème.)
Riccardo Murri
2
Donc, si je comprends bien, il n'y a aucun moyen de dire à rsync de vérifier un fichier partiel et de reprendre le transfert vers ce fichier partiellement transféré ?
Winny
1
@ Winny, très tardivement: pour une copie locale, il n’existe aucun moyen sensé de le faire. Pour une copie réseau, il s'agit du mode par défaut lorsque vous spécifiez --partialsans --append.
Roaima
1
@ Winny --appendet --append-verifyavez un cas d'échec dangereux: lorsque le fichier du destinataire est de la même taille ou plus, mais contient des données différentes. Je suggère une solution basée à la--no-whole-file place.
Tom Hale
21

Soyez conscient que cela --appendimplique --inplace, ce qui implique lui-même --partial.

  • En utilisant simplement, --partialvous devriez rsynclaisser des transferts partiels et les reprendre lors de tentatives ultérieures.

  • En utilisant, --appendvous devriez rsynclaisser à la fois des fichiers partiels et les reprendre la prochaine fois. Après le transfert rsyncdevrait vérifier la somme de contrôle des données transmises uniquement.

  • --append-verify inclut l'ensemble du fichier dans la vérification de la somme de contrôle, y compris toute partie transférée lors d'un transfert précédent.

  • Avec une vérification de somme de contrôle --appendou --append-verifyun échec, le fichier doit être complètement retransmis (en utilisant --inplace)

Vous devriez pouvoir reprendre une opération mvou cpavec, rsyncmais vous pouvez utiliser l' --append-verifyoption pour plus de tranquillité d'esprit.

Notez que l'utilisation ne --appendpermet rsyncde copier que les fichiers dont la taille sur le destinataire est inférieure à celle de l'expéditeur (quels que soient l'horodatage) ou qui sont absents sur le destinataire. Par documentation sur cette option:

Si un fichier doit être transféré et que sa taille sur le récepteur est égale ou supérieure à celle de l'expéditeur, le fichier est ignoré.

Plus d'infos dans la page de manuel

TomG
la source
--appendet --append-verifyavoir un cas d'échec dangereux: lorsque le fichier du destinataire est de la même taille ou plus grand mais contient des données différentes. Je suggère une solution basée à la--no-whole-file place.
Tom Hale
@TomHale, la documentation suggère que pour qu'un fichier soit ignoré, il doit avoir exactement la même taille et la même heure de modification aux deux extrémités. Si cela est une préoccupation plausible, il --checksumconvient de l'utiliser. Je ne peux pas le trouver spécifié explicitement, mais logiquement, n'importe laquelle des options de reprise doit impliquer, --no-whole-filecar elle --whole-filedevrait être incompatible.
TomG
--append-verifyignorera les fichiers de taille identique ou plus grande avec des dates différentes , ce qui peut être "inattendu". Il n’est pas nécessaire d’utiliser --checksum tous les fichiers, comme le rsyncfera toute une somme de contrôle, mais uniquement sur ce qui est transféré.
Tom Hale
--checksumindique rsyncà la somme de contrôle des fichiers avant de l’ envoyer, ce qui garantit que tous les fichiers modifiés sont transférés, quelle que soit leur taille ou leur taille. Avez-vous une source pour le --append-verifycomportement inattendu car ce que vous décrivez ne correspond pas à la documentation ou à mon expérience (limitée)?
TomG
--append-verifyfait référence à --appendce qui dit: If a file needs to be transferred and its size on the receiver is the same or longer than the size on the sender, the file is skipped.Même si un fichier doit être transféré à cause de --checksum, il peut toujours être ignoré.
Tom Hale
6

David Schwartz a raison, --partial(ou mieux -P) fait ce que vous voulez. J'ai vérifié cela sur un fichier 37G qui a été arrêté ~ 8g dessus, sur un réseau. rsync a rapidement analysé les premières parties du partiel (indiquant les progrès réalisés grâce à -P), puis a repris le transfert à la fin du fichier partiel.

Steve Byrne
la source
Une copie réseau est traitée différemment d'une copie locale, ce qui est le problème ici.
Roaima
@roaima Avez-vous une source pour cela, ou un document qui explique plus en détail les différences? Je ne parviens pas à le trouver dans la (énorme) page de manuel.
Jonas Schäfer
@JonasWielicki, la page de manuel y fait allusion dans la --whole-filedescription de l' option.
Roaima
@roaima Merci beaucoup! Cela signifie également que la solution de contournement appropriée est --no-W(ce qui fonctionne réellement!)
Jonas Schäfer
@JonasWielicki c'est extrêmement inefficace, c'est pourquoi il est désactivé par défaut. Vous ne voulez vraiment pas utiliser --no-Wsauf si vous comprenez exactement ce que cela signifie pour les fichiers locaux. Voir unix.stackexchange.com/a/181018/100397
roaima
2

Vous faisiez bien --partialce que vous voulez. Il semble commencer depuis le début car il commence toujours au début de la liste des fragments de données de fichier qu'il doit copier. Cette --appendoption est dangereuse et entraînera un fichier corrompu si les données ne correspondent pas pour une raison quelconque.

David Schwartz
la source
Les copies locales ne sont pas comparées, elles sont simplement écrasées (ou --appendpoursuivies à partir du décalage d'octet).
Roaima
1

Par défaut, cette option rsyncest activée --whole-filesi vous effectuez un transfert de disque local vers un disque local. Cela redémarrera un transfert interrompu depuis le début, plutôt que de vérifier les pièces déjà présentes.

Pour désactiver ceci, utilisez:

--no-whole-file

La combinaison de cela avec --inplaceou --partialpermettra de reprendre le transfert plus tard.

Mon alias pour utiliser rsyncpour copier est:

rscp='rsync -ax --inplace --sparse --no-whole-file --protect-args'

Avertissement : soyez prudent d'utiliser --append-verifycomme il sauter tous les fichiers de destination qui sont de la même taille ou plus.

Tom Hale
la source
Pour les transferts réseau, rsynccompare les fichiers source et les fichiers de destination correspondants avant le transfert afin d’envoyer uniquement les parties modifiées (transfert delta). --no-whole-filedit rsyncde faire la même chose pour la copie locale à locale. La documentation n'indique pas que cela aurait une incidence sur la reprise des transferts partiels de fichiers individuels. rsyncignorera les fichiers avec exactement la même taille et les mêmes horodatages. Ni --append-verifyne --no-whole-filedevrait ni changer ce comportement, mais --checksumdevrait fonctionner avec soit pour la tranquillité d'esprit au coût de disque IO
TomG
--append-verifyignorera les fichiers de taille identique ou plus grande avec des dates différentes , ce qui peut être "inattendu". Il n’est pas nécessaire d’utiliser --checksum tous les fichiers, comme le rsyncfera toute une somme de contrôle, mais uniquement sur ce qui est transféré.
Tom Hale