使用 Rsync 同步 Linux 文件

2018-02-15 2916点热度 2人点赞

当你想在两台 Linux 之间同步文件时,其实有一个程序很适合你,那就是 Rsync


首先需要安装 Rsync,服务端和客户端都要安装

yum -y install rsync

然后我们需要编辑配置文件,在此直接放置一份模板

vim /etc/rsyncd.conf

#设置服务器信息提示文件名称,在该文件中编写提示信息 
motd file = /etc/rsyncd.motd
#开启 Rsync 数据传输日志功能
transfer logging = yes
#设置日志文件名称,可以通过 log format 参数设置日志格式
log file =/var/log/rsyncd.log
#设置 Rsync 进程号保存文件名称
pid file =/var/run/rsyncd.pid
#设置锁文件名称
lock file =/var/run/rsync.lock
#设置服务器监听的端口号,默认为 873
port = 873
#设置服务器所监听网卡接口的 IP 地址 (根据实际填写)
address = 172.16.1.100
#设置进行数据传输时所使用的账户名称或 ID 号,默认使用 nobody,出于使用考虑建议修改为其他安全用户
uid = nobody
#设置进行数据传输时所使用的组名称或 GID 号,默认使用 nobody,出于使用考虑建议修改为其他安全用户
gid = nobody
#设置 user chroot 为 yes 后,rsync 会首先进行 chroot 设置,将根映射到 path 参数路径下,对客户
#端而言,系统的根就是 path 参数所指定的路径。但这样做需要 root 权限,并且在同步符号
#连接资料时仅会同步名称,而内容将不会同步。
use chroot = no
#同步时忽略一些 IO 错误,避免同步期间由于某种原因报错进而中断同步(常见权限问题)
ignore errors

#是否允许客户端上传数据,这里设置为只读,仅允许分发操作。
read only = yes
#设置并发连接数,0 代表无限制。超出并发数后,如果依然有客户端连接请求,则将会收
#到稍后重试的提示消息
max connections = 10
#模块,Rsync 通过模块定义同步的目录,模块以 [name] 的形式定义,这与 Samba 定义共
#享目录是一样的效果。在 Rsync 中也可以定义多个模块

#允许访问列表
hosts allow=10.0.0.0/255.0.0.0 172.16.0.0/255.240.0.0 192.168.0.0/255.255.0.0
#禁止访问列表
hosts deny=*

[syncproject]
#comment 定义注释说明字串
comment = Sync File
#同步目录的真实路径通过 path 指定
path = /syncproject
#exclude 可以指定例外的目录,即将 common 目录下的某个目录设置为不同步数据
#exclude = nosync/
#设置允许连接服务器的账户,账户可以是系统中不存在的用户
auth users = syncuser
#设置密码验证文件名称,注意该文件的权限要求为只读,建议权限为 600,仅在设置 auth users
#参数后有效
secrets file = /etc/rsyncd.secrets
#设置允许哪些主机可以同步数据,可以是单个 IP,也可以是网段,多个 IP 与网段之间使用空格分隔
hosts allow=172.16.1.200/255.255.255.255
#设置拒绝所有(除 hosts allow 定义的主机外)
hosts deny=*
#客户端请求显示模块列表时,本模块名称是否显示,默认为 true
list= false

将 Rsync 使用的账户和密码写入到文件,并赋予 600 权限保证其他人不可读

echo "syncuser:password" > /etc/rsyncd.secrets && chmod 600 /etc/rsyncd.secrets

创建一个 Rsync 的 MOTD 文件

echo "welcome to access" > /etc/rsyncd.motd

防火墙开启端口允许访问(默认端口 TCP 873)

firewall-cmd --add-service=rsyncd --permanent

客户端可以直接使用命令同步服务端到本地,并显示同步过程

rsync -azv --progress --port=873 --password-file=/etc/rsync.pass [email protected]::syncproject /syncproject

执行命令时,会访问指定端口 873/tcp ,同时发送 /etc/rsync.pass 的密码进行校验。

注意 /etc/rsync.pass 文件的权限需要禁止其他人访问,比如常用 600 权限。

chmod 600 /etc/rsync.pass

也可以直接使用命令同步本地到服务端,当然这需要服务端处于可写入状态

rsync -azv --progress /syncproject [email protected]::syncproject 

参数主要是:归档模式 (递归+软快捷方式+文件权限+时间+所属人+所属组+允许 Linux 设备文件),压缩模式,详细输出,同步路径使用 Rsyncs Demo 服务端

rsync -az --delete -e 'ssh -p 2222' /syncproject [email protected]:syncproject 

参数主要是:归档模式 (递归+软快捷方式+文件权限+时间+所属人+所属组+允许 Linux 设备文件),压缩模式,详细输出,以备份镜像的方式删除对端文件,同步路径使用 SSH 隧道端口 2222 加密并访问 Rsyncs Demo 服务端(冒号一个是调度 SSH 隧道,两个是调度 rsync demo 服务端)

同步最常见的问题有三种,排查后注意避免即可

  • 权限问题,需检查服务端用户读取权限,客户端写入权限,网络访问权限
  • 软链接问题,客户端会获得软链接快捷方式,使用时无法读取源文件,需修改 -a 的 -rlptgoD 去掉 -l 确保复制的是快捷方式源文件。
  • 网络监听问题,通常是网卡启动落后于服务启动,导致服务无法检测到指定网卡,进而启动失败

Windows 使用 cwRsync Client 同步文件

cwRsync 官网 [ 链接 ]

首先在 Windows 中,文件的路径与 Linux 不一致,所以我们需要使用转换路径

期望 rsync -az --delete "C:\Users\win\Downloads\" [email protected]::syncproject 
使用 rsync -az --delete /cygdrive/c/user/win/Downloads/ [email protected]::syncproject

参数主要是:归档模式 (递归+软快捷方式+文件权限+时间+所属人+所属组+允许 Linux 设备文件),压缩模式,详细输出,以备份镜像的方式删除对端文件,同步路径使用 SSH 隧道加密的 Rsyncs Demo 服务端(冒号一个是调度 ssh 隧道,两个是调度 rsync demo 服务端)

如涉及到群晖 NAS 等第三方服务端,还需检查同步过程涉及到的端口和权限以及路径问题。


参考链接

CentOS7 安装 Rsync 服务端

man Rsync 翻译

Rsync 常用选项参数

StarryVoid

Have a good time