Rsync文件同步遇到Permission denied的一次深究

  1. 背景
  2. 解决方案
    1. 基本权限问题
    2. 上级目录
    3. SELinux
    4. Emerge
    5. samba配置
  3. 总结
  4. 参考

背景

错误:

/usr/bin/rsync -avzu --exclude .svn --delete /Users/zongbao/Company/Baidu/bargain/actions /Volumes/fengzongbao/odp_market/app/bargain/
building file list ... done
actions/
rsync: failed to set times on "/Volumes/fengzongbao/odp_market/app/bargain/actions": Operation not supported (45)
actions/activity/
rsync: failed to set times on "/Volumes/fengzongbao/odp_market/app/bargain/actions/activity": Operation not supported (45)
actions/activity/Update.php
actions/order/
rsync: failed to set times on "/Volumes/fengzongbao/odp_market/app/bargain/actions/order": Operation not supported (45)
actions/tongji/
rsync: failed to set times on "/Volumes/fengzongbao/odp_market/app/bargain/actions/tongji": Operation not supported (45)
rsync: mkstemp "/Volumes/fengzongbao/odp_market/app/bargain/actions/activity/.Update.php.xWikFE" failed: Permission denied (13)
rsync: failed to set times on "/Volumes/fengzongbao/odp_market/app/bargain/actions": Operation not supported (45)
rsync: failed to set times on "/Volumes/fengzongbao/odp_market/app/bargain/actions/activity": Operation not supported (45)
rsync: failed to set times on "/Volumes/fengzongbao/odp_market/app/bargain/actions/order": Operation not supported (45)
rsync: failed to set times on "/Volumes/fengzongbao/odp_market/app/bargain/actions/tongji": Operation not supported (45)
sent 780 bytes received 66 bytes 1692.00 bytes/sec
total size is 5359 speedup is 6.33
rsync error: some files could not be transferred (code 23) at /BuildRoot/Library/Caches/com.apple.xbs/Sources/rsync/rsync-51/rsync/main.c(996) [sender=2.6.9]

之前开发机迁移的时候,尽管也遇见过,第一眼看见权限问题感觉很熟悉,好像之前解决过这个问题。

现在因为又重装环境的原因,在宿主机同步的时候还是遇见了这个问题,尽管参考文章中支了很多招,但在我这里依然不凑效。

决定深究一下。

解决方案

日志里面提到如下几种错误类型:

基本权限问题

很明显,rsync进程必须拥有文件系统的POSIX读写权限才可以同步,所以首先就是检查什么用户运行的rsync,这个用户拥有读写权限吗?

基于这个思路,运行用户显然不是root,zongbao这个用户,拥有/Volumes/fengzongbao目录的权限。另外一方面,就算是用root运行,也是同样的报错,那就可以跳过这一步。

上级目录

因为rsync会创建临时文件(除非用--inplace),进程必须拥有父目录的写权限。上面例子,rsync应该拥有/Volumes/fengzongbao目录的写权限。

SELinux

是否在使用SELinux?,因为它会重新POSIX权限。

因为是macos 所以可以排除这点影响,另外可以提供佐证的是对开发机重装系统之前,都是可以使用的。

Emerge

上述问题有可能在emerge --sync时报出。portage目录应该属于portage用户:

# chown -R portage:portage /usr/portage"

samba配置

问题可能出现在samba挂载过程?检查下samba的配置:
open smb://fengzongbao@10.145.81.150

目录通过samba配置,最后确定问题就是出在开发机,而非同步的macos,一通折腾之后,确定是samba问题,干脆重新安装了samba的版本。

卸载samba
apt-get remove samba samba-common
重新安装samba
apt-get remove samba samba-common

在重装的过程中,倒是提示没有覆盖配置文件,手动执行了提示的语句也就解决了。

Not replacing deleted config file /etc/samba/smb.conf
Install/upgrade will fail. To recover, please try:
sudo cp /usr/share/samba/smb.conf /etc/samba/smb.conf
sudo dpkg --configure -a

设置samba的登陆密码:

sudo smbpasswd -a fengzongbao

最后在sma的配置文件中补充要分享的目录配置:

smb.conf
[fengzongbao]
comment= odp_market
path = /home/users/fengzongbao
browseable = yes
writable = yes

重启samba试试。

➜ /Volumes cc
building file list ... done
actions/
actions/activity/
actions/activity/Update.php
actions/order/
sent 780 bytes received 66 bytes 1692.00 bytes/sec
total size is 5359 speedup is 6.33
2017年 8月18日 星期五 13时11分45秒 CST

总结

最后,终于发现是因为samba配置的问题导致的同步失败,终于解决了,尽管问题不是太大,但非常需要这种探究精神。

PS.这个问题在8.4就出现了,一直没时间去修复,第二点总结,出来混始终是要还的,对问题保持思考,这样获得的解决方法更能深入你心。

参考

script>