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

RSYNC в Windows CIFS копирует все каталоги при обновлении (но не старый контент)

Я смонтировал удаленный общий ресурс Windows (именно здесь будут архивироваться мои резервные копии на ленту).

У меня есть 70 ГБ данных, которые не так сильно меняются, поэтому я хочу использовать RSYNC для зеркалирования данных.

/usr/bin/rsync -rlptDv -e ssh --delete \
      --exclude "*Locks" --exclude "tmp" --bwlimit=0 \
      --modify-window=1 /cvs1/* localhost:/mnt/DUBBU01/Linux/Buzz/cvs1/

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

ОДНАКО каждая папка копируется. Не их содержимое, а только папки. Есть ли способ исключить папки, содержащие данные, но не сами данные?

Огромное количество опций в rsync доказывает боль, чтобы проверить это. А с миллионом файлов и парой сотен тысяч каталогов сборка файла может занять некоторое время ...

Имеет ли значение, что он каждый раз рассматривал возможность делать что-то с каталогами? Я заметил такое поведение с некоторыми из наших резервных копий rsync из общих ресурсов CIFS, но проигнорировал его, так как худшее влияние, которое оно оказывает, - это наличие дополнительных строк в файлах журнала, которые нам нужно сканировать, если возникнет проблема для исследования. Это не (в нашем случае) приводит к какой-либо заметной дополнительной передаче данных, поскольку ни один из файлов не затрагивается, если они сами не были изменены, и если удаленные папки вообще не обрабатываются, самое большее, что происходит, - это настройка владение / разрешение / даты, которое не вызовет значительной нагрузки ввода-вывода, поэтому займет много времени.

Редактировать: В качестве альтернативы их игнорированию вы можете отфильтровать их из вывода, пропустив его через grep -v /$, поскольку каталоги в журнале имеют завершающие разделители путей, а файлы - нет. Не идеально, но он уберет лишнюю мощность из поля зрения, пока вы не найдете лучшее решение.

Кроме того, просматривая наши самые последние журналы, чтобы убедиться, что команда grep, я замечаю, что она не включая все каталоги, в нашем случае изменяются только те, в которых был контент (и некоторые, в которых его нет, но немного). Два различия между нашими параметрами rsync и теми, которые вы указываете, заключаются в том, что мы не сохраняем разрешения (нет -p/--perms) и используют больший --modify-window (10 секунд, а не 1). Возможно, стоит попробовать --itemize-changes вариант, чтобы увидеть, дает ли это ключ к разгадке того, почему он хочет коснуться каждого каталога.

То, что вы хотите сделать, должно быть возможным с --relative (или -R) вариант и предыдущий запуск find для создания списка файлов:

find /cvs1 -type f -not \( -name *Locks -o -name tmp \) -print0 > filelist
rsync -pR --modify-window=1 -0 \
      --files-from=filelist /mnt/DUBBU01/Linux/Buzz/

Здесь вы создаете список файлов с завершающим нулем (только файлы, а не каталоги) и передаете его в rsync в качестве источника для его операции, сообщая ему о завершении нуля с помощью -0. Это полезно, чтобы избежать проблем с пробелами и т. Д. В именах файлов.


со страницы руководства rsync:

   -R, --relative

Используйте относительные пути. Это означает, что на сервер отправляются полные имена путей, указанные в командной строке, а не только последние части имен файлов. Это особенно полезно, если вы хотите отправить несколько разных каталогов одновременно. Например, если вы использовали эту команду:

rsync -av /foo/bar/baz.c remote:/tmp/

... это создаст файл с именем baz.c в /tmp/ на удаленной машине. Если вместо этого вы использовали

rsync -avR /foo/bar/baz.c remote:/tmp/

затем файл с именем /tmp/foo/bar/baz.c будет создан на удаленном компьютере - сохраняется полное имя пути.

У меня была такая же проблема (папки были перечислены в выводе, когда я работал rsync). Изменения в списке указывали, что разрешения обновлялись каждый раз, и я устранил проблему с помощью --no-p вариант (я использовал rsync -avz). В вашем случае разрешения не важны, поэтому я думаю, вы можете просто использовать -rltDv скорее, чем -rlptDv.

Я думаю, вам нужен параметр rsync --prune-empty-dirs