Я выполняю резервное копирование данных из системы 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
.
Я буду обновлять это решение, когда буду сталкиваться с именами файлов, которые его нарушают.