跨服务器rsync同步需先统一uid/gid映射,再用--chown按用户名重设归属;直接rsync -a会因数值绑定导致“名字对、归属错”,须配合usermod调整uid、find修复文件归属,并确保执行用户有chown权限及selinux上下文同步。

直接用 rsync -a 同步,文件归属会按 UID/GID 数值硬绑定,而两端系统若同名用户(如 www-data)对应不同 UID,就会出现“名字对、归属错”的问题——比如源端 www-data:www-data(UID 33)同步到目标端后变成 daemon:daemon(因为目标 UID 33 是 daemon),服务直接异常。
先确认并统一 UID/GID 映射
别急着同步,先查清两边的身份体系:
- 在源和目标服务器分别运行:
cat /etc/passwd | awk -F: '{print $1,$3}' | sort -n -k2—— 查用户名与 UID 对应关系 - 同样运行:
cat /etc/group | awk -F: '{print $1,$3}' | sort -n -k2—— 查组名与 GID 对应关系 - 重点比对业务账号(如
www-data、mysql、git)的 UID/GID 是否一致;不一致时,优先修改目标服务器:用usermod -u 33 www-data调整 UID,并用find / -user 旧UID -exec chown 33 {} \;批量修复已有文件归属
同步时绕过 UID/GID 数值依赖
即使 UID/GID 已统一,也建议用语义化方式操作,避免未来迁移再踩坑:
- 同步命令加
--chown=www-data:www-data,强制按用户名重设归属,不看原始数值 - 避免仅用
-a(它隐含-o和-g),改用-rlptD+ 显式--chown - 对已同步但归属错乱的目录,直接执行:
chown -R www-data:www-data /var/www,比依赖 rsync 恢复更可控
注意执行权限与上下文限制
即使参数写对,也可能因权限不足失效:
- 如果用普通用户(非 root)执行 rsync,
--chown或--owner会被拒绝,必须确保连接用户有chown权限,或改用sudo rsync(需配置免密 sudo) - SELinux 或 AppArmor 启用时,还需同步安全上下文,可加
--perms --xattrs,必要时用restorecon -R重置 - SSH 连接目标时,不要用
root@host,而用实际管理用户(如deploy@host),并在其rsyncd.conf中明确设置uid = deploy和gid = deploy











