rsync,“无法设置uid/gid”的情况会导致未来的硬链接失败,如何修复?

3
我正在使用rsync版本3.1.1协议版本31,cygwin版本2.3.1(0.291/5/3)。
我认为在第一次运行rsync之前,我需要chown所有Win7文件,其中包含未知的uid/gid。对于未知的uid/gid,rsync会生成“无法设置uid/gid”的消息,并复制文件,但是这些文件不能在将来的增量备份中进行硬链接。
我已经尝试了很多rsync选项来解决这个问题,但没有成功。
如何做到这一点呢?
我之所以这样认为,是因为当我让rsync在我的增量备份中创建硬链接(使用适当的--link-dest=destination),只有特定用户和组的文件才会创建它们的硬链接。我有一个硬盘上有60万个文件,它们在被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

最近在Windows文件浏览器中进行了拖放操作,将1.txt文件放置在那里。DATtoKML.kml文件是600,000个文件中的一个示例,它们是一个问题。1.txt文件在此之后被rsynced和硬链接都没有问题。

这是在设置--link-dest到先前rsync位置之后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处理时会收到消息。消息是“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 ~
$

到目前为止,唯一有效的方法似乎是在将文件从Win7驱动器同步到Linux系统之前,先使用chown和chgrp命令更改DATtoKML.kml文件及其父目录的所有者和组。但这对于几乎所有都有问题的驱动器来说并不实用,而另一个驱动器上则有成千上万个目录存在此类错误。
我认为rsync需要一个选项来处理“无法设置uid/gid”的情况:
--uid-error=544 --gid-error=197121

或者,它应该只使用适当的用户和组(它应该从正在同步的用户那里知道),以便在“无法设置uid/gid”时保持硬链接。 有人想尝试编译带有该选项的rsync版本吗?
编辑:看起来存在问题的所有文件和目录的uid和/或gid为4294967295。作为临时解决方案,我将编写一个bash脚本,在每个win7驱动器上找到(但仅包括将被传输的文件,考虑到我的rsync排除文件)并将任何错误的uid更改为544,错误的gid更改为197121。 选择544和197121是因为它们是运行rsync命令的用户的用户和组。
这样,当我开始看到这些uid/gid问题在我的rsync日志中浮出水面时,我可以再次运行脚本。
希望将来有一个真正的答案来解决这个问题。

"cygwin" "uid/gid" >_> - Ignacio Vazquez-Abrams
假设我懂得比实际更多的Linux,以便理解你的意思。 - KiloOne
NTFS 使用与nix不同的UID/GID方案,除非您有某种映射方式,否则无法使其正常工作。至于nix本身,只有root可以更改它们。 - Ignacio Vazquez-Abrams
我不确定,但我希望rsync能够应对这种情况。如果能的话,我在源和目标上都使用root权限。 - KiloOne
4个回答

2

我刚刚添加了--no-owner --no-group,然后这条消息就不再显示了。

这样做就不会复制文件的所有者或组,但是从Windows系统复制时通常不会出现问题。


当然可以。但是 uid/gid 就不会保存在副本中了。 - roaima
很难理解或至少是一个大问题,将Windows帐户和SID与Unix用户ID同步。对我来说,在更新rsync后出现了这个消息,我真的只想让它们消失。 - Christian

0

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

或者

使用在 cygwin 下运行的 gcc 更改 rsync 源代码(如果具备一些 C 知识,这并不难)。


0
如果您想保留所有权/组成员身份,可以使用-M --fake-super选项将它们记录为扩展属性。(这会产生其他副作用,可能会影响复制的文件,但是所有这些都是可逆的,就像将符号链接更改为常规文件一样。)
在恢复时,请记得包括相同的选项,以恢复保存的文件元数据。

-1
关于 man rsync-a 的意思与 -rlptgoD 相同,也设置了 -o (owner)-g (group)。因此,将 -a 替换为 -rlptD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接