我正在将数据从 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}
请注意使用-s
and--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
请注意,使用mapchars
which 可以实现以下功能(来自man mount.cifs
):
地图字符
将七个保留字符中的六个(不是反斜杠,但包括冒号、问号、竖线、星号、大于和小于字符)转换为重映射范围(0xF000 以上),这也允许 CIFS 客户端识别由 Windows 的 POSIX 仿真使用此类字符创建的文件。这在安装到大多数版本的 Samba 时也很有用(它还禁止创建和打开名称包含这七个字符的文件)。如果服务器不支持 Unicode,则此操作无效。请注意,如果未使用该选项安装共享,则可能无法访问使用 mapchars 安装选项创建的文件。
rsync
我已经测试了标志--no-links
和的要求--iconv=ISO-8859-1,utf-8
,以及mapchars
的选项mount.cifs
。所有都是rsync
返回成功错误代码所必需的0
。
当我遇到破坏它的文件名时,我会更新此解决方案。