Инкрементные резервные копии изображений ntfsclone
Я пытаюсь сделать сжатые инкрементные резервные копии раздела Windows, используя ntfsclone в Linux. В настоящее время я делаю полные образы ntfsclone, используя что-то вроде следующей команды:
sudo ntfsclone -s -t -o - /dev/sda2 | xz -zc > new-backup.ntfsclone.xz
Я хотел бы выполнить инкрементное резервное копирование, создав дельта-файл с использованием предыдущей резервной копии и выходного потока ntfsclone, а не создавать новый образ ntfsclone при каждом сеансе резервного копирования.
Я понимаю, что создавать различия в двоичных файлах непросто, и что для этого существует несколько инструментов (rdiff, xdelta, bsdiff и т. Д.); однако все они требуют наличия двух исходных файлов на диске и не могут сравнивать данные непосредственно из выходных потоков.
Другими словами, есть ли решения для двоичных потоков, которые делают что-то вроде следующей команды?
diff -u <(xz -dc old-backup.ntfsclone.xz) \
<(sudo ntfsclone -s -t -o - /dev/sda2) \
| xz -zvc > new-backup.ntfsclone.delta.xz
Очевидно, что приведенная выше команда не работает, но я хотел бы иметь возможность распаковать старое изображение, сравнить его с ntfsclone-представлением раздела Windows и создать сжатый дельта-образ из сравнения за один шаг.
Несколько условий:
- Процесс должен использовать ntfsclone
- Дельты должны быть исправлены непосредственно на диск
- Желательно, чтобы все происходило за один шаг
Также возможно (и может быть предпочтительнее) создать дельта-файл, восстановив изображение ntfsclone в pipe и создавая diff, сравнивая непосредственно с /dev/sda2
, поскольку это, вероятно, приведет к созданию меньшего выходного файла, но это усложнит фильтрацию нераспределенного дискового пространства.
(То есть мы должны обнулить неиспользуемое дисковое пространство или сделать что-то вроде diff -u <(xz -dc old-backup.ntfsclone.xz | ntfsclone -r -t -o - -) <(sudo ntfsclone -t -o - /dev/sda2) | xz -zc > new-backup.img.delta.xz
чтобы предотвратить архивирование всех данных удаленного файла. Тьфу!)
Любой берущий?
ПРИМЕЧАНИЕ: инструмент под названием ntfsddup от Wei Dong действительно существует для почти точного выполнения этого, но мне трудно заставить эту чертову вещь работать. Программное обеспечение находится на ОЧЕНЬ ранних стадиях и требует много работы.
2 ответа
Я успешно использовал инструмент под названием bup (на основе git), который может эффективно хранить большие двоичные файлы, которые отличаются незначительно. Это также очень хорошо работает с NFS, что удобно для меня, потому что у меня есть сервер NFS с большим количеством места, где я храню данные:
например, для резервного копирования образов ntfs с моего ноутбука (diaz)
export BUP_DIR=/mnt/t3/big1/diaz/ntfsbup
ntfsclone -s -o - /dev/sda2 | bup split -n sda2.img
восстановить (на другой диск):
bup join sda2.img | ntfsclone -r -O /dev/sdb9 -
или предыдущая версия:
bup join sda2.img^ | ntfsclone -r -O /dev/sdb9 -
или же
bup join sda2.img~2 | ntfsclone -r -O /dev/sdb9 -
Некоторое время назад я написал программу, которая создает эффективные дельты между изображениями ntfsclone.
https://github.com/koljanowak/ntfscloneimgdelta
Это было особенно легко, потому что формат файлов изображений ntfsclone довольно прост. По сути, они представляют собой просто серию байтов, говорящих "1: здесь идет следующий кластер ntfs", за которым следует один кластер ntfs, или "0: следующий кластер не использовался", за которым ничего не стоит. Мой дельта-файл использует точно такой же формат файла, добавив третий случай "2: следующий кластер был идентичен на обоих изображениях", за которым ничего не стоит.
Usage: ntfscloneimgdelta delta OLDFILE [NEWFILE [DELTA]]
ntfscloneimgdelta patch OLDFILE [DELTA [NEWFILE]]
OLDFILE и NEWFILE не обязательно должны быть в порядке возрастания, вы можете просто поменять их местами для создания обратных дельт. Это позволяет вам всегда иметь последнюю резервную копию в виде полного дампа, а старые резервные копии сохранять в виде дельт.
Пропуск имен файлов или замена их на '-' использует stdin или stdout. Таким образом, вы можете взять новый дамп раздела и создать обратную дельту между этим дампом и предыдущим дампом за один раз.