rsync:如何处理备份到 CIFS 卷

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备份,因为用户需要从备份中检索已删除的文件的选项。

谢谢您的帮助。

答案1

经过一番挖掘,这里是有效的解决方案:

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

请注意使用-sand--iconv=ISO-8859-1,utf-8选项,它允许在文件名中使用空格(-s)并将文件名字符从 Linux 文件名编码转换(ISO-8859-1)至 Windows(utf-8), 。另请注意,目标文件系统不支持--iconv=ISO-8859-1,utf-8使用符号链接。--no-links

带宽限制(--bwlimit=62500)特定于我的实现,因为传输是通过 1Gbit 链路进行的,该链路也共享用户 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

请注意,使用mapcharswhich 可以实现以下功能(来自man mount.cifs):

地图字符

将七个保留字符中的六个(不是反斜杠,但包括冒号、问号、竖线、星号、大于和小于字符)转换为重映射范围(0xF000 以上),这也允许 CIFS 客户端识别由 Windows 的 POSIX 仿真使用此类字符创建的文件。这在安装到大多数版本的 Samba 时也很有用(它还禁止创建和打开名称包含这七个字符的文件)。如果服务器不支持 Unicode,则此操作无效。请注意,如果未使用该选项安装共享,则可能无法访问使用 mapchars 安装选项创建的文件。

rsync我已经测试了标志--no-links和的要求--iconv=ISO-8859-1,utf-8,以及mapchars的选项mount.cifs。所有都是rsync返回成功错误代码所必需的0

当我遇到破坏它的文件名时,我会更新此解决方案。

相关内容