我将数据从GNU / Linux系统备份到CIFS装载。 这有明显的限制,例如文件名中的字符(如冒号(:))和目标Windows文件系统不支持的符号链接。
Rsync备份进行得非常好,使用以下(注意镜像备份):
rsync --bwlimit=62500 --log-file=${logfile} -av --no-links --delete ${src_dir} ${dest_dir}
Rsync根据上述限制报告传输文件的错误,并返回错误代码:
rsync错误:在main.c(1052)[sender = 3.0.9]处没有传输某些文件/ att(请参阅前面的错误)(代码23)
问题是,我想确保rsync成功完成, 给定目标文件系统的限制 。
所报告的错误代码似乎过于笼统( code 23: Partial transfer due to error ),只是在检查返回代码的包装器bash脚本中跳过,即如果跳过此错误,我可能会忽略失败的备份。
我已经尝试向rsync添加排除标准,例如--no-links --exclude='*:*' ,它可以在特定情况下工作。 然而,这似乎是一个零食解决scheme,因为我需要更新此新出现的条件导致备份失败,由于目标文件系统不兼容。
我不喜欢备份,因为用户需要select从备份中检索已删除的文件。
谢谢您的帮助。
经过一番挖掘这里是解决scheme:
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 )特定于我的实现,因为传输通过共享用户SSHstream量的1Gbit链接进行。
Windows共享使用mount.cifs来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
将七个保留字符(不包括反斜杠,但包括冒号,问号,pipe道,星号,大于和小于字符)中的六个翻译成重映射范围(高于0xF000),这也允许CIFS客户端识别这些字符通过Windows的POSIX仿真。 当安装到大多数版本的Samba(也禁止创build和打开其名称包含这七个字符中的任何一个的文件)时,这也是有用的。 如果服务器不支持networking上的Unicode,则不起作用。 请注意,使用mapchars挂载选项创build的文件可能无法访问,如果没有该选项挂载共享。
我已经testing了rsync标志--no-links和--iconv=ISO-8859-1,utf-8 ,以及mapchars选项。 所有rsync都需要返回成功的错误码0 。
我会更新这个解决scheme,因为我遇到了打破它的文件名。