CentOS 7.9 上从旧机迁数据到新机,rsync 保留了数字属主,新机 UID 1001 是另一个开发账号,网站目录属主显示成别人的名字,php 上传报 Permission denied。

一开始怀疑是「新机上 www 用户的 UID 是 1002,旧机是 1001」,查了一圈,方向不对。

这类报错背后常见的原因有几处,逐个排除就行。两台机器的 passwd 分配不一致,同一个 UID 对应了不同用户名。也可能是rsync 用 -a 保留属主时按数字映射,不按名字。

另外,tar 打包也保留数字属主,解包后同样错乱。

上来先对比两边的 UID 分配

getent passwd www; awk -F: '$3>=1000 && $3<1100 {print $1,$3}' /etc/passwd

接着看文件实际的数字属主

find /www -maxdepth 2 -printf '%U %u %p\n' | sort -n | head -10

随后按名字重新映射属主

rsync -aHAX --usermap=1001:www --groupmap=1001:www /old/www/ /www/

修正已有文件并恢复标签

chown -R www:www /www/wwwroot && restorecon -Rv /www/wwwroot

恢复的判定其实很直接。ls -ln 显示网站目录属主是 www 的 UID,php 上传目录能正常写入,再次同步不再报权限错误。

补一句。跨机器迁移要先对齐 UID,或者用 --usermap 显式映射;只改用户名不改数字,文件看着正常但程序写不进去。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189