Est-ce que rsync --inplace écrit dans le fichier entier, ou seulement dans les parties qui doivent être mises à jour? (pour les sauvegardes btrfs + rsync)

21

Je lisais plusieurs guides sur la façon de combiner des instantanés btrfs avec rsync pour créer une solution de sauvegarde efficace avec l'historique. Cependant, tout dépend si rsync --inplacene modifie que les parties des fichiers qui ont réellement changé, ou s'il écrase le fichier entier séquentiellement. S'il écrit tout le fichier, il semble que btrfs créera toujours une nouvelle copie du fichier, ce qui rendrait l'idée beaucoup moins efficace.

Petr Pudlák
la source
Comment pourrait-il même savoir s'il peut éviter d'écrire dans le fichier entier? N'est-il pas nécessaire de lire tout le fichier en premier pour comprendre ce qui a changé?
Mehrdad
2
@Mehrdad oui, c'est vrai, mais la lecture de l'ensemble n'est pas un problème. Si rsynclit le fichier entier et cherche et met à jour uniquement les parties nécessaires, btrfs copiera uniquement ces blocs mis à jour. Mais si rsynclit et écrit tout le fichier, ce sera un problème.
Petr Pudlák
1
@Mehrdad rsyncsait non seulement qu'il peut éviter d'écrire l'intégralité du fichier, il y parvient sans le copier complètement sur le net. Petit programme intelligent.
Gunther Piez

Réponses:

31

Si vous passez rsync deux chemins locaux, il utilisera par défaut "--whole-file", et non delta-transfer. Donc, ce que vous recherchez est "--no-whole-file". Vous obtenez également un transfert delta si vous avez demandé '-c'.

Voici comment vous pouvez vérifier:

$ mkdir a b
$ dd if=/dev/zero of=a/1 bs=1k count=64
$ dd if=/dev/zero of=a/2 bs=1k count=64
$ dd if=/dev/zero of=a/3 bs=1k count=64
$ rsync -av a/ b/
sending incremental file list
./
1
2
3

sent 196831 bytes  received 72 bytes  393806.00 bytes/sec
total size is 196608  speedup is 1.00

Ensuite, touchez un fichier et resynchronisez

$ touch a/1
$ rsync -av --inplace a/ b/
sending incremental file list
1

sent 65662 bytes  received 31 bytes  131386.00 bytes/sec
total size is 196608  speedup is 2.99

Vous pouvez vérifier qu'il a réutilisé l'inode avec "ls -li", mais notez qu'il a envoyé 64 Ko entiers. Réessayez avec --no-whole-file

$ touch a/1
$ rsync -av --inplace --no-whole-file a/ b/
sending incremental file list
1

sent 494 bytes  received 595 bytes  2178.00 bytes/sec
total size is 196608  speedup is 180.54

Maintenant, vous n'avez envoyé que 494 octets. Vous pouvez utiliser strace pour vérifier davantage si l'un des fichiers a été écrit, mais cela montre qu'il a au moins utilisé le transfert delta.

Notez (voir les commentaires) que pour les systèmes de fichiers locaux, --whole-fileest supposé (voir la page de manuel de rsync). D'un autre côté, à travers un réseau --no-whole-fileest supposé, donc tout --inplaceseul se comportera comme --inplace --no-whole-file.

sans données
la source
Pourquoi ne pas --inplaceimpliquer --no-whole-file?
Geremia
N'est-ce pas --no-whole-filepar défaut de toute façon?
Geremia
2
@Geremia pas si les deux chemins sont locaux. Et mon exemple montre que --inplacecela n'implique pas --no-whole-filela version de rsync que j'utilisais en 2013, mais vous êtes invités à répéter cette expérience avec votre propre version de rsync.
données
Eh bien, il inplacene s'agit pas de `` rechercher des blocs identiques / différents '', il s'agit simplement d'écraser le fichier existant immédiatement, à partir du décalage 0. (sinon, une copie temporaire est créée, puis seulement l'ancien fichier cible supprimé et la copie temporaire renommée . Il est probablement jugé "plus sûr" de conserver l'ancien fichier aussi longtemps que possible, si le processus est interrompu. Bien sûr, cela est pire pour les performances, la consommation de stockage maximale (pensez aux gros fichiers), éventuellement la fragmentation ...) ...
Frank Nocke
1
Je suppose que c'est l'inverse, --no-whole-fileimplique toujours --inplace, sinon la majeure partie de son gain de performance aurait disparu. Impossible de trouver cela documenté, cependant ...
Frank Nocke
15

