"vincular" partes de un archivo grande en el que solo una pequeña parte ha cambiado

"vincular" partes de un archivo grande en el que solo una pequeña parte ha cambiado

Utilizo rsync para hacer copias de seguridad:

rsync -a --link-dest=PATHTO/$PREVIOUSBACKUP $SOURCE $CURRENTBACKUP

De esta manera ahorro espacio gracias al uso de enlaces físicos.

El problema aparece cuando necesito hacer una copia de seguridad de un archivo enorme que siempre cambia (imagen de máquina virtual).

¿Es posible vincular no toda la imagen, sino solo las partes cambiadas? ¿Existe algún tipo de herramienta que pueda encargarse de esto?

Respuesta1

Hay varias cosas que se podrían hacer aquí. Tenga en cuenta que ninguno de ellos utiliza enlaces físicos, ya que sólo pueden apuntar a un archivo completo. El uso del btrfssistema de archivos abre aquí algunas posibilidades muy útiles. Tenga en cuenta que btrfsactualmente (la versión más reciente es la v3.13) todavía es experimental. Sin embargo, suVACALa capacidad (copiar en escritura) es perfecta para este tipo de cosas (siempre y cuando, por supuesto, sea aceptable tener la copia de seguridad en el mismo sistema de archivos). Considere un btrfssistema de archivos montado en /mnt, puede hacer una instantánea atómica de todo el sistema de archivos con:

btrfs subvolume snapshot /mnt /mnt/snapshot

Para permitir instantáneas parciales, debe colocar sus archivos para realizar una copia de seguridad dentro de un subvolumedirectorio en lugar de un directorio. P.ej:

btrfs subvolume create /mnt/subvol
mv stuff /mnt/subvol
btrfs subvolume snapshot /mnt/subvol /mnt/subvol_snapshot

Además de usar btfrs, también podría considerar montar la imagen de la máquina virtual en uno o ambos lados de la copia de seguridad y usarla rsyncentre los dos puntos de montaje.

este blogmuestra cómo montar una .vdiimagen de Virtual Box usando qemu-utils. Los comandos como root (no probado):

modprobe nbd
qemu-nbd -c /dev/nbd0 <vdi-file>
mount /dev/nbd0p1 /mnt
...
umount /mnt
qemu-nbd -d /dev/nbd0

Finalmente, el enfoque más simple que puede ser de alguna utilidad es la --inplaceopción para rsync. Desde la página de manual:

--inplace
          This option changes how rsync transfers a file when its data needs to
          be updated: instead of the default method of creating a new copy of the
          file and moving it into place when it is complete, rsync instead writes
          the updated data directly to the destination file.
...
          This option is useful for transferring large files with block-based
          changes or appended data, and also on systems that are disk bound, not
          network bound.

El problema aquí, por supuesto, es que no hay ningún beneficio al usar esto en combinación con --link-dest(en rsyncversiones <2.6.4, los dos son completamente incompatibles), ya que aún será necesario crear una copia del archivo en el destino.

información relacionada