“hard-linking” partes de um arquivo grande em que apenas uma pequena parte foi alterada

5

Eu uso o rsync para fazer backups:

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

Dessa forma, economizo espaço devido ao uso de links físicos.

O problema aparece quando eu preciso fazer backup de um arquivo enorme que está sempre mudando (imagem da máquina virtual).

É possível hardlink não toda a imagem, mas apenas as partes alteradas? Existe algum tipo de ferramenta que possa resolver isso?

    
por Anthony Ananich 27.03.2014 / 12:46

1 resposta

3

Existem várias coisas que podem ser feitas aqui. Observe que nenhum deles realmente usa links físicos, pois eles só podem apontar para um arquivo completo. Usar o sistema de arquivos btrfs abre algumas possibilidades muito úteis aqui. Observe que btrfs atualmente (a versão mais recente é v3.13) ainda é experimental. No entanto, sua habilidade COW (copy-on-write) é perfeita para isso tipo de coisa (desde claro que é aceitável ter o backup no mesmo sistema de arquivos). Considere um sistema de arquivos btrfs montado em /mnt , você pode fazer um instantâneo atômico de todo o sistema de arquivos com:

btrfs subvolume snapshot /mnt /mnt/snapshot

Para permitir instantâneos parciais, você precisa fazer o backup de seus arquivos dentro de um subvolume em vez de um diretório. Por exemplo:

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

Além de usar btfrs , você também pode considerar montar a imagem da máquina virtual em um ou ambos os lados do backup e usar rsync entre os dois pontos de montagem.

Este blog mostra como montar um Virtual Caixa .vdi imagem usando qemu-utils . Os comandos como root (não testados):

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

Por fim, a abordagem mais simples que pode ser útil é a opção --inplace para rsync . Na página do 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.

O problema aqui, é claro, é que não há nenhum benefício em usar isso em combinação com --link-dest (em rsync versões < 2.6.4 as duas são incompatíveis ao todo), pois uma cópia do arquivo ainda tem que ser criado no destino.

    
por 27.03.2014 / 14:00