В качестве «пробы пера» накатал bash-скрипт, создающий инкрементные tar.gz архивы. Вроде все пакует, но вот беда: в следующие тома добавляются не новые и изменившиеся файлы, а вообще все. Почему - так и не разобрался.
Сперва создается полный архив (запускаю скрипт с ключом -t f):
~/docs$ ./backuper.bash -t f --verbose
TYPE: 'F'
BACKUP_NAME: ''
BASE_VOLUME: ''
VERBOSE: 'true'
Choosing backup name automatically...
Examing backups storage '/home/liber/docs/backups/' for last backup...
Backup name 'debsrv_20130207_1' is chosen.
Choosing archive volume name...
Archive volume name 'debsrv_20130207_1__001f' is choshen.
This is full backup archive. No base volume needed.
Preparing directories and meta data for new volume...
NO META FILE!!!!
... done!
Archive creation command:
/bin/tar \
--create \
--ignore-failed-read \
--one-file-system \
--preserve-permissions \
--recursion \
--sparse \
--totals \
--wildcards \
--verbose \
--checkpoint=100 \
--gzip \
--file=/home/liber/docs/backups/debsrv_20130207_1/debsrv_20130207_1__001f.tar.gz \
--listed-incremental=/home/liber/docs/backups/debsrv_20130207_1/meta/debsrv_20130207_1__001f.meta \
--exclude-from=/home/liber/docs/backups/backup_excludes \
--exclude-backups \
--exclude-caches \
/home/liber/docs/
... executing:
/bin/tar: Удаляется начальный `/` из имен объектов
/home/liber/docs/NAT
/home/liber/docs/_err.txt
/home/liber/docs/_out.txt
/home/liber/docs/backuper.bash
/home/liber/docs/backuper.bash.back
/home/liber/docs/backuper.bash.back2
/bin/tar: /home/liber/docs/filename: Предупреждение: Функция open завершилась с ошибкой: Отказано в доступе
/home/liber/docs/tst
/home/liber/docs/tst2
Всего записано байт: 40960 (40KiB, 14MiB/s)
... done!
Preparing backup and system info for new volume...
... done!
Все норм, претензий нет.
А теперь создаю в архивируемой директории файл somenewshit.txt. Насколько я понимаю принцип инкрементного архивирования, в новом томе должен быть он один.
Запускаю с ключом -t d. При этом копируется файл с мета-данными, созданный при первой архивации (с тем, чтобы можно было делать как инкрементные, так и разностные, и инкрементные от разностных тома) и скармливается tar'у:
~/docs$ ./backuper.bash -t d --verbose
TYPE: 'D'
BACKUP_NAME: ''
BASE_VOLUME: ''
VERBOSE: 'true'
Choosing backup name automatically...
Examing backups storage '/home/liber/docs/backups/' for last backup...
'debsrv_20130207_1' is last backup in storage!
Backup name 'debsrv_20130207_1' is chosen.
Choosing archive volume name...
'debsrv_20130207_1__001f' is last volume of this backup.
Archive volume name 'debsrv_20130207_1__002d' is choshen.
Choosing base volume automatically...
Base volume 'debsrv_20130207_1__001f' chosen.
Preparing directories and meta data for new volume...
... done!
Archive creation command:
/bin/tar \
--create \
--ignore-failed-read \
--one-file-system \
--preserve-permissions \
--recursion \
--sparse \
--totals \
--wildcards \
--verbose \
--checkpoint=100 \
--gzip \
--file=/home/liber/docs/backups/debsrv_20130207_1/debsrv_20130207_1__002d.tar.gz \
--listed-incremental=/home/liber/docs/backups/debsrv_20130207_1/meta/debsrv_20130207_1__002d.meta \
--exclude-from=/home/liber/docs/backups/backup_excludes \
--exclude-backups \
--exclude-caches \
/home/liber/docs/
... executing:
/bin/tar: Удаляется начальный `/` из имен объектов
/home/liber/docs/NAT
/home/liber/docs/_err.txt
/home/liber/docs/_out.txt
/home/liber/docs/backuper.bash
/home/liber/docs/backuper.bash.back
/home/liber/docs/backuper.bash.back2
/bin/tar: /home/liber/docs/filename: Предупреждение: Функция open завершилась с ошибкой: Отказано в доступе
/home/liber/docs/somenewshit.txt
/home/liber/docs/tst
/home/liber/docs/tst2
Всего записано байт: 40960 (40KiB, 12MiB/s)
... done!
Preparing backup and system info for new volume...
... done!
И - фигак! Почему-то снова запаковываются все файлы, что подтверждается при просмотре архива в mc.
Первым делом подумал, что-то не то с копированием файла с метаданными (в пути ошибся или еще чего). Но с этим все ровно. Добавил в скрипт условие, проверяющее наличие файла метаданных перед запуском архивации (выводит «NO META FILE!!!!» - см. первый вывод при полном архивировании), а также дублировал команду копирования (первый раз копирует в файл, скармливаемый тару при архивировании, второй - просто в проверочный файл). Все в порядке: проверочный файл - точная копия метаданных первого (полного) архива.
Для чистоты эксперимента потом еще все то же самое проделал вручную (ввод команд в консоль, копирование метафайлов и т.д.) - все повторяется в точности.
А если предположить, что в новом томе файлы предыдущего тома просто отображаются - то почему объемы одинаковые у обоих томов?.. Длина newshit'а - пара байт.
Погуглил, покопался в статейках на эту тему, почитал man... ничего на ум не идет! Может, что-то в опциях не то (но все по писанному, мож статьи кривые попались?..).
Что я проморгал?
Спасибо!
P.S. ОС Debian Squeeze, tar v.1.23-2