Voici la réponse définitive, je suppose, en citant la bonne partie du manuel:

   --inplace

          [...]

          This option is useful for transferring large files
          with  block-based  changes  or  appended data, and
          also on systems that are disk bound,  not  network
          bound.   It  can  also  help  keep a copy-on-write
                                               *************
          filesystem snapshot from diverging the entire con‐
          *******************
          tents of a file that only has minor changes.
fuujuhi
la source
4

--inplaceécrase uniquement les régions qui ont changé. Utilisez-le toujours lors de l'écriture sur Btrfs.

Gabriel
la source
Et avez-vous une preuve qui montre qu'elle n'écrase pas d'autres parties de fichiers?
Petr Pudlák du
Est-ce la même chose pour ZFS?
ewwhite
@ewwhite: Puisque ZFS est COW (copie sur écriture) comme BTRFS, alors oui.
Geremia
@ PetrPudlák -vvvmontre qu'il saute les blocs correspondants
Tom Hale
3

L'algorithme de transfert delta de rsync détermine si le fichier entier est transmis ou uniquement les parties qui diffèrent. Il s'agit du comportement par défaut lors de la synchronisation d'un fichier entre deux machines pour économiser de la bande passante. Cela peut être remplacé par le --whole-file(ou -W) pour forcer la rsynctransmission du fichier entier.

--inplacedétermine si rsync, pendant le transfert, créera ou non un fichier temporaire. Le comportement par défaut consiste à créer un fichier temporaire. Cela donne une mesure de sécurité en ce que si le transfert est interrompu, le fichier existant dans la machine de destination reste intact / intact. --inplaceremplace ce comportement et indique rsyncde mettre à jour le fichier existant directement. Avec cela, vous courez le risque d'avoir un fichier incohérent dans la machine de destination si le transfert est interrompu.

Mike T.
la source
2

Depuis la page de manuel:

This  option  changes  how  rsync transfers a file when its data
needs to be updated: instead of the default method of creating a
new  copy  of  the file and moving it into place when it is com-
plete, rsync instead writes the updated  data  directly  to  the
destination file.

Cela m'amène à croire qu'il écrase le fichier dans son intégralité - j'imagine qu'il serait presque impossible pour rsync de fonctionner autrement.

Laxsnor
la source
2
Après avoir déterminé quelles parties doivent être mises à jour, il peut simplement rechercher ces pièces et les mettre à jour, au lieu d'écrire le fichier entier.
Petr Pudlák
0

Le travail théorique sur rsync en place est décrit dans cet article .

Référence de l'article: D. Rasch et R. Burns. Rsync sur place: synchronisation des fichiers pour les appareils mobiles et sans fil. Conférence technique annuelle USENIX, piste FREENIX, 91-100, USENIX, 2003.

Depuis le lien:

... Nous avons modifié l'implémentation rsync existante pour prendre en charge la reconstruction sur place.

Résumé: [...] Nous avons modifié rsync pour qu'il fonctionne sur des périphériques à contraintes d'espace. Les fichiers sur l'hôte cible sont mis à jour dans le même stockage que la version actuelle du fichier occupe. Les périphériques à espace limité ne peuvent pas utiliser rsync traditionnel car il nécessite de la mémoire ou du stockage pour l'ancienne et la nouvelle version du fichier. Les exemples incluent la synchronisation des fichiers sur les téléphones cellulaires et les ordinateurs de poche, qui ont de petites mémoires. L'algorithme rsync sur place code la représentation compressée d'un fichier dans un graphique, qui est ensuite trié par topologie pour obtenir la propriété sur place. [...]

Il semble donc que ce soit les détails techniques de ce que rsync --inplace fait. Selon le début de l'article:

Nous avons modifié rsync pour qu'il effectue des tâches de synchronisation de fichiers avec une reconstruction sur place. [...] Au lieu d'utiliser un espace temporaire, les modifications du fichier cible ont lieu dans l'espace déjà occupé par la version actuelle. Cet outil peut être utilisé pour synchroniser des appareils où l'espace est limité.

Comme il ressort clairement de la réponse de @ dataless , cela implique que --inplacele même espace de stockage est utilisé, mais il peut toujours copier le fichier entier dans cet espace. Plus précisément, lorsque des copies sont effectuées à partir de / vers des systèmes de fichiers locaux, rsync assume l' --whole-fileoption. Mais lorsqu'elle se trouve sur des systèmes en réseau, elle assume l' --no-whole-fileoption.

user92979
la source
1
Alors, quelle est la réponse?
Xen2050
Mes excuses. Je ne faisais pas assez attention. Avec la réponse de @ dataless, cela devrait clarifier les choses.
Diagon