LINUX.ORG.RU
ФорумAdmin

tar: инкременты не инкрементятся...


0

2

В качестве «пробы пера» накатал 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



что подтверждается при просмотре архива в mc.

просматривай tar tf, а то mc кеширует

Да, и еще - дебажить чей-то скрипт унылое занятие, попробуй воспроизвести «проблему» на простом tar с минимумом нужных ключей.

Bers666 ★★★★★ ()
Последнее исправление: Bers666 (всего исправлений: 1)
Ответ на: комментарий от Bers666

просматривай tar tf, а то mc кеширует

Не думаю, что в этом дело. ls -la показывает 2 архива почти одинакового размера ~6 кб. При том, что добавленные в директорию перед разностным архивированием файлы и на 100 б не тянут. Но сейчас проверю.

Liber ()
Ответ на: комментарий от Bers666

Да, и еще - дебажить чей-то скрипт унылое занятие, попробуй воспроизвести «проблему» на простом tar с минимумом нужных ключей.

Скрипт-то мой ) Хотя команда на создание архива взята из статьи, да. Вручную пробовал, но с теми же ключами.

Значит придется методом тыка...

Liber ()
Ответ на: комментарий от Liber

Вот глупый чукча! Ну чего было не глянуть сразу в обсуждение статьи?.. Кажется, в --wildcards все дело. Сейчас проверю...

Liber ()
Ответ на: комментарий от Liber

Ну вот и снова здрасьте!

Отладил, в тестовой директории все работает прекрасно. Создаются и полные архивы, и разностные, и инкрементные.

Начал проверку в «полевых условиях» (архивирование /), начались глюки. При этом все «виртуальные» директории из архивации, конечно, исключены. Вот содержимое фала 'backup_excludes':

dev/*
lost+found/*
media/*
mnt/*
proc/*
selinux/*
storage/*
sys/*
tmp/*
var/cache/*

Полный архив делает на ура. А когда пытаюсь сделать инкрементный, мой скрипт отрабатывает нормально (т.е. команда архивации со всеми опциями генерируется правильно), а вот tar выдает ошибку сегментирования (пробовал ручками в консоли, с минимумом опций - то же самое).

Пошарился на официальном сайте http://www.gnu.org/software/tar/#downloading

В ченджлоге последней версии 1.26 (у меня сейчас стоит 1.23 - шла вместе с Debian 6.0.6) есть такая вот запись:

Fix bug with --one-file-system --listed-incremental

Возможно, это оно самое... Только вот беда: у меня опыт установки чего-либо под никсами нулевой. Почитал install, вроде все просто (`./configure; make; make install'), но вот что настораживает:

By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc

А у меня сейчас тар расположен в /bin/tar

Может быть, меня мучат виндузячие стереотипы, но не дает покоя мысль: «а не получилось бы конфликтов...». Как мне лучше быть? Таки инсталлить его по умолчанию (тогда 2 тара будет в системе, верно?) и в скрипте указать '/usr/local/bin/tar' или все же предварительно вынести «нативный» tar Squeez'a? (Кстати, а как?..)

Спасибо!

Liber ()
Ответ на: комментарий от baverman

./configure --prefix=/usr

Не совсем понял... Во-первых, не встанет ли при этом тар прямо в /usr/, а не /usr/bin/ (где, по логике, ему быть положено, если даже не в local). Во-вторых, как все-таки быть с нативным таром? Он ничем не помешает?

Liber ()
Ответ на: комментарий от baverman

Понятно.

Я, конечно, извиняюсь за настырность, но хочу уяснить еще пару моментов. Очень уж не хочется отрубать сервак, тащить его к монитору (или наоборот), чтобы откатиться, если чего напортачу.

--prefix=/usr и --libexecdir=/usr/lib/tar - при установке библиотеки и инклюдсы будут размещены в соответствующих поддиректориях /usr/...

--bindir=/bin исполняемый файл тара будет установлен в /bin/dir

При этом нативный тар 1.23 будет заменен.

Все верно?

Может быть, все-таки лучше установить его по дефолту в /usr/local/ отдельно, чтобы не гробить версию, поставляемую вместе с системой? Или это «кривой подход»? Или все-таки возможны конфликты?

Спасибо!

Liber ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.