«жесткое связывание» частей большого файла, в котором изменилась только небольшая часть

«жесткое связывание» частей большого файла, в котором изменилась только небольшая часть

Я использую rsync для создания резервных копий:

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

Таким образом я экономлю место за счет использования жестких ссылок.

Проблема возникает, когда мне нужно сделать резервную копию огромного файла, который постоянно меняется (образ виртуальной машины).

Можно ли сделать жесткую ссылку не на весь образ, а только на его измененные части? Есть ли какой-нибудь инструмент, который может это сделать?

решение1

Есть несколько вещей, которые можно сделать здесь. Обратите внимание, что ни одна из них на самом деле не использует жесткие ссылки, поскольку они могут указывать только на полный файл. Использование файловой системы btrfsоткрывает здесь некоторые очень полезные возможности. Обратите внимание, что btrfsв настоящее время (последняя версия v3.13) все еще экспериментальна. Однако ееКОРОВА(копирование при записи) идеально подходит для такого рода вещей (конечно, при условии, что резервная копия может быть размещена в той же файловой системе). Рассмотрим btrfsфайловую систему, смонтированную на /mnt, вы можете сделать атомарный снимок всей файловой системы с помощью:

btrfs subvolume snapshot /mnt /mnt/snapshot

Чтобы разрешить частичные снимки, вам необходимо поместить файлы для резервного копирования в , subvolumeа не в каталог. Например:

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

Помимо использования btfrs, вы также можете рассмотреть возможность монтирования образа виртуальной машины на одной или обеих сторонах резервной копии и использования rsyncмежду двумя точками монтирования.

Этот блогпоказывает, как смонтировать .vdiобраз Virtual Box с помощью qemu-utils. Команды от имени root (не проверено):

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

Наконец, самый простой подход, который может быть полезен, — это --inplaceвариант для rsync. Из страницы руководства:

--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.

Проблема здесь, конечно, в том, что нет никакой выгоды от использования этого в сочетании с --link-destrsyncверсиях <2.6.4 эти два варианта вообще несовместимы), поскольку копию файла все равно придется создавать в месте назначения.

Связанный контент