rsync,&uid / gid无法设置'案例导致未来的硬链接失败,如何修复?

时间:2015-12-08 03:39:16

标签: linux cygwin rsync

我使用rsync版本3.1.1协议版本31与cygwin版本2.3.1(0.291 / 5/3)。

我相信我需要在使用这些文件运行第一个rsync之前,使用未知的uid / gid来修改我的所有Win7文件,rsync将复制这些文件。

在未知的uid / gid的rsync生成&uid / gid无法设置'消息并复制文件但在将来的增量备份中不能进行硬链接。

我尝试了很多rsync选项来解决这个问题但没有成功。

我该怎么做?

我认为这是因为当我有rsync在我的增量备份上创建硬链接时(使用相应的--link-dest = destination),只有具有特定用户和组的文件才会创建其硬链接。我有一个600,000个文件的硬盘驱动器,它们不允许在通过rsync传输硬链接后创建它们。我的所有其他驱动器都有许多文件,这些文件也是如此。这使得带有硬链接的增量备份无法从该驱动器中使用,并且“不太对”'与其他驱动器。

以下是该Win7硬盘上各种用户和组状态的示例:

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文件是600,000个有问题的文件的示例。在此之后,1.txt文件没有问题被rsynced和硬连接。

以下是rsynced(将--link-dest设置为之前的rsynced位置)后目标文件在目的地的样子:

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:

Dale@Uva1 ~
$ rsync -av --chmod=o=rwx /cygdrive/e/DATtoKML/  root@192.168.0.11:/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/  root@192.168.0.11:/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之前chown和chgrp DATtoKML.kml以及Win7驱动器上的文件父目录。这对我来说似乎不太实际,在几乎所有这些都不好的驱动器上都不是很难做到,但是另一个驱动器将这些类型的错误分散在数千个目录中。

我认为rsync需要这样的选项来处理“uid / gid”无法设置'例:

--uid-error=544 --gid-error=197121

或者,它应该只使用适当的用户和组(它应该从用户那里知道的是rsyncing),以便将来无法链接,只要“uid / gid”无法设置'就产生了。

有人想尝试使用该选项编译rsync版本吗?

编辑:看起来有问题的所有文件和目录都有一个4294967295的uid和/或gid。作为一个临时解决方案,我将编写一个bash脚本,它可以在每个win7驱动器上找到(但只包含文件,将被转移,考虑我的rsync排除文件)并将任何坏的uid更改为544和坏gid更改为197121.使用544和197121是因为它们是运行rsync命令的用户和用户组。

这样,当我开始在我的rsync日志中看到这些uid / gid问题时,我可以再次运行该脚本。

希望将来对这个问题有一个真正的答案。

4 个答案:

答案 0 :(得分:2)

我刚刚添加了--no-owner --no-group,邮件不再显示了。

然后这不会复制文件所有者或组,但是从Windows系统复制时,这通常不是问题。

答案 1 :(得分:0)

使用--usermap和--groupmap rsync选项(这要求源和目标环境都使用3.1.0或更高版本)。在我的情况下,这不起作用,因为我的目的地(WD MyCloud)使用3.0.9。

OR

使用在cygwin下运行的gcc更改rsync源代码(在某些C知识下真的不那么难)。

答案 2 :(得分:0)

如果要保留所有权/组成员身份,可以使用-M --fake-super选项将其记录为扩展属性。 (这有其他副作用可能会影响复制的文件,所有这些都是可逆的,就像更改常规文件的符号链接一样。)

请记住在还原时包含相同的选项,以恢复已保存的文件元数据。

答案 3 :(得分:-1)

朝向man rsync的{​​{1}}的含义与-a相同,因此也设置了-rlptgoD-o (owner)

因此将-g (group)替换为-a