如果所有权更改失败,Rsync 不会保留时间戳

如果所有权更改失败,Rsync 不会保留时间戳

我正在尝试将数据同步到 NFS 共享,同时保留时间戳。

原始文件:

-rw-rw-r-- 1 simon simon 1554756 Apr 18  2017 IMG_0578-Bearbeitet.jpg

使用的 rsync 选项是-avh --progress.

复制时我收到类似警告

rsync: chgrp "/media/simon/.../.IMG_0578-Bearbeitet.jpg.dXOTKi" failed: Operation not permitted (1)

操作后文件元数据如下

-rw------- 1 www-data www-data 1554756 Dez  6 00:59 IMG_0578-Bearbeitet.jpg

我怀疑chgrp失败是因为安装了 NFS 驱动器,因此用户和组始终设置为 www-data (nfs 共享的选项是(rw,sync,all_squash,anonuid=33,anongid=33,no_subtree_check))。

我现在觉得很奇怪

  1. 也没有关于所有者的错误消息,也无法更改
  2. 作为副作用,时间也没有保留

如果我省略-grsync 选项中的-rlptoDvh --progress(-a除了 之外的所有内容-g),那么我不会收到任何错误,结果

-rw-rw-r-- 1 www-data www-data 1554756 Apr 18  2017 IMG_0578-Bearbeitet.jpg

这正是我想要的。

如何解释这两个对我来说意想不到的行为?

顺便说一句,省略-o不会给出任何结果,并且会导致与 full 相同的行为-a

答案1

您正在触发此代码rsync.c

if (am_root >= 0) {
        uid_t uid = change_uid ? (uid_t)F_OWNER(file) : sxp->st.st_uid;
        gid_t gid = change_gid ? (gid_t)F_GROUP(file) : sxp->st.st_gid;
        if (do_lchown(fname, uid, gid) != 0) {
                /* We shouldn't have attempted to change uid
                 * or gid unless have the privilege. */
                rsyserr(FERROR_XFER, errno, "%s %s failed",
                    change_uid ? "chown" : "chgrp",
                    full_fname(fname));
                goto cleanup;
        }

正如您可以从这段代码中看到的,该代码尝试设置目标文件的所有者和组,如果无法修改文件所有权,它将跳过该函数的其余部分(带有goto cleanup;)。该函数的跳过位处理设置扩展属性、时间戳、ACL 和其他元数据。

当未能设置其他数据时,也会执行类似的跳过(未能设置时间戳将跳过设置文件权限)。

至于为什么它抱怨设置团体我不完全确定,而不是所有者,因为它应该抱怨代码中的chownifchange_uid非零。

相关内容