一、Rsync 简介
1.1 Rsync 是一个远程增量文件备份软件工具
1.2 Rsync 的特性
- 支持拷贝特殊文件,如连接文件、设备等。
- 可以有排除指定文件或目录同步的功能,相当于打包命令 tar 的排除功能。
- 可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变(参数:–p)。
- 可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高(tar -N)。
- 可以使用 scp、rsh、ssh 等方式来配合传输文件(rsync 本身不对数据加密)。
- 可以通过 socket(进程方式)传输文件和数据(服务端和客户端)。
- 支持匿名的活认证(无需系统用户)的进程模式传输,可以实现方便安全的进行数据备份和镜像。
1.3 Rsync 的相关参数
-a #归档模式传输, 等于-tropgDl -t -r -o -p -g -D -l
-r #递归传输目录及子目录,即目录下得所有目录都同样传输。
-p #保持文件权限
-o #保持文件属主信息
-g #保持文件属组信息
-t #保持文件时间信息
-l #保留软连接
-D #保持设备文件信息
-L #保留软连接指向的目标文件
-z #传输时进行压缩以提高效率
-v #详细模式输出, 打印速率, 文件数量等
-P #显示备份过程 + --partial
-e #使用的信道协议,指定替代 rsh 的 shell 程序
-n #显示那些将要传输的文件,并不真正传输
--exclude=PATTERN #指定排除不需要传输的文件
--exclude-from=file #排除不需要的文件
--include=PATTERN
--include-from=file
--bwlimit=100 #限速传输,单位 MB
--partial #断点续传
--existing #仅仅更新那些已经存在于 DST 的文件,而不备份那些新创建的文件
--delete #删除那些 DST 中 SRC 没有的文件
--force #强制删除目录,即使不为空
--password-file=xxx #使用密码文件
--port #指定端口传输
1.4 Rsync 常见的使用场景
- 定时同步:Rsync + Cron
- 实时同步:Rsync + Innotify
1.5 Rsync 常见的传输模式
(1) 本地传输
格式:
rsync [参数] [源路径] [目的路径]
参数:
-t #保持文件时间信息
-r #递归传输
示例:
1.将 /opt/test.tar.gz 备份至 /backup 目录下:rsync /opt/test.tar.gz /backup
2.将 /var/log 目录备份至 /backup/log 目录下:rsync -r /var/log/ /backup/log/
(2) 远程传输
1.常规远程模式
格式:
rsync [参数] [本地源路径] [用户]@[ip]:[远程目的路径]
示例:
(1).上传数据:
将 /opt/test.tar.gz 上传目标服务器的 /backup 目录下:
rsync /opt/test.tar.gz root@ip:/backup
(2).下载数据:
将目标服务器 /opt/test.tar.gz 下载到 /backup 目录下:
rsync root@ip:/opt/test.tar.gz /backup
2.守护进程模式
即 以守护进程的模式运行服务端
优点:(1)保证数据安全、(2)数据归档
二、Rsync 的搭建部署
2.1 资源准备
服务器 | IP 地址 | 操作系统 | 作用 |
目标服务器 | 192.168.0.162 | Centos7 | 服务端 |
目标服务器 | 192.168.0.163 | WinServer | 服务端 |
源服务器 | 192.168.0.164 | Centos7 | 客户端 |
源服务器 | 192.168.0.165 | WinServer | 客户端 |
说明:本次配置实验分两部分:
(1)linux 作为服务端(目标服务器),linux + windows 作为客户端
(2)windows 作为服务端(目标服务器),linux + windows 作为客户端
2.2 以 linux 作为服务端
2.2.1 linux 服务端进行配置
Linux 服务端:192.168.0.162
(1)服务安装
#服务端安装 Rsync 服务
[root@rsync162 ~]# yum install -y rsync
(2)配置 rsync 配置文件
[root@rsync162 ~]# vi /etc/rsyncd.conf
#rsync 服务端口
port=9999
#rsync 日志文件
log file = /var/log/rsync.log
#rsync 进程 id 文件
pid file = /var/run/rsyncd.pid
#同步模块项目
[proname]
#同步的目标目录
path = /backup
#同步传输前是否切换到指定目录下(用于增强传输的安全性)
use chroot = yes
#最大连接数
max connections = 4
#只读文件是否同步,yes表示无法同步只读文件
read only = no
#客户端请求显示模块列表是,是否显示该模块
list = true
#服务运行的用户
uid = root
#服务运行的用户组
gid = root
#进行验证的用户,即客户端进行传输时的用户
auth users = test
#连接时的用户和密码信息
secrets file=/etc/rsyncd.passwd
#允许的 ip
hosts allow = *
(3)创建测试用户及配置密码文件
[root@rsync162 ~]# useradd test
[root@rsync162 ~]# passwd test
更改用户 test 的密码 。
新的 密码:
无效的密码: 密码包含用户名在某些地方
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@rsync162 ~]#
[root@rsync162 ~]#
[root@rsync162 ~]# vi /etc/rsyncd.passwd
test:test123456
(3)目标文件夹创建与授权
#创建备份目录
[root@rsync162 ~]# mkdir /backup
[root@rsync162 ~]# chown test:test /backup
(4)启动 rysnc 服务并开放端口
#先关闭 selinux
[root@rsync162 ~]# setenforce 0
#启动 rsync 服务
[root@rsync162 ~]# systemctl start rsyncd
#查看服务状态
[root@rsync162 ~]# netstat -tunlp |grep 9999
tcp 0 0 0.0.0.0:9999 0.0.0.0:* LISTEN 30129/rsync
tcp6 0 0 :::9999 :::* LISTEN 30129/rsync
#防火墙开放端口
[root@rsync162 ~]# firewall-cmd --permanent --add-port=9999/tcp
success
[root@rsync162 ~]# firewall-cmd --reload
success
(5)设置开机自启
[root@rsync162 ~]# systemctl enable rsyncd
Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service
2.2.2 以 windows 作为客户端
Windows 客户端:192.168.0.165
(1)下载客户端:
官网下载安装文件:https://www.itefix.net/cwrsync
这边实验版本为:5.4.1 (文件最后会提供下载,若官网无法下载可参考使用)
(2)在 windows 客户端目录下创建 passwd.txt 文件,并配置同服务端的 /etc/rsyncd.passwd 密码相一致,不同的是客户端不需要加上用户名(这里的密码,可以同 test 系统用户密码一样,也可以不一样,总之就是服务端和客户端要一致即可)
(3)测试客户端传输文件 (这里的 passwd.txt 和 windows.zip.gz 都在当前目录下)
C:\soft\cwRsync_5.4.1_x86_Free>.\rsync.exe -avzP --password-file=passwd.txt --port=9999 windows.zip.gz test@192.168.0.162::proname
(4)在服务器上查看接收到的文件
[root@localhost ~]# ll /backup/
总用量 20424
-rwx------. 1 root 401 20913856 3月 20 15:52 windows.zip.gz
(5)测试客户端传输目录
C:\soft\cwRsync_5.4.1_x86_Free>.\rsync.exe -avzP --password-file=passwd.txt --po
rt=9999 windows_test test@192.168.0.162::proname
(6)在服务器上查看接收到的目录和文件
[root@rsync162 ~]# ll /backup/
总用量 20424
drwx------. 2 root 401 106 4月 23 2023 windows_test
-rwx------. 1 root 401 20913856 3月 20 15:52 windows.zip.gz
[root@rsync162 ~]# ll /backup/windows_test/
总用量 23684
-rwx------. 1 root 401 284 3月 20 17:29 cc.txt
-rwx------. 1 root 401 3328826 4月 13 17:09 cwRsync_5.4.1_XiaZaiBa.zip
-rwx------. 1 root 401 20913856 3月 20 15:52 windows.zip.gz
-rwx------. 1 root 401 286 4月 3 13:10 新建文本文档.txt
(7)测试从服务端同步数据到客户端
#这里我把目录 windows_test 重命名为 server_test
[root@rsync162 ~]# mv /backup/windows_test /backup/server_test
#在windows的执行文件目录下创建了 from_server 文件夹
#C:\soft\cwRsync_5.4.1_x86_Free\from_server
C:\soft\cwRsync_5.4.1_x86_Free>.\rsync.exe -avzP --password-file=passwd.txt --port=9999 test@192.168.0.162::proname from_server
(8)在客户端中新建的 from_server 文件夹下可以看到已经接收到数据
(9)如果要使用绝对路径
# /cygdrive/c/ 代表 C 盘目录
C:\soft\cwRsync_5.4.1_x86_Free>.\rsync.exe -avzP --password-file=passwd.txt --port=9999 test@192.168.0.162::proname /cygdrive/c/soft/cwRsync_5.4.1_x86_Free/from_server
#不能使用如下路径
C:\soft\cwRsync_5.4.1_x86_Free\from_server
2.2.3 以 Linux 作为客户端
Linux 客户端:192.168.0.164
(1)客户端安装 rsync 服务
#客户端安装 Rsync 服务
[root@rsync164 ~]# yum install -y rsync
(2)Linux 客户端以常规远程方式传输数据文件测试(不同于 windows 客户端,linux 客户端可以直接使用常规的远程模式进行数据同步,其用法和 scp 命令相似)
#客户端测试传输文件
[root@rsync164 ~]# rsync -avz linux.tar.gz root@192.168.0.162:/backup
root@192.168.0.162's password:
sending incremental file list
linux.tar.gz
sent 2,465,340 bytes received 35 bytes 182,620.37 bytes/sec
total size is 2,465,302 speedup is 1.00
#服务端查看文件
[root@rsync162 ~]# ll /backup/
总用量 2408
-rw-r--r--. 1 root root 2465302 4月 13 22:29 linux.tar.gz
(3)Linux 客户端以守护进程方式传输数据文件测试(服务端在上面已经以守护进程模式启动了服务,所以这里测试我们只需要在 linux 客户端上做配置)
#创建密码文件
[root@rsync164 ~]# vi /etc/rsync.pass
test123456
#传输测试
[root@rsync164 ~]# rsync -avz --port 9999 --password-file /etc/rsync.pass linux.tar.gz test@192.168.0.162::proname
ERROR: password file must not be other-accessible
#修改文件权限
[root@rsync164 ~]# chmod 600 /etc/rsync.pass
#重新测试
[root@rsync164 ~]# rsync -avz --port 9999 --password-file /etc/rsync.pass linux.tar.gz test@192.168.0.162::proname
sending incremental file list
linux.tar.gz
sent 2,465,341 bytes received 35 bytes 234,797.71 bytes/sec
total size is 2,465,302 speedup is 1.00
#服务端查看接收的文件
[root@rsync162 ~]# ll /backup/
总用量 22832
-rw-r--r--. 1 root root 2465302 4月 13 22:29 linux.tar.gz
2.3 以 Windows 作为服务端
Windows 服务端版本使用 4.1.0 版本(文件最后会提供下载)
2.3.1 服务端安装与配置
Windows 服务端:192.168.0.163
(1)双击服务进行安装,服务用户可以用默认的,建议是自己定义
(2)安装即可,默认安装位置在:C:\Program Files (x86)\ICW\
(3)安装完成之后,系统会自动多出一个 rsync 用户、服务中会多出一个 RsyncServer的服务(注意:如果两者都没有,可能是没有用管理员模式运行安装软件的缘故,如果也用了但是没有生成用户和服务,那么请手动创建系统用户,账户和密码同步骤(1)的要保持一致)
(4)将 RsyncServer 服务的启动类型改为自动并启动服务
(5)新建一个数据同步目录data(自己定义及选择位置)
(6)将目录权限提供给rsync用户
(7)编辑配置文件:C:\Program Files (x86)\ICW\rsyncd.conf 内容如下
(8)编辑密码文件:C:\Program Files (x86)\ICW\etc\rsyncd.secrets
(9)重启 rsyncd 服务
(10)关闭防火墙或开启rsync默认端口 tcp:873(因为配置文件没有配置服务端口,所以要开放默认的端口)
2.3.2 windows 客户端
Windows 客户端:192.168.0.165
(1)在 windows 客户端测试机上进行测试
#测试传输数据
C:\soft\cwRsync_5.4.1_x86_Free>.\rsync.exe -avzP --password-file=passwd.txt windows.log test@192.168.0.163::proname
sending incremental file list
windows.log
5,291 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)
sent 2,457 bytes received 34 bytes 383.23 bytes/sec
total size is 5,291 speedup is 2.12
(2)在服务端数据目录查看
2.3.3 linux 客户端
Linux 客户端:192.168.0.164
(1)在 linux 客户端测试机上进行测试
#测试传输数据
[root@rsync164 ~]# rsync -avz --password-file /etc/rsync.pass linux.log test@192.168.0.163::proname
sending incremental file list
linux.log
sent 512 bytes received 34 bytes 99.27 bytes/sec
total size is 712 speedup is 1.30
(2)在服务端数据目录查看
2.4 几个常见的错误点
#日志 /var/log/rsyncd.log
#错误一:
auth failed on module proname from WIN-NEQ2FNHO1US (192.168.0.165) for root: no secrets file
# 错误一重点查看 /etc/rsyncd.conf 配置是否有问题,配置中的路径文件是否存在,权限是否正确,比如 /etc/rsyncd.passwd 文件的权限是 600;又比如
#错误二:
auth failed on module proname from WIN-NEQ2FNHO1US (192.168.0.165) for test: no matching rule
#错误二通常是由于客户端配置的密码和服务端配置的密码不一致导致,又或者服务端不存在该用户(用户一定要存在)
#错误三:
ERROR: password file must not be other-accessible
#错误三通常是客户端报出来的错误,即 linux 客户端 的 passwd 文件权限要修改为 600