2017-04-17 30 views
0

我用在Linux服务器的主文件夹(root用户)的自动定期同步所使用的几个人rsync的。用户需要的服务是通过sshfs挂载远程目录的可能性。然而,有一个sshfs的安装时,rsync的失败给出以下消息衰竭sshfs的保险丝多用户目录的rsync的安装

rsync: readlink_stat("/home/???/???") failed: Permission denied (13) 
IO error encountered -- skipping file deletion 
... 
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1183) [sender=3.1.1] 

由于此错误,自动同步没有按照预期由于跳过文件删除和一个非零退出工作,特别是码。只有安装home的文件系统才需要同步,所以想要的行为是sshfs挂载被忽略。 -x/--one-file-system rsync选项不能解决它。

这个问题在https://www.agwa.name/blog/post/how_fuse_can_break_rsync_backups清楚的解释。后续文章(https://www.agwa.name/blog/post/easily_running_fuse_in_an_isolated_mount_namespace)提出了一种解决方案,虽然不是一个可接受的解决方案,因为保险丝安装座仅对创建安装座的过程可见。

我找不影响sshfs的易用性和透明为用户的解决方案。

+0

SO是编程问题,关于使用或配置Linux没有问题。尝试SuperUser.com或unix.stackexchange.com。 – Barmar

回答

1

如果保险丝安装点此错误不会出现被排除在rsync命令。由于它是自动同步,因此可以使用mount命令获取所有保险丝安装点。 mount命令的输出可能因系统而异,但在debian中jessie sshfs挂载显示为USER @ HOST:MOUNTED_DIR on/path/to/mount/point type fuse.sshfs(rw,...)。一个简单的方法来自动熔断坐骑在bash排除+ sed的是以下

SOURCE="/home/" 

FUSEEXCLUDE=($(mount | 
    sed -rn " 
    /type fuse/ { 
     s|^[^ ]+ on ([^ ]+) type fuse.+|\1|; 
     /^${SOURCE//\//\\\/}.+/ { 
     s|^${SOURCE//\//\\\/}| --exclude |; 
     p; 
     } 
    }")) 

rsync $OPTIONS "${FUSEEXCLUDE[@]}" "$SOURCE" "$TARGET" 
+0

很好的使用sed来查找sshfs坐骑。是否有可能某些正则表达式有一点损坏? ([^。] +)型保险丝上的s /^.+。+/\ 1 /'在第一个表达式上为我工作。 – SimonSC

+0

@SimonSC,正则表达式没有被修改。也许你的mount命令的输出格式有点不同,这就是为什么它不起作用。请注意,在我的版本中,“on”之前的字符串以及“on”和“type fuse”之间的挂载点不能包含空格。实际上,挂载点中没有空格是正确定义bash数组所必需的。 –