18 votes

Binary diff/patch pour les gros fichiers sous linux ?

J'ai deux images de partition (A et B) et je veux les utiliser pour créer un patch que je peux appliquer sur A sur un autre ordinateur afin d'obtenir la nouvelle image B sans inonder le réseau. J'ai les exigences suivantes :

  • fonctionne sous Linux
  • peut créer des diffs
  • peut utiliser les diffs pour corriger les fichiers
  • peut traiter des fichiers binaires
  • peut gérer des fichiers volumineux (quelques centaines de Go devraient suffire)
  • aucune interaction avec l'utilisateur n'est requise (juste une application console)
  • Idéalement, il devrait être capable de lire et d'écrire dans des tuyaux (de sorte que je puisse y entrer à partir d'un fichier compressé par gzip et écrire dans un autre).

Est-ce que quelque chose comme ça existe ?

14voto

njd Points 10568

Vous devriez probablement jeter un coup d'œil aux outils liés à rsync : rdiff y rdiff-backup . Le site rdiff vous permet de produire un fichier patch et de l'appliquer à un autre fichier.

El rdiff-backup utilise cette approche pour traiter des répertoires entiers, mais je suppose que vous travaillez avec des images de disque à fichier unique, donc la commande rdiff sera celui à utiliser.

9voto

afrazier Points 22479

xdelta peut faire tout ce que vous voulez. Un avertissement cependant, si vos images ne sont pas よほど similaire, vous pouvez vous retrouver avec un patch très volumineux, car xdelta utilise la moitié de la mémoire tampon définie pour trouver les différences. De plus amples informations sont disponibles sur le site TuningMemoryBudget page wiki. Augmenter la taille de la mémoire tampon peut être d'une grande aide.

bsdiff est une autre option, mais c'est よほど Très gourmand en RAM et complètement inapproprié pour tout ce qui a la taille d'une image disque.

bsdiff est assez gourmand en mémoire. Il requiert max(17*n,9*n+m)+O(1) octets de mémoire, où n est la taille de l'ancien fichier et m est la taille du nouveau fichier. bspatch nécessite n+m+O(1) octets.

7voto

Réponse canonique

Concernant rdiff le poste, librsync 2.0.1 est une bonne lecture pour la clarification de la fonctionnalité de la commande. Je l'ai donc référencé ci-dessous pour préserver le contenu de cette réponse, si rien d'autre.

Il est important d'essayer d'avoir une bonne compréhension de la rdiff trois étapes pour mettre à jour un fichier : signature , delta y patch comme cela a été dit sur le rdiff page de manuel. J'ai également trouvé une rdiff exemple de commande script sur GitHub qui est utile et que je vais référencer et citer.

Essentiellement...

  1. Avec un fichier de "départ" ou de base [ file1 ] et vous créez un fichier de signature à partir de celui-ci
    • Il est généralement beaucoup plus petit que le fichier de base/original lui-même.
  2. Avec le fichier de signature vous le comparez à un autre fichier [ file2 ] similaire à votre fichier de base mais différent ( par exemple, récemment mis à jour ) et créer un fichier delta contenant uniquement les différences entre les deux fichiers
  3. Utilisez les options "différences seulement" ou fichier delta et le comparer avec votre fichier de base [ file1 ] pour générer un nouveau fichier contenant les changements de l'autre fichier [ file2 ] en faisant correspondre les deux.

Commandes rapides (par rdiff-example.sh )

rdiff signature file1 signature-file            ## signature base file1
rdiff delta signature-file file2 delta-file     ## delta differences file2
rdiff patch file1 delta-file gen-file           ## compare delta to file1 to create matching file2

rdiff-example.sh

# $ rdiff --help
# Usage: rdiff [OPTIONS] signature [BASIS [SIGNATURE]]
#              [OPTIONS] delta SIGNATURE [NEWFILE [DELTA]]
#              [OPTIONS] patch BASIS [DELTA [NEWFILE]]

# Options:
#   -v, --verbose             Trace internal processing
#   -V, --version             Show program version
#   -?, --help                Show this help message
#   -s, --statistics          Show performance statistics
# Delta-encoding options:
#   -b, --block-size=BYTES    Signature block size
#   -S, --sum-size=BYTES      Set signature strength
#       --paranoia            Verify all rolling checksums
# IO options:
#   -I, --input-size=BYTES    Input buffer size
#   -O, --output-size=BYTES   Output buffer size

# create signature for old file
rdiff signature old-file signature-file
# create delta using signature file and new file
rdiff delta signature-file new-file delta-file
# generate new file using old file and delta
rdiff patch old-file delta-file gen-file
# test
diff -s gen-file new-file
# Files gen-file and new-file are identical

Introduction

rdiff est un programme pour calculer et appliquer des deltas de réseau. Un delta rdiff est un delta entre des fichiers binaires, décrivant comment un fichier de base (ou ancien) peut être automatiquement édité pour produire un fichier résultat (ou nouveau).

Contrairement à la plupart des programmes de diff, librsync n'a pas besoin d'accéder à la fois à fichiers lorsque la différence est calculée. Le calcul d'un delta nécessite juste une courte "signature" de l'ancien fichier et le contenu complet du nouveau fichier. fichier. La signature contient des sommes de contrôle pour les blocs de l'ancien fichier. En utilisant ces sommes de contrôle, rdiff trouve les blocs correspondants dans le nouveau fichier, et calcule ensuite le delta.

Les deltas de rdiff sont généralement moins compacts et aussi plus lents à produire que les deltas de xdeltas ou les diffs en texte normal. S'il est possible d'avoir à la fois l'ancien et le nouveau fichier fichiers présents lors du calcul du delta, xdelta produira généralement un produira généralement un fichier beaucoup plus petit. Si les fichiers à comparer sont en texte brut, alors GNU diff est généralement un meilleur choix, car les différences peuvent être être vues par des humains et appliquées comme des correspondances inexactes.

rdiff est utile lorsqu'il n'est pas pratique d'avoir les deux fichiers en même temps. présents en même temps. Un exemple de ceci est que les deux fichiers sont sur des machines séparées, et vous voulez transférer seulement les différences. Un autre exemple est celui où l'un des fichiers a été déplacé vers un support d'archivage ou de sauvegarde. vers un support d'archives ou de sauvegarde, ne laissant que sa signature.

Symboliquement

signature(basis-file) -> sig-file

delta(sig-file, new-file) -> delta-file

patch(basis-file, delta-file) -> recreated-file

Utiliser des modèles

Une application typique de l'algorithme rsync est de transférer un fichier A2 d'une machine A à une machine B qui possède un fichier similaire A1. Ceci peut faire comme suit :

  1. B génère la signature rdiff de A1. Appelons-la S1. B envoie la signature à A. (La signature est généralement beaucoup plus petite que le fichier qu'elle décrit). qu'elle décrit).
  2. A calcule le delta de rdiff entre S1 et A2. Il appelle ce delta D. A envoie le delta à B.
  3. B applique le delta pour recréer A2. Dans les cas où A1 et A2 contiennent des séries d'octets identiques, rdiff devrait permettre un gain de place significatif. d'espace.

source

1voto

totti Points 842

JDIFF est un programme qui affiche les différences entre deux fichiers (binaires).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X