![如果所有权更改失败,Rsync 不会保留时间戳](https://linux22.com/image/165132/%E5%A6%82%E6%9E%9C%E6%89%80%E6%9C%89%E6%9D%83%E6%9B%B4%E6%94%B9%E5%A4%B1%E8%B4%A5%EF%BC%8CRsync%20%E4%B8%8D%E4%BC%9A%E4%BF%9D%E7%95%99%E6%97%B6%E9%97%B4%E6%88%B3.png)
我正在尝试将数据同步到 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)
)。
我现在觉得很奇怪
- 也没有关于所有者的错误消息,也无法更改
- 作为副作用,时间也没有保留
如果我省略-g
rsync 选项中的-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 和其他元数据。
当未能设置其他数据时,也会执行类似的跳过(未能设置时间戳将跳过设置文件权限)。
至于为什么它抱怨设置团体我不完全确定,而不是所有者,因为它应该抱怨代码中的chown
ifchange_uid
非零。