I have an rsync client running with the following flags: RSYNC_FLAGS="--recursive" # this tells rsync to copy directories recursively RSYNC_FLAGS="$RSYNC_FLAGS --links" # recreate symlinks RSYNC_FLAGS="$RSYNC_FLAGS --perms" # set the destination permissions RSYNC_FLAGS="$RSYNC_FLAGS --times" # transfer modification times along with the files RSYNC_FLAGS="$RSYNC_FLAGS --omit-dir-times" # omit directories when it is preserving modification times RSYNC_FLAGS="$RSYNC_FLAGS --owner" # set the owner of the destination file to be the same as the source # group is set to ossdes on the server side, so there is no option for that here RSYNC_FLAGS="$RSYNC_FLAGS --chmod=Dg+rw,Fg+r" # set permissions # RSYNC_FLAGS="$RSYNC_FLAGS -D" # option is equivalent to --devices --specials - we do not need it RSYNC_FLAGS="$RSYNC_FLAGS --compress" # compress file data during the transfer RSYNC_FLAGS="$RSYNC_FLAGS --relative" # use relative paths RSYNC_FLAGS="$RSYNC_FLAGS --numeric-ids" # transfer numeric group and user IDs RSYNC_FLAGS="$RSYNC_FLAGS --delete" # delete extraneous files from the receiving side RSYNC_FLAGS="$RSYNC_FLAGS --stats" # print a verbose set of statistics on the file transfer RSYNC_FLAGS="$RSYNC_FLAGS --human-readable -h" # output numbers in a human-readable format I have an rsyncd (root:root) with the following setup: comment = data area for rsync path = something log file = /var/log/rsyncd.log uid=root gid=mygid read only=false write only=false use chroot=true rsync works as expected (at least does what I expect). when I comment out uid=root in rsyncd.conf the owner will not be transferred any more, it will remain nobody. The precedence of --perms on the client side (including -o, -g) and the uid= guid= settings on the server side are unclear, not documented and as I wrote here depending on the settings rsync may even change its behavior.
Taken from the rsyncd.conf manpage: uid This parameter specifies the user name or user ID that file transfers to and from that module should take place as when the daemon was run as root. That is stated poorly in that it is trying to say that the process runs as that user. The gid parameter is similar. Both default to running the process as "nobody", which has no rights to chown files to other users. So, if you want to preserve ownership, you must run the receiving process as root, or perhaps settle for fake-super storing ownership info as xattrs (which will only be useful for people reading the files via rsync).