web-dev-qa-db-fra.com

Est-ce que rsync --inplace écrit dans le fichier entier ou uniquement dans les parties à mettre à jour? (pour les sauvegardes btrfs + rsync)

Je lisais plusieurs guides sur la manière de combiner les instantanés btrfs avec rsync pour créer une solution de sauvegarde efficace avec historique. Cependant, tout dépend si rsync --inplace ne modifie que les parties de fichiers réellement modifiées ou s'il écrase le fichier entier de manière séquentielle. 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.

20
Petr Pudlák

Si vous transmettez deux chemins locaux à rsync, il utilisera par défaut "--whole-file", et non le transfert delta. Donc, ce que vous recherchez, c'est "- pas de fichier entier". 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

Puis touchez un fichier et re-synchronisez

$ 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 vous remarquerez qu'il a envoyé un total de 64K octets. 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 si un fichier a été écrit, mais cela le montre au moins comme un transfert delta.

Notez (voir les commentaires) que pour les systèmes de fichiers locaux, --whole-file est utilisé (voir la page de manuel de rsync). D'autre part, sur un réseau, --no-whole-file est supposé, donc --inplace seul se comportera comme --inplace --no-whole-file.

29
dataless

Voici la réponse définitive je suppose, 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.
14
fuujuhi

--inplace écrase uniquement les régions qui ont changé. Utilisez-le toujours lorsque vous écrivez dans Btrfs.

4
Gabriel

l'algorithme de transfert delta de rsync détermine si le fichier entier est transmis ou uniquement les parties qui diffèrent. C'est le comportement par défaut lors de la synchronisation d'un fichier entre deux ordinateurs pour économiser de la bande passante. Ceci peut être annulé avec le --whole-file (ou -W) pour forcer rsync à transmettre le fichier entier.

--inplace détermine si rsync, lors du transfert, créera un fichier temporaire ou non. 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. --inplace remplace ce comportement et indique à rsync de mettre à jour directement le fichier existant. Avec cela, vous courez le risque d'avoir un fichier incohérent dans la machine de destination si le transfert est interrompu.

3
Mike T.

De 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 me porte à croire qu'il écrit sur le fichier dans son intégralité - j'imagine qu'il serait presque impossible pour rsync de fonctionner autrement.

2
Laxsnor

Le travail théorique sur la synchronisation en place est décrit dans de cet article .

Référence du document: D. Rasch et R. Burns. Rsync sur place: synchronisation de fichiers pour les périphériques mobiles et sans fil. Conférence technique annuelle USENIX, FREENIX track, 91-100, USENIX, 2003.

Du lien:

... Nous avons modifié la mise en œuvre existante de rsync 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 de l'hôte cible sont mis à jour dans le même stockage occupé par la version actuelle du fichier. Les périphériques à espace restreint ne peuvent pas utiliser rsync traditionnel, car l'ancienne et la nouvelle version du fichier nécessitent de la mémoire ou du stockage. La synchronisation des fichiers sur les téléphones cellulaires et les ordinateurs de poche, par exemple, est faible. L'algorithme rsync sur place code la représentation comprimée d'un fichier dans un graphique, qui est ensuite trié topologiquement pour obtenir la propriété in-situ. [...]

Cela semble donc être les détails techniques de ce que fait rsync --inplace. Selon le début du papier:

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

Comme il ressort clairement de de la réponse de @ dataless , cela signifie que --inplace utilise le même espace de stockage, 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 utilise l’option --whole-file. Mais lorsqu'il est sur des systèmes en réseau, il suppose l'option --no-whole-file.

0
user92979