Rsync两种模式及其配置和使用

两种模式

下文中主要说的是rsync-daemon 认证模式。

SSH认证

推荐场景:服务器之间同步

特点:

  • 可以同步到任意目录
  • 服务端不需要开启服务
  • 不需要配置配置文件
  • 使用系统用户

rsync在ssh认证方式下,可通过系统用户进行认证,即在rsync上通过ssh隧道进行传输,类似于scp工具。
此时同步操作不在局限于rsync中定义的同步文件夹。

注意:

ssh认证方式,不需要服务器和客户端配置rsync配置文件
只需要双方都安装rsync服务,并且也不需要双方启动rsync。

示例

若rsync服务端SSH为标准端口,此时rsync使用方式如下:

1
rsync -avz /cygdrive/d/Pic/ root@192.168.7.101:/root/

若rsync服务端SSH为非标准端口,可通过rsync的-e参数进行端口指定。

使用方式如下:

1
rsync -avz /cygdrive/d/Pic/ -e 'ssh -p2222' root@192.168.7.101:/root/

rsync-daemon 认证

特点:

  • 只能同步配置文件中设置的目录
  • 服务端必须开启服务
  • 必须配置配置文件
  • 可以加载密码文件,跳过输入密码
  • 使用虚拟用户

rsync在rsync-daemon认证方式下,默认监听TCP的873端口。

rsync-daemon认证方式是rsync的主要认证方式,这个也是我们经常使用的认证方式。
并且也只有在此种模式下,rsync才可以把密码写入到一个文件中。

示例

1
rsync -avzP --password-file=/cygdrive/d/auth.txt /cygdrive/d/Pic/ zj@192.168.7.101::zjhome

注意:

rsync-daemon认证方式,需要服务器和客户端都安装rsync服务
并且只需要rsync服务器端启动rsync,同时配置rsync配置文件。

服务端

安装

检查rsync 是否已经安装

1
rpm -qa|grep rsync

若已经安装,则使用rpm -e 命令卸载。

1
rpm -e rsync

安装rsync

1
yum install rsync

注意如果卸载再安装rsync,配置文件rsyncd.conf也会重置。

daemon配置

rsync主要分为三个配置文件,分别是:

  • rsyncd.conf – 主配置文件

  • rsyncd.secrets – 密码文件

  • rsyncd.motd – 服务器欢迎文字

rsyncd.conf

配置文件

1
vi /etc/rsyncd.conf

配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# GLOBAL OPTIONS
uid = 0
gid = 0
fake super = yes

use chroot = no
read only = no

#limit access to private LANs
hosts allow=*
max connections = 5

pid file = /var/run/rsyncd.pid

secrets file = /etc/rsyncd.secrets
motd file = /etc/rsyncd.motd
log file = /var/log/rsync.log
transfer logging = yes

log format = %t %a %m %f %b
syslog facility = local3
timeout = 300

# MODULE OPTIONS
[zjhome]
path = /root/zjhome/
list=yes
ignore errors
auth users = zj
comment = root_home
exclude = important/

[myblog]
path = /data/web_front/myblog/
list=no
ignore errors
auth users = zj
comment = tmp_china

注:

auth users = zj 这是虚拟用户 系统上不需要添加。

rsyncd.secrets

用户密码配置文件

1
vi /etc/rsyncd.secrets

内容

1
zj:qazwsx123

为了密码的安全性,我们必须把权限设为600

1
2
chown root:root /etc/rsyncd.secrets
chmod 600 /etc/rsyncd.secrets

rsyncd.motd

建立连接到服务器的客户端看到的欢迎信息

1
vi /etc/rsyncd.motd

1
>>>Sync<<<

防火墙设置

如果服务器上装有防火墙,需在服务器中设置iptables将837端口开放。

1
iptables -A INPUT -p tcp --dport 873 -j ACCEPT

启动rsync

启动rsync服务端(独立启动)

1
rsync --daemon --config=/etc/rsyncd.conf

默认路径就是etc/rsyncd.conf

所以配置路径可以省略

1
rsync --daemon

查看873端口是否起来

1
2
3
netstat -an | grep 873
# 或者
netstat -a | grep rsync

如果rsync启动成功的话可以看到873端口已经在监听了。

停止

1
2
lsof -i:873
kill pid

服务的形式

启动

1
systemctl start rsyncd

重启

1
systemctl restart rsyncd

状态

1
systemctl status rsyncd

停止

1
systemctl stop rsyncd

开机启动

使用YUM安装

使用YUM安装后会自动在下面的位置添加服务,不需要自己再添加服务。

1
/usr/lib/systemd/system/rsyncd.service

开机自启

1
systemctl enable rsyncd

启动

1
systemctl start rsyncd

状态

1
systemctl status rsyncd

查看所有服务

1
systemctl list-unit-files --state=enabled | grep service

查看所有服务

1
systemctl list-unit-files --state=enabled | grep rsyncd

使用系统自带

有些云服务器的rsync也会自带服务,我们可以先确认一下

1
systemctl status rsyncd

如果没有再自己按下面的步骤添加服务:

编写 rsync 的服务脚本在 /etc/init.d/ 目录下新建一个脚本文件,

实际位置:

1
/etc/rc.d/init.d/rsyncd

例如 rsyncd,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/sh
# chkconfig: 2345 85 15
# description:auto_run

rsync=/usr/bin/rsync

start() {
echo "Starting rsyncd service..."
$rsync --daemon
echo "rsyncd service started."
}

stop() {
echo "Stopping rsyncd service..."
killall rsync
echo "rsyncd service stopped."
}

case "$1" in
start) start;;
stop) stop;;
restart) stop; start;;
*) echo "Usage: $0 {start|stop|restart}"
esac

exit 0

这个脚本实现了启动、停止 rsync 守护进程的功能。

添加执行权限:

1
chmod +x /etc/init.d/rsyncd

开机启动:

首先,添加为系统服务

1
chkconfig --add rsyncd

开机自启动

1
chkconfig rsyncd on

这会在开机时由 rc.local 自动调用 rsyncd 启动脚本。

启动服务:

1
service rsyncd start

现在 rsync 服务应该已经设置为开机自动启动了。你可以通过 service rsyncd start/stop 来管理服务。

这样就可以实现在 CentOS 系统中配置 rsync 服务开机自启动。

客户端

下载

Windows客户端cwRsync

链接:https://pan.baidu.com/s/1RbPZ6RntpzF3dJ5HLKkRUQ
提取码:psvm

链接:https://pan.baidu.com/s/1UYohMerxywZ_1tYEUtA6Og
提取码:psvm

CwRsync已经集成了cygwin类库,因此安装的时候可以省去cygwin包。

下载chown.exe放在客户端安装目录

注意

默认客户端上没有chown.exe这个命令,直接从cwrsync-server的安装路径里拷贝一个过来就可以用了。

设置环境变量

1
D:\Program Files (x86)\cwRsync\bin

注意上面的最好放在%SYSTEMROOT%\System32\OpenSSH\后面

否则在使用ssh命令的时候查找的证书不是C:\Users\Administrator\.ssh

同步方向

Windows下使用cwRsync的时候所有路径前面要添加上/cygdrive

Server => Local

1
rsync -vzrtopg --progress --password-file=/cygdrive/d/auth.txt --delete zj@192.168.7.101::zjhome /cygdrive/d/Pic/

Local => Server

1
rsync -vzrtopg --progress --password-file=/cygdrive/d/auth.txt /cygdrive/d/Pic/ zj@192.168.7.101::zjhome

增量同步

1
rsync -avzP /cygdrive/d/Pic/ zj@192.168.7.101::zjhome

配置本地密码文件

在D盘根目录添加文件auth.txt,内容

1
123456

同步

1
rsync -avzP --password-file=/cygdrive/d/auth.txt /cygdrive/d/Pic/ zj@192.168.7.101::zjhome

镜像同步

1
rsync -avzP --delete zj@192.167.7.101::zjhome /cygdrive/d/Pic/

我们引入一个 --delete 选项,表示服务器上的数据要与客户端完全一致,如果目录中有服务器上不存在的文件,则删除。

最终目的是让目录上的数据完全与服务器上保持一致;用的时候要小心点,最好不要把已经有重要数所据的目录,当做本地更新目录,否则会把你的数据全部删除;

问题排查

1
tail /var/log/rsync.log

参数

1
2
3
4
5
6
7
8
9
10
-a 参数,相当于-rlptgoD,
-r 是递归 -l 是链接文件,意思是拷贝链接文件;
-p 表示保持文件原有权限;
-t 保持文件原有时间;
-g 保持文件原有用户组;
-o 保持文件原有属主;
-D 相当于块设备文件;
-z 传输时压缩;
-P 传输进度;
-v 传输时的进度等信息,和-P有点关系

定时同步

编辑crontab

1
crontab -e

加入如下代码:

1
10 0 * * * rsync -avzP --delete --password-file=/tmp/rsync.password zj@192.168.7.101::zjhome /cygdrive/d/Pic/

问题

问题1

Could not create directory ‘/home/Administrator/.ssh’

添加环境变量

1
HOME=C:\Users\Administrator

问题2

uid 4294967295 (-1) is impossible to set on

这是Windows和Linux文件所属用户不一致导致的,目前还没有解决方法,也就是说

目前还没用通过SSH认证来使用Rsync的方式。

目前在Windows上只能通过密码的形式。

1
rsync -avz --password-file=/cygdrive/d/auth.txt ./%filename% zj@192.168.7.101::zjhome

如上在D盘根目录添加了auth.txt文件,里面写入密码。

另外 下面两种方式任选其一

1) 在服务器端的配置文件中添加:

1
2
3
uid = 0
gid = 0
fake super = yes
  1. 可以在命令行加参数 –no-super

问题3

password file must be owned by root when running as root

进入安装目录下D:\Program Files (x86)\cwRsync\bin

1
2
chmod -c 600 /cygdrive/d/auth.txt
chown administrator /cygdrive/d/auth.txt