一、命令介绍
rsync(remote synchronizetion)主要用于本地和远程主机之间数据的同步,支持增量和全量的两种同步方式。
在同步数据的时候,默认情况下,rsync 通过其独特的“quick check”算法快速检查文件或目录的大小、最后修改时间对比是否要同步,当然我们也可以通过一些选项来自定义检查模式。
rsync 有本地、远程、守护进程3种传输方式,格式如下:
rsync [OPTION]... SRC [SRC]... DEST
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST
rsync [OPTION]... [USER@]HOST:SRC [DEST]
rsync [OPTION]... [USER@]HOST::SRC [DEST]
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
注:
":" 表示使用通过远程shell连接
"::"和"rsync://" 表示连接到rsync守护进程,并要求SRC或DEST以模块名称开头。
常用选项:
选项 | 含义 |
---|---|
-a | 归档模式传输,等于-tropgDl |
-v | 详细模式输出、打印速率、文件数量等 |
-z | 传输时进行压缩以提高效率 |
-r | 递归传输目录及子目录,即目录下得所有目录都同样传输。 |
-t | 保持文件时间信息 |
-o | 保持文件属主信息 |
-p | 保持文件权限 |
-g | 保持文件属组信息 |
-l | 保留软连接 |
-P | 显示同步的过程及传输时的进度等信息 |
-D | 保持设备文件信息 |
-L | 保留软连接指向的目标文件 |
-e | 使用的信道协议,指定替代rsh的shell程序 |
–exclude=PATTERN | 指定排除不需要传输的文件模式,详细请参阅man帮助手册筛选规则部分 |
–exclude-from=file | 文件名所在的目录文件 |
–bwlimit=100 | 限速传输 |
–partial | 断点续传 |
–delete | 让目标目录和源目录数据保持一致 |
–progress | 在传输过程中显示进度 |
检查模式相关选项:
选项 | 含义 |
---|---|
-I | 关闭默认的“quick check”算法检查,更新所有文件 |
-c | 改变默认检查模式,使用校验 |
–size-only | 改变默认检查模式,只检查文件大小 |
二、使用示例
安装:
1、centos
# 配置文件:/etc/rsyncd.conf,服务名称:syncd
[root@cp1 ~]# yum install -y rsync
2、ubuntu
# 默认已安装rsync,rsync服务默认不是启动的,我们要修改配置文件。
root@cp2:~# sed -i '/^RSYNC_ENABLE=/c RSYNC_ENABLE=true' /etc/default/rsync
# 拷贝模板配置文件,服务名称:rsync
root@cp2:~# cp /usr/share/doc/rsync/examples/rsyncd.conf /etc
示例1,利用 rsync 拷贝显示进度:
[root@cp1 ~]# rsync --progress -av test.file /tmp/
sending incremental file list
test.file
674,791,424 6% 161.00MB/s 0:01:01
示例2,从本地同步文件到远程服务器:
# 将本地的 test1 同步到远程 172.16.1.11 的主机上。
[root@cp1 ~]# rsync -avz test1 root@172.16.1.11:/root/
# 如果端口不是22,使用以下命令
[root@cp1 ~]# rsync -avz '-e ssh -p 2222' test1 root@172.16.1.11:/root/
示例3,利用 rsync 限速同步:
[root@nfs ~]# rsync -avz --bwlimit 1m -P /opt/1.txt rsync_backup@172.16.1.11::backup
示例4,rsync 实现数据无差异同步:
# 推: 客户端推送到服务端,服务端必须与客户端保持一致。
[root@nfs ~]# rsync -avz --delete -P /opt/ rsync_backup@172.16.1.11::backup
# 拉: 客户端拉取服务端数据,服务端有什么,客户端就有什么,客户端必须与服务端完全一致。
[root@nfs opt]# rsync -avz --delete rsync_backup@172.16.1.11::backup /opt/
示例5,无需输入密码实现 rsync 推送和拉取:
# 方式一: --password-file
[root@nfs opt]# echo "123456" > /etc/rsync.pass
[root@nfs opt]# chmod 600 /etc/rsync.pass
[root@nfs opt]# rsync -avz --delete rsync_backup@172.16.1.11::backup /opt/ --password-file=/etc/rsync.pass
# 方式二: 设定环境变量方式
[root@nfs opt]# export RSYNC_PASSWORD=123456 #只当前窗口有用,换一个窗口就没用了(放到脚本中使用,非常的方便)
[root@nfs opt]# rsync -avz --delete rsync_backup@172.16.1.11::backup /opt/
三、rsync守护进程配置
1、环境
172.16.1.10 作为我们的 rsync 服务端,172.16.1.11 作为我们的 rsync 客户端
[root@server~]# yum install rsync -y
[root@client ~]# yum install rsync -y
2、配置文件
[root@server ~]# vim /etc/rsyncd.conf
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
[backup]
comment = welcome to oldboyedu backup!
path = /backup
配置文件注解:(官方文档:https://rsync.samba.org/ftp/rsync/rsyncd.conf.html)
uid = rsync # 指定用户
gid = rsync # 指定用户组
port = 873 # 监听端口
fake super = yes # 不需要rsync已root身份运行,就可以存储文件的完整属性
use chroot = no # 禁锢推送的数据至某个目录, 不允许跳出该目录
max connections = 10 # 最大同时连接数
timeout = 600 # 超时时间
ignore errors # 忽略错误信息
read only = false # 关闭只读,默认yes
list = false # 当客户端请求可用模块列表时是否列出此模块
auth users = rsync_backup # 定义虚拟用户,作为连接认证用户
secrets file = /etc/rsync.passwd # 定义rsync服务用户连接认证密码文件路径
log file = /var/log/rsyncd.log # 指定日志文件
pid file = /var/run/rsyncd.pid # 指定pid文件
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz # 不压缩这些后缀的文件
[backup] # 定义模块信息,模块名称
comment = commit # 模块注释信息
path = /backup # 定义可用目录
3、准备
# 创建rsync进程运行的用户 ( rsync )
[root@server ~]# useradd -M -s /sbin/nologin rsync
# 定义虚拟用户名rsync_bakcup的密码
[root@server ~]# echo "rsync_backup:123456" > /etc/rsync.passwd
[root@server ~]# chmod 600 /etc/rsync.passwd
# 创建存储的数据的目录/backup
[root@server ~]# mkdir /backup
[root@server ~]# chown -R rsync.rsync /backup/
# 启动服务
[root@server ~]# systemctl restart rsyncd
4、selinux
一般来说都会关闭的,如果是一定要开启,执行以下操作:
[root@server ~]# seinfo -t | grep rsync
rsync_server_packet_t
rsync_data_t
rsync_exec_t
rsync_t
rsync_tmp_t
rsync_var_run_t
rsync_client_packet_t
rsync_port_t
rsync_etc_t
rsync_log_t
[root@server ~]# semanage fcontext -a -t rsync_data_t /backup
[root@server ~]# restorecon -Rv /backup
[root@server /]# getsebool -a | grep rsync
postgresql_can_rsync --> off
rsync_anon_write --> off
rsync_client --> off
rsync_export_all_ro --> off
rsync_full_access --> off
[root@server /]# setsebool -P rsync_client on
注意:使用seinfo和semanage命令,要安装先setools-console和policycoreutils-python。
5、测试
使用客户端推送 client.txt 文件至服务端的 backup 模块:
[root@client ~]# rsync -avz client.txt rsync_backup@172.16.1.10::backup
Password:
sending incremental file list
client.txt
sent 93 bytes received 43 bytes 38.86 bytes/sec
total size is 0 speedup is 0.00
拉取服务端 backup 模块下的数据:
[root@client ~]# rsync -avz rsync_backup@172.16.1.10::backup /opt
Password:
receiving incremental file list
./
client.txt
sent 50 bytes received 139 bytes 42.00 bytes/sec
total size is 0 speedup is 0.00
[root@client ~]# cd /opt/
[root@client opt]# ll
total 0
-rw-r--r--. 1 root root 0 Apr 15 03:58 client.txt