web-dev-qa-db-fra.com

Rsync vérifie-t-il les fichiers copiés entre deux disques locaux?

Je veux faire une nouvelle copie d'un grand nombre de fichiers d'un disque local à un autre.

J'ai lu que rsync fait une comparaison de somme de contrôle des fichiers lors de leur envoi vers une machine distante via un réseau.

  1. Est-ce que rsync fera la comparaison lors de la copie des fichiers entre deux disques locaux?

  2. S'il fait une vérification - est-ce une valeur sûre? Ou vaut-il mieux faire une comparaison octet par octet?

71
Frez

rsync utilise toujours des sommes de contrôle pour vérifier qu'un fichier a été transféré correctement. Si le fichier de destination existe déjà, rsync peut ignorer la mise à jour du fichier si l'heure et la taille de modification correspondent au fichier source, mais si rsync décide que les données doivent être transférées, les sommes de contrôle sont toujours utilisées sur le données transférées entre les processus rsync d'envoi et de réception. Cela vérifie que les données reçues sont les mêmes que les données envoyées avec une forte probabilité, sans la surcharge lourde d'une comparaison au niveau des octets sur le réseau.

Une fois les données du fichier reçues, rsync écrit les données dans le fichier et espère que si le noyau indique une écriture réussie, les données ont été écrites sans corruption sur le disque. rsync ne relit pas les données et ne les compare pas à la somme de contrôle connue en tant que vérification supplémentaire.

Quant à la vérification elle-même, pour le protocole 30 et au-delà (d'abord pris en charge dans 3.0.0), rsync utilise MD5 . Pour les protocoles plus anciens, la somme de contrôle utilisée est MD4 .

Bien que longtemps considérés comme obsolètes pour les hachages cryptographiques sécurisés, MD5 et MD4 restent adéquats pour vérifier la corruption de fichiers.

Source: la page de manuel et le globe oculaire pour vérifier le code source rsync.

88
Kyle Jones

rsync ne pas effectue la vérification post-copie pour les copies de fichiers locaux. Vous pouvez vérifier que ce n'est pas le cas en utilisant rsync pour copier un gros fichier sur un lecteur lent (c'est-à-dire USB), puis en copiant le même fichier avec cp, c'est-à-dire:

time rsync bigfile /mnt/usb/bigfile

time cp bigfile /mnt/usb/bigfile

Les deux commandes prennent environ le même temps, donc rsync ne peut pas faire la somme de contrôle, car cela impliquerait de relire le fichier de destination sur le disque lent.

La page man est malheureusement trompeuse à ce sujet. J'ai également vérifié cela avec strace— une fois la copie terminée, rsync n'émet aucun appel de read() sur le fichier de destination, il ne peut donc pas être en somme de contrôle. Encore une fois, vous pouvez le vérifier avec quelque chose comme iotop: vous voyez rsync faire lire et écrire simultanément (copier de la source vers la destination), puis il se ferme. S'il vérifiait l'intégrité, il y aurait une phase de lecture seule.

42
Felix

rsync fait une comparaison de somme de contrôle avant copie (dans certains cas), pour éviter de copier ce qui existe déjà. Le but de la comparaison de la somme de contrôle n'est pas de vérifier que la copie a réussi. C'est le travail de l'infrastructure sous-jacente: les pilotes de système de fichiers, les pilotes de disque, les pilotes de réseau, etc. Les applications individuelles telles que rsync n'ont pas besoin de s'embêter avec cette folie. Tout ce que rsync doit faire (et fait!) Est de vérifier les valeurs de retour des appels système pour s'assurer qu'il n'y a pas eu d'erreur.

Réponses rapides et sales, directement aux questions.

Q: rsync fera-t-il la comparaison lors de la copie des fichiers entre deux disques locaux? R: Il fera une comparaison pour savoir quoi copier.

Q: S'il effectue une vérification - est-ce une valeur sûre? Ou vaut-il mieux faire une comparaison octet par octet? R: aussi sûr que les mathématiques derrière la somme de contrôle MD5 du fichier. Vous pouvez essayer de faire une expérience simple pour apprendre et faire confiance à l'outil.

Réponse longue: je suppose que vous vouliez que rsync fasse une comparaison de fichiers (bit par bit ou par somme de contrôle) après avoir copié des fichiers. Si vous êtes l'un des rares à valoriser l'intégrité des données, vous trouverez peut-être les informations ci-dessous utiles:

rsync -avh [source] [destination] && rsync -avhc [source] [destination] 

au-dessus du code rsync dossier de fichiers lors de la première exécution et s'il est terminé sans problème, exécutera à nouveau rsync immédiatement tout en effectuant la même comparaison de nom de fichier en utilisant le hachage de tout le fichier.

6
M.N.

Utilisation de rsync pour vérifier l'intégrité d'un doublon

Pour garantir que ce test relit physiquement les fichiers à partir du support du lecteur, je suggère d'éteindre les deux lecteurs et de les redémarrer avant d'exécuter ce test. Cela effacera leurs caches volatils internes.

Si vous ne redémarrez pas également Linux, vous devez au moins supprimer les caches ( * ) avec:

Sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

Ensuite, relisez les deux arbres et comparez leurs sommes de contrôle:

rsync --dry-run --checksum --itemize-changes --archive SRC DEST

La somme de contrôle rsync moderne utilise MD5, qui est de 128 bits. La probabilité que cela ne détecte pas une erreur dans un fichier individuel est astronomiquement faible (une discussion ici ), mais pas impossible.

3
nobar