タイムスタンプを維持しながら、データを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
NFSドライブがマウントされ、ユーザーとグループが常にwww-dataに設定されているため、エラーが発生したと考えられますchgrp
(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
これがまさに私が望むものです。
私に予想外のこの2つの行動をどのように説明できますか?
ただし-o
、これを省略すると結果が表示されず、結果としてフルと同じ動作が発生します-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
コードのifがゼロでないことについて文句を言う必要があるため、所有者ではなく完全にはわかりませんchange_uid
。