rsync, 'uid/gid impossible to set' cases cause future hard link failure, how to fix?
我正在使用rsync版本3.1.1协议版本31和cygwin版本2.3.1(0.291/5/3)。
我相信在运行第一个rsync之前,我需要用未知的uid/gid(rsync会复制这些文件)来浏览所有win7文件。
在未知的uid/gid上,rsync生成"uid/gid不可能设置"消息,并复制文件,但在以后的增量备份中,这些文件不能硬链接。
我尝试了很多rsync选项来解决这个问题,但没有成功。
我该怎么做?
我相信这是因为当我使用rsync在增量备份上创建硬链接(使用适当的--link dest=destination)时,只有具有特定用户和组的文件才会创建硬链接。我有一个硬盘驱动器,有600000个文件,这些文件在通过rsync传输后不允许创建硬链接。我所有的其他驱动器都有许多这样的文件。这使得带有硬盘链接的增量备份在该驱动器上毫无用处,而对于其他驱动器则"不太合适"。
以下是Win7驱动器上各种用户和组状态的示例:
1 2 3 4 5 6 | ls -al total 828 drwxrwx---+ 1 Unknown+User Unknown+Group 0 Dec 7 21:33 . dr-xrwxr-x+ 1 Unknown+User Unknown+Group 0 Dec 7 20:53 .. -rwxrwx---+ 1 Administrators None 773985 Jan 1 2012 1.txt -rwxrwx---+ 1 Unknown+User Unknown+Group 27936 Mar 12 2009 DATtoKML.kml |
1.txt文件是通过最近在Windows文件资源管理器中的拖放操作放到那里的。dattokml.kml文件是600000个问题文件的一个例子。1.txt文件在rsynched和硬链接之后没有问题。
以下是在rsynched(将--link dest设置为以前的rsynched位置)后目标上文件的外观:
1 2 3 4 5 6 | ls -al total 792 drwxrwxrwx 2 root root 4096 Dec 7 21:33 . drwxrwxrwx 4 root root 4096 Dec 7 21:34 .. -rwxrwxrwx 2 544 197121 773985 Jan 1 2012 1.txt -rwxrwxrwx 1 root root 27936 Mar 12 2009 DATtoKML.kml |
如您所见,dattokml.kml并不是硬链接,每次增量rsync都会完全传输。
此外,这些非硬链接文件在rsync处理时从rsync获取消息。信息是"uid/gid"无法设置。这些不是致命的错误,因为文件是复制的,但似乎没有设置用户和组,所以它们是硬链接的。
下面是导致上述列表的两个rsync:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | Dale@Uva1 ~ $ rsync -av --chmod=o=rwx /cygdrive/e/DATtoKML/ [email protected]:/DataVolume/shares/DalesDesktop/e+DATtoKML/2015-12-07-FIRST sending incremental file list created directory /DataVolume/shares/DalesDesktop/e+DATtoKML/2015-12-07-FIRST ./ uid 4294967295 (-1) is impossible to set on"/DataVolume/shares/DalesDesktop/e+DATtoKML/2015-12-07-FIRST/." gid 4294967295 (-1) is impossible to set on"/DataVolume/shares/DalesDesktop/e+DATtoKML/2015-12-07-FIRST/." 1.txt DATtoKML.kml uid 4294967295 (-1) is impossible to set on"/DataVolume/shares/DalesDesktop/e+DATtoKML/2015-12-07-FIRST/.DATtoKML.kml.eR2hUv" gid 4294967295 (-1) is impossible to set on"/DataVolume/shares/DalesDesktop/e+DATtoKML/2015-12-07-FIRST/.DATtoKML.kml.eR2hUv" sent 802,347 bytes received 628 bytes 1,605,950.00 bytes/sec total size is 801,921 speedup is 1.00 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1165) [sender=3.1.1] Dale@Uva1 ~ $ rsync -av --chmod=o=rwx --link-dest=/DataVolume/shares/DalesDesktop/e+DATtoKML/2015-12-07-FIRST /cygdrive/e/DATtoKML/ [email protected]:/DataVolume/shares/DalesDesktop/e+DATtoKML/2015-12-07 sending incremental file list created directory /DataVolume/shares/DalesDesktop/e+DATtoKML/2015-12-07 ./ uid 4294967295 (-1) is impossible to set on"/DataVolume/shares/DalesDesktop/e+DATtoKML/2015-12-07/." gid 4294967295 (-1) is impossible to set on"/DataVolume/shares/DalesDesktop/e+DATtoKML/2015-12-07/." uid 4294967295 (-1) is impossible to set on"/DataVolume/shares/DalesDesktop/e+DATtoKML/2015-12-07/.DATtoKML.kml.1lp4od" gid 4294967295 (-1) is impossible to set on"/DataVolume/shares/DalesDesktop/e+DATtoKML/2015-12-07/.DATtoKML.kml.1lp4od" DATtoKML.kml sent 155 bytes received 559 bytes 476.00 bytes/sec total size is 801,921 speedup is 1,123.14 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1165) [sender=3.1.1] Dale@Uva1 ~ $ |
到目前为止,唯一可行的方法是在rsync之前,先对win7驱动器上的chown和chgrp dattokml.kml以及files父目录进行chown和chgrp。这对我来说似乎不太实际,在几乎所有坏的驱动器上也不难做到,但另一个驱动器的这些类型的错误分散在数千个目录中。
我认为rsync需要这样一个选项来处理"uid/gid不可能设置"的情况:
1 | --uid-error=544 --gid-error=197121 |
或者,只要出现"uid/gid不可能设置",它就应该使用适当的用户和组(应该从正在同步的用户那里知道)来实现未来的硬链接。
有人想用这个选项编译rsync版本吗?
编辑:看起来所有有问题的文件和目录的uid和/或gid都是4294967295。作为一个临时的解决方案,我将编写一个bash脚本,在每个win7驱动器上都可以找到这个脚本(但只包括考虑rsync排除文件而要传输的文件),并将所有不正确的uid更改为544,将不正确的gid更改为197121。使用544和197121是因为它们是运行rsync命令的用户和用户组。
这样,当我开始看到rsync日志中出现这些uid/gid问题时,我可以再次运行该脚本。
希望将来这个问题会有一个真正的答案。
我刚刚添加了
此后不复制文件所有者或集团,但当从视窗系统复制时,这并不总是一个问题。
如果你想保持所有权/集团成员,可以使用EDOCX1&3作为扩展属性记录。(This has other side-effects that can appear to affect the copied files,all of which are reverable,just as changing symbolic links to regular files.)
记住在恢复时包含相同的选项,以便恢复备份的元数据。
使用〔用户〕和〔组〕图表
黄金
在CYGWIN下运行的GCC源代码(事实上不难与某些知识共享)。
与
用