我使用rsync来自动定期同步linux服务器中的主文件夹(根用户),该服务器由多人使用用户需要的服务是通过sshfs安装远程目录的可能性。但是,当有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文件系统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)提出了一个解决方案,但不是可接受的,因为fuse挂载只对创建挂载的进程可见。
我正在寻找一个解决方案,不影响sshfs的可用性,是透明的用户。
最佳答案
如果rsync命令中排除了保险丝安装点,则不会出现此错误。由于它是一个自动同步,mount命令可用于获取所有fuse安装点。mount命令的输出可能因系统而异,但在debian中,jessie sshfs mounts显示为USER@HOST:MOUNTED_DIR on/path/to/mount/point type fuse.sshfs(rw,…)。在bash+sed中自动排除fuse挂载的简单方法如下
SOURCE="/home/"
FUSEEXCLUDE=( $( mount |
sed -rn "
/ type fuse/ {
s|^[^ ]+ on ([^ ]+) type fuse.+|\1|;
/^${SOURCE//\//\\\/}.+/ {
s|^${SOURCE//\//\\\/}| --exclude |;
p;
}
}" ) )
rsync $OPTIONS "${FUSEEXCLUDE[@]}" "$SOURCE" "$TARGET"