1

Используя облачный носитель данных (продукт Strato HiDrive), я использую схему резервного копирования с использованием rsync . Во время работы большая часть файлов моего локального сервера резервируется в облаке с помощью cronjob. Мой скрипт резервного копирования активно использует возможность rsync не копировать неизмененные файлы, а вместо этого жестко связывать их. Это выглядит как

rsync -av -M--perms  \
            $inp_sig $REMOTE_USER@$RSYNC_HOST:$REMOTE_BASIS/$CURRENT_SNAPSHOT \
            --exclude-from=$EXCLUDE_FILES \
            --link-dest=$link_destination/

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

Ночью запускается другой скрипт, который очищает снимки, которые больше не используются. Для задачи удаления я использую другой скрипт, в основе которого лежит следующая команда rsync :

empty_dir=`mktemp -d`
rsync -d --delete-before --inplace --perms \
            $empty_dir/  $REMOTE_USER@$RSYNC_HOST:$REMOTE_BASIS/$snap/ || \
                    log_rsync ERROR: could not delete $snap
rm $empty_dir

Этот тоже работает - почти. Проблема в том, что при удалении rsync все разрешения на все связанные файлы сводятся на нет (все они имеют 644 разрешения, в то время как у некоторых из них должно быть 444).

Я уже несколько дней занимаюсь этой проблемой, работая с опциями удаления rsync в разных комбинациях. Я пробовал -rd против -r или -a ; --delete vs. --delete-before , пока безрезультатно. Из справочной страницы я узнал, что опция --inplace должна помочь:

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

Это заставляет меня думать , что --inplace не используя должно привести к разрушению жестких связей. Но в нашем случае жесткие ссылки все равно не работают (для файлов с разными битами разрешений).

У них также есть интерфейс cifs который идеально подходит для небольшого числа файловых операций. Но rm -rf в каталоге моментальных снимков ни в коем случае не осуществим - он длится часами для типичного резервного снимка, и мне приходится выполнять от 16 до 20 удалений за ночь. Вариант rsync работает около двух минут.

Итак, я потерян из-за моего ограниченного понимания или подразумеваемых ограничений rsync? Или мне просто не повезло из-за плохой реализации rsync на стороне провайдера?

1 ответ1

1

Проблема не полностью решена, но решена.

Проблема, которую я описал в своем посте, связана с реализацией rsync . Я отправил отчет об ошибке в Bugzilla и получил четкое указание на то, что rsync действительно неправильно обрабатывает биты прав доступа при рекурсивном удалении каталогов.

Они нашли обходной путь, используя опцию --super :

empty_dir=`mktemp -d`
rsync -d --delete --super \
        $empty_dir/  $REMOTE_USER@$RSYNC_HOST:$REMOTE_BASIS/$snap/ || \
                log_rsync ERROR: could not delete $snap
rm $empty_dir

Да, могут быть побочные эффекты с опцией --super . Для моего приложения обходного пути достаточно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .