J'ai deux fichiers de 300 Go sur différents volumes:
De par leur conception, ces deux fichiers ont une taille identique et également la plupart du temps (> 90%) du même contenu ...
Existe-t-il un outil efficace pour "rsync" ces fichiers, et ne copie que sur les différentes sections, de sorte que le fichier cible devienne identique au fichier source?
Peut-être que quelque chose qui construit des sommes de contrôle de blocs pour le comprendre, je ne sais pas ... (quelque chose de plus efficace que cp -f
... rsync aurait toujours pris le fichier source entier pour l'écraser)
rsync
peut être utilisé pour cela.
Les paramètres --no-whole-file
ou --no-W
utilisent la synchronisation au niveau du bloc au lieu de la synchronisation au niveau du fichier.
Cas de test
Génération de fichiers texte aléatoires à l'aide de /dev/random
et de gros morceaux de fichier texte provenant de sites Web, comme suit. Ces 4 fichiers sont différents dans tous les contenus. tf_2.dat
est notre fichier cible.
~/logs/rs$ ls -tlh
-rw-rw-r-- 1 vayu vayu 2.1G 二 25 23:11 tf_2.dat
-rw-rw-r-- 1 vayu vayu 978M 二 25 23:11 a.txt
-rw-rw-r-- 1 vayu vayu 556K 二 25 23:10 file2.txt
-rw-rw-r-- 1 vayu vayu 561K 二 25 23:09 nt.txt
Puis copiez-les sur un disque dur différent en utilisant rsync
(la destination est vide).
rsync -r --stats rs/ /mnt/raid0/scratch/t2
La statistique suivante a été reçue.
Number of files: 5 (reg: 4, dir: 1)
Number of created files: 0
Number of deleted files: 0
Number of regular files transferred: 4
Total file size: 3,260,939,140 bytes
Total transferred file size: 3,260,939,140 bytes
Literal data: 3,260,939,140 bytes
Matched data: 0 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 3,261,735,553
Total bytes received: 92
sent 3,261,735,553 bytes received 92 bytes 501,805,483.85 bytes/sec
total size is 3,260,939,140 speedup is 1.00
Maintenant, je fusionne les fichiers pour créer un nouveau fichier contenant environ 60% de données anciennes.
cat file2.txt a.txt >> tf_2.dat
Maintenant, je synchronise les deux dossiers, cette fois en utilisant l'option --no-W
.
rsync -r --no-W --stats rs/ /mnt/raid0/scratch/t2
Number of files: 5 (reg: 4, dir: 1)
Number of created files: 0
Number of deleted files: 0
Number of regular files transferred: 4
Total file size: 4,289,593,685 bytes
Total transferred file size: 4,289,593,685 bytes
Literal data: 1,025,553,047 bytes
Matched data: 3,264,040,638 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 1,026,127,265
Total bytes received: 611,604
sent 1,026,127,265 bytes received 611,604 bytes 21,169,873.59 bytes/sec
total size is 4,289,593,685 speedup is 4.18
Vous pouvez voir que des données volumineuses sont mises en correspondance et accélérées.
Ensuite, je réessaye, cette fois je fusionne plusieurs fichiers Shell avec la cible (tf_2.dat
) de telle sorte que le changement soit ~ 2%,
cat *.sh >> rs/tf_2.dat
Et synchronisez à nouveau avec rsync
.
rsync -r --no-whole-file --stats rs/ /mnt/raid0/scratch/t2
Number of files: 5 (reg: 4, dir: 1)
Number of created files: 0
Number of deleted files: 0
Number of regular files transferred: 4
Total file size: 4,289,727,173 bytes
Total transferred file size: 4,289,727,173 bytes
Literal data: 178,839 bytes
Matched data: 4,289,548,334 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 541,845
Total bytes received: 690,392
sent 541,845 bytes received 690,392 bytes 43,236.39 bytes/sec
total size is 4,289,727,173 speedup is 3,481.25
Nous voyons un grand match et une accélération donnant une synchronisation rapide.
Vous pouvez également essayer d'utiliser https://bitbucket.org/ppershing/blocksync (disclaimer: je suis l'auteur de ce fork). Un avantage sur rsync est qu’il ne lit le fichier qu’une seule fois (pour autant que je sache, rsync ne peut pas être convaincu de supposer que deux fichiers sont différents sans calculer la somme de contrôle avant de commencer le transfert delta. Inutile de dire que deux lecteurs de disque dur de 160 Go sont lus n'est pas une bonne stratégie). Attention - la version actuelle de blocksync fonctionne bien avec des connexions RTT courtes (par exemple, localhost, LAN et WiFi local) mais n'est pas particulièrement utile pour la synchronisation sur de longues distances.