GNU/Linux >> Tutoriales Linux >  >> Linux

¿Diferencia binaria/parche para archivos grandes en Linux?

Probablemente debería echar un vistazo a las herramientas relacionadas con rsync:rdiff y rdiff-copia de seguridad .El rdiff El comando le permite producir un archivo de parche y aplicarlo a algún otro archivo.

El rdiff-backup El comando usa este enfoque para manejar directorios completos, pero supongo que está trabajando con imágenes de disco de un solo archivo, por lo que rdiff será el que se use.


xdelta puede hacer todo lo que quieras. Sin embargo, una advertencia justa si sus imágenes no son muy similar, puede terminar con un parche muy grande, porque xdelta usa la mitad del búfer de memoria definido para encontrar diferencias. Hay más información disponible en la página wiki de TuningMemoryBudget. Aumentar el tamaño del búfer puede ayudar bastante.

bsdiff es otra opción, pero es muy RAM hambrienta y completamente inapropiada para cualquier cosa del tamaño de una imagen de disco.

bsdiff tiene bastante hambre de memoria. Requiere max(17*n,9*n+m)+O(1) bytes de memoria, donde n es el tamaño del archivo antiguo y m es el tamaño del nuevo archivo. bmancha requiere n+m+O(1) bytes


Respuesta canónica

Con respecto a rdiff la publicación, librsync 2.0.1 es una buena lectura para la aclaración de la funcionalidad del comando, por lo que lo he mencionado a continuación para preservar el contenido de esta respuesta, al menos.

Es importante tratar de comprender bien los tres pasos de rdiff para actualizar un archivo:firma , delta y parche como se menciona en la página de manual de rdiff. También encontré un rdiff script de ejemplo de comando en GitHub que es útil, al que mencionaré y citaré.

Esencialmente...

  1. Con un archivo de "inicio" o base [file1 ] y creas un archivo de firma de eso
    • Esto suele ser mucho más pequeño que el propio archivo base/original
  2. Con el archivo de firma lo comparas con otro archivo [file2 ] similar a su archivo base pero diferente (por ejemplo, actualizado recientemente ) y cree un archivo delta que contiene solo las diferencias entre los dos archivos
  3. Utilice el archivo "solo diferencias" o delta y compárelo con su archivo base [file1 ] para generar un nuevo archivo que contenga los cambios del otro archivo [file2 ] haciendo coincidir los dos.

Comandos rápidos (por 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-ejemplo.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

Introducción

rdiff es un programa para calcular y aplicar deltas de red. Un rdiff delta es un delta entre archivos binarios, que describe cómo se puede editar automáticamente un archivo base (o antiguo) para generar un archivo de resultados (o nuevo).

A diferencia de la mayoría de los programas de diferencias, librsync no requiere acceso a ambos archivos cuando se calcula la diferencia. Calcular un delta requiere solo una breve "firma" del archivo antiguo y el contenido completo del archivo nuevo. La firma contiene sumas de verificación para bloques del archivo antiguo. Con estas sumas de verificación, rdiff encuentra bloques coincidentes en el archivo nuevo y luego calcula el delta.

Los deltas de rdiff suelen ser menos compactos y también más lentos para producir que los deltas de x o los diferenciales de texto regulares. Si es posible tener presentes tanto el archivo antiguo como el nuevo al calcular el delta, xdelta generalmente producirá un archivo mucho más pequeño. Si los archivos que se comparan son de texto sin formato, entonces GNU diff suele ser una mejor opción, ya que los humanos pueden ver las diferencias y aplicarlas como coincidencias inexactas.

rdiff se destaca cuando no es conveniente tener ambos archivos presentes al mismo tiempo. Un ejemplo de esto es que los dos archivos están en máquinas separadas y desea transferir solo las diferencias. Otro ejemplo es cuando uno de los archivos se ha movido a un medio de archivo o copia de seguridad, dejando solo su firma.

Simbólicamente

signature(basis-file) -> sig-file

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

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

Usar patrones

Una aplicación típica del algoritmo rsync es transferir un archivo A2 de una máquina A a una máquina B que tiene un archivo A1 similar. Esto se puede hacer de la siguiente manera:

  1. B genera la firma rdiff de A1. Llame a este S1. B envía la firma a A. (La firma suele ser mucho más pequeña que el archivo que describe).
  2. A calcula el delta rdiff entre S1 y A2. Llame a este delta D. A envía el delta a B.
  3. B aplica el delta para recrear A2. En los casos en que A1 y A2 contienen series de bytes idénticos, rdiff debería proporcionar un ahorro de espacio significativo.

fuente


Linux
  1. KRename:un potente renombrador de archivos por lotes para Linux

  2. 7 ejemplos de comandos de parches para aplicar archivos de parches de diferencias en Linux

  3. Cómo auditar modificaciones de archivos y ejecuciones de archivos en Linux

  4. Linux:elimine las extensiones de archivo para varios archivos

  5. Necesita un buen editor hexadecimal para Linux

Colaborar en un archivo usando Linux diff y patch

Copiar archivos en Linux

Encuentra archivos grandes en Linux

Comando Cp en Linux (Copiar archivos)

Cómo dividir archivos de audio grandes en Linux

Comando ls en Linux para listar archivos