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

rsync: как сделать резервную копию на том CIFS

Я выполняю резервное копирование данных из системы GNU / Linux на монтировку CIFS. Для этого существуют явные ограничения, такие как символы в именах файлов (например, двоеточия (:)) и символические ссылки, которые не поддерживаются целевой файловой системой Windows.

Резервное копирование Rsync выполняется достаточно хорошо при использовании следующего (обратите внимание на зеркальное резервное копирование):

rsync --bwlimit=62500 --log-file=${logfile} -av --no-links --delete ${src_dir} ${dest_dir}

Rsync сообщает об ошибках при передаче файла в соответствии с указанными выше ограничениями и возвращает код ошибки:

Ошибка rsync: некоторые файлы / атрибуты не были переданы (см. предыдущие ошибки) (код 23) в main.c (1052) [sender = 3.0.9]

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

Сообщенный код ошибки является слишком общим (code 23: Partial transfer due to error) просто пропустить в обертке bash сценарий, который проверяет код возврата, т. е. если я пропущу эту ошибку, я могу проигнорировать неудачное резервное копирование.

Я попытался добавить критерии исключения в rsync, например --no-links --exclude='*:*', который действительно работает в этом конкретном случае. Однако это кажется частичным решением, поскольку мне нужно будет обновить его, когда возникнут новые условия, которые вызывают сбой резервного копирования из-за несовместимости целевой файловой системы.

Я предпочитаю не tar резервные копии, поскольку пользователям требуется возможность извлекать удаленные файлы из резервной копии.

Спасибо за помощь.

После некоторого покопания вот решение, которое работает:

rsync --bwlimit=62500 --log-file=${logfile} -av -s --iconv=ISO-8859-1,utf-8 --no-links --delete ${src_dir} ${dest_dir}

Обратите внимание на использование -s и --iconv=ISO-8859-1,utf-8 опция, которая позволяет использовать пробелы в именах файлов (-s) и преобразует символы имени файла из кодировки имени файла Linux (ISO-8859-1) в Windows (utf-8), --iconv=ISO-8859-1,utf-8. Также обратите внимание на использование --no-links поскольку символические ссылки не поддерживаются файловой системой назначения.

Ограничение пропускной способности (--bwlimit=62500) специфичен для моей реализации, поскольку передача происходит по 1 Гбит-ссылке, которая также разделяет пользовательский SSH-трафик.

Общий ресурс Windows монтируется с помощью mount.cifs вот так:

mount.cifs ${win_share} ${local_mount_point} -o gid=16000,credentials=/root/.smbcredentials,file_mode=0775,dir_mode=0775,iocharset=utf8,cache=none,mapchars

Обратите внимание на использование mapchars что позволяет следующее (из man mount.cifs):

mapchars

Переведите шесть из семи зарезервированных символов (не обратную косую черту, но включая двоеточие, вопросительный знак, вертикальную черту, звездочку, больше и меньше символов) в диапазон переназначения (выше 0xF000), что также позволяет клиенту CIFS распознавать файлы, созданные с помощью такие символы с помощью эмуляции POSIX Windows. Это также может быть полезно при монтировании к большинству версий Samba (что также запрещает создание и открытие файлов, имена которых содержат любой из этих семи символов). Это не действует, если сервер не поддерживает Unicode в сети. Обратите внимание, что файлы, созданные с помощью параметра монтирования mapchars, могут быть недоступны, если общий ресурс смонтирован без этого параметра.

Я проверил требование rsync флаги --no-links и --iconv=ISO-8859-1,utf-8, так же хорошо как mapchars вариант для mount.cifs. Все необходимы для rsync чтобы вернуть успешный код ошибки 0.

Я буду обновлять это решение, когда буду сталкиваться с именами файлов, которые его нарушают.