Rsync : possibilité de reprendre au bloc près
Résolulenainjaune Messages postés 771 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour à tou.te.s :D,
Question simple, mais réponse par forcément.
J'utilise souvent rsync pour m'assurer que j'ai bien les bonnes données entre la source et la cible. Souvent je copie des gros fichiers et parfois il peut arriver que la connexion s'interrompe (coupure de courant, de VPN) et je ne sais pas si c'est possible de reprendre la synchro au point où elle en était. Je ne veux pas dire au niveau fichier, ça je sais que c'est le rôle de ce programme mais au niveau "bloc" (si je ne me trompe pas dans la terminologie).
En bref, comment reprendre une synchro en perdant le moins de temps à refaire ce qui a déjà été fait ?
Un autre outil mieux adapté ?
Si quelqu'un.e peut m'éclairer sur le sujet et m'accorder un peu de son temps ce serait vraiment chouette.
Avec adelphité,
lnj
Linux / Firefox 145.0
3 réponses
Bonjour
Point lecture un excellent topic à ce sujet (lien).
En résumé, ajouter les options --partial et --append-verify
--partial pour garder la partie commencée, --append-verify pour, en cas de coupure, lancer un checksum des 2 parties partielles avant de poursuivre.
Si envie de gagner le maximum de temps au risque d'une corruption, --append seul sans verify.
Sinon, rclone (lien) vaut le coup d'œil.
Retour rapide car je ne comprends pas tout.
Avant j'utilisais par habitude et simplification rsync -aP ce qui me permettait de synchroniser les fichiers en mode mirroir (-a = -rlptgoD) en affichant la progression (-P = --partial --progress)
Avec -aP, je viens de constater c'est que si le fichier source n'existe pas dans cible, il est nommé en fichier caché .[source].AAA (AAA étant une chaine unique aléatoire) et si j'interromps il est renommé en [source] donc NON caché mais à priori il semble inutilisable pour une future reprise.
Si je relance ma synchro, il créée un nouveau fichier caché avec un autre AAA MAIS si j'interromps à nouveau cette fois, le fichier est supprimé au bout d'un certain temps donc je ne peux pas le reprendre (si j'utilise sync je vois que la commande mets du temps à s'achever) et le premier fichier téléchargé est conservé.
En revanche si je complète -aP par --append-verify cette fois il me créée directement le fichier source dans cible, il est NON caché et NON suffixé par AAA. Si j'interromps le fichier reste en l'état. Si je reprends la synchro reprend là où elle en était.
Pour l'exemple j'ai essayé de synchroniser par VPN un fichier de 20GB (vHD au format qcow2 pour virtualisation Qemu/KVM) en interrompant le processus. Quand je relance le téléchargement il met ~2min pour reprendre là où il en était (dans mon cas, le débit mesuré avec iperf est de 2.45MB/s par le VPN).
Pour info voici la commande (ici je limite à 1000 octets/s pour alléger le trafic du réseau source et en passant par le port de rebond 10022 de mon système VPN) :
rsync -aP --append-verify \ -e "ssh -p 10022" \ --bwlimit=1000 \ root@vpn.local:/root/vhd.qcow2 /root/
Okay, le -aP fait ce qu'on attendait MAIS on n'a plus le fichier temp pendant la copie.
J'ai creusé la doc et on a une "incompatibilité" disons.
- --append-verify permet la future reprise rapidement MAIS DANS le fichier de destination directement, sans qu'il soit "caché" façon .file_name_AAA
- il y a une option --partial-dir mais c'est incompatible avec --append-verify comme expliqué ici (lien) :
- partial files don't get written to the partial-dir until the connection fails. Then any incomplete temporary files get moved to the partial-dir. Upon resuming, the partial files are written to in-place.
- Ce faisant, ce déplacement modifie les checksum de blocs puisque sur des blocs différents.
- ll y a plein d'autres topics concernent ce sujet, je ne mets pas les liens mais pas mal sont concernés et en parlent.
Je vois encore une solution :
- Faire une copie dans un répertoire caché avec un . comme .temprsync :
rsync -aP --append-verify \ -e "ssh -p 10022" \ --bwlimit=1000 \ root@vpn.local:/root/vhd.qcow2 /root/.temprsync
-
Si réussite :
mv .temprsync/* ./
Coucou meilleurs vœux et beaucoup de bonheur pour cette nouvelle année ;)
Désolé du délais, mais mon état de santé fluctue aussi, j'ai des difficultés à rester constant.
En fait, j'avais déjà réussi à le faire fonctionner comme je voulais grâce à --append-verify mais ce que j'ai relevé d'après mes expérimentations, c'est que le manuel est trompeur avec -P.
La suite dans le fil principal ...
Le manuel :
rsync -h | grep -E '\-P|--partial ' # --partial keep partially transferred files # -P same as --partial --progress
Donc selon ce dernier j'ai juste besoin de -P
J'ai fait tout un tas d'expérimentations (dont je n'ai pas retrouvé de traces car l'organisation n'est pas mon fort), mais ce dont je me souviens c'est qu'avec -P ... :
- ... et PAS --append-verify, le fichier est nommé aléatoirement (nom cryptique) en tant que fichier caché ; si ça coupe le fichier est supprimé
- ... et --append-verify, le fichier est nommé tel quel en tant que fichier non caché ; si ça coupe le fichier est conservé
Avant quand je démarrais par ssh une tâche de synchro qui se révélait chronophage, j'annulais et reprenais dans une session screen, ce qui me faisait perdre le bénéfice du téléchargement déjà effectué.
Pour information au final, j'utilise cette commande :
rsync -vvvvaP --append-verify --log-file=journal_synchro.log \ -e "ssh -p 10022" --bwlimit=1000 \ root@vpn.local:/dossier/source /dossier/cible
qui me permet de synchroniser des gros fichiers sans risque de perte (ici je limite à 1000 octets/s pour alléger le trafic du réseau source, en passant par le port de rebond 10022 de mon système VPN) ; ici j'ai également rendu la commande très bavarde (-vvv) pour voir ce qui se passe (la phase analyse de pré-reprise, ne révèle aucune activité, je n'ai pas réussi à surveiller cette progression) et je journalise l'action dans le dossier local depuis lequel j'exécute la commande (--log-file=...)
Note : quand je relance le téléchargement pour un fichier de 80 GB il met 10 min avant reprendre là où il en était (pré-reprise) dans mon cas, pour un débit mesuré avec iperf de 2.45MB/s par le VPN.
Enfin, je n'ai pas compris comment la source pouvait vérifier ce qui était effectivement synchronisé sur la cible, vu qu'il n'y a pas de fichier supplémentaire ; ça reste une énigme.
En outre, je viens de constater par hasard avec surprise qu'une copie interrompue entre 2 systèmes Windows donc avec une partie effective partiellement copiée (le fichier faisait déjà la taille de la source bien que la copie des données "utiles" n'était pas achevée), j'ai alors testé de faire comme si j'avais interrompu la synchronisation avec rsync et le processus a repris là où il avait été interrompu
=> je ne sais pas comment ça fonctionne sous le capot, mais c'est vraiment bien pensé !
---
En complément, pour finir je voulais partager une trouvaille ...
Récemment j'ai découvert repytr (source) qui permet d'attacher/détacher facilement les processus. Donc maintenant je peux interrompre une tâche trop chronophage pour la reprendre ultérieurement depuis un autre terminal attaché avec screen par exemple sans perdre le bénéfice de ce qui a déjà été accompli.
Donc problème résolu et gratitude pour le temps que tu m'as accordé ;) . Je me sens mieux outillé
=> Génial :D !
A bientôt !
lnj
Oh la réponse n'a pas tardé à venir, je te remercie :) je vais étudier tout ça et ferais un retour