Назад | Перейти на главную страницу

Использование rsync для сохранения копии каталога с изменяющимся именем

Я использую rsync в системе Linux для синхронизации каталога между локальным диском и подключенным USB-накопителем. Проблема, с которой я столкнулся, заключается в том, что сторонняя система, которая ежедневно создает резервную копию на сервере, фактически изменяет имя каталога, вложенного глубоко в резервную копию. В этом каталоге находится большая часть данных, необходимых для резервного копирования. Когда rsync просматривает каталог, он видит, что имя изменилось, и считает, что это совершенно новый каталог. Итак, моя копия rsync на USB-накопителе имеет новый каталог на каждый день, когда она выполняется.

Я написал сценарии, которые фактически изменят имя каталога обратно, но это громоздкий способ сделать это!

Я ищу "элегантный" способ справиться с этим. Можно ли создать постоянную ссылку на каталог? Можно ли настроить rsync так, чтобы он обнаруживал, что каталог такой же, даже если имя изменено? Я уверен, что кому-то приходилось сталкиваться с этим раньше!

Один из подходов - сделать это в два этапа. Во-первых, rsync все, кроме рассматриваемого каталога, используя шаблоны игнорирования. 2-й, rsync просто каталог, используя globbing в bash, чтобы перейти в каталог, например:

rsync -av /usr/lib/mydata/bigdatadir*/ /mnt/usbvolume/bigdatadir/

Использование завершающей косой черты в исходном каталоге приведет к тому, что rsync будет игнорировать имя каталога, потому что он будет вызываться на содержание каталога, а не самого каталога. Конечно, это подстановка будет проще всего, если каталог будет назван с постоянным префиксом или суффиксом, как в моем примере выше. Если это не так, вы можете написать сценарий, чтобы выяснить фактическое имя каталога, и сделать что-то более прямое, например следующее:

rsync -av /usr/lib/mydata/$BIGDATADIRNAME/ /mnt/usbvolume/bigdatadir/

В конце концов, ваш псевдокод будет примерно таким:

  1. Найдите $ BIGDATADIRNAME
  2. Rsync все как раньше, но игнорируйте $ BIGDATADIRNAME
  3. Rsync содержание из $ BIGDATADIRNAME

Возможно, вы сможете использовать параметры rsync --compare-dest = DIR, --copy-dest = DIR, или --link-dest = DIR. Они позволяют вам указать дополнительный каталог на принимающей стороне для поиска отсутствующих файлов.

Например, используя --link-dest, rsync создаст новую версию каталога, содержащую новые копии файлов, которые были изменены, или же жестко связанные копии файлов, которые не изменились.

Чтобы использовать любой из этих параметров, вам нужно знать имя каталога на USB-накопителе из предыдущего запуска rsync, поэтому вы, вероятно, захотите заключить rsync в сценарий, который сначала определяет правильное имя каталога.

Вы также можете использовать --delete-after для удаления старых версий каталога после создания новой версии.

Сам по себе Rsync не может делать то, что вы хотите, потому что единственные доступные метаданные rsync - это имя каталога и время MAC.

Единственный способ обработать это автоматически внутри rsync - это чтобы у rsync было больше метаданных. Репликация Microsoft DFS в Windows, например, справляется с этим, используя уникальный идентификатор, присвоенный файлам в томе NTFS, чтобы отслеживать изменение имени файла (или каталога).

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

Использование символической ссылки не сработает, потому что точка соединения привязана к имени целевого каталога (и в этом случае имя целевого каталога будет изменено). Вы можете использовать жесткую ссылку (которая привязана к inode), но вы должны быть уверены, что имя каталога изменяется, а не просто удаляется и создается заново (что может назначить ему другой inode).