一、简介
Rsync 全称remote synchronize,即”远程同步”,是Liunx/Unix下的一款开源,快速,多功能的可实现全量及增量(差异化)的本地或远程数据同步备份工具,适用于 Linux、Windows 等多种操作系统。它可通过LAN/WAN快速同步多台主机间的文件和目录,并适当利用rsync算法(差分编码)以减少数据的传输。
二、rsync传输方式
(推拉是由客户端发起的)
推:push,上传(upload),将客户端数据上传到rsync服务端,所有主机推送本地数据至rsync备份服务器,会导致数据同步缓慢(适合少量数据备份)
拉:pull,下载(download),将rsync服务端的数据下载到客户端,rsync备份服务端拉取所有主机上的数据,会导致备份服务器开销大
三、语法常用命令
语法:
命令 选项 源数据 目标地址
rsync [OPTION]... SRC [SRC]... DEST
常用选项:rsync支持一百多个选项,所以此处只介绍几个常用选项
-a --archive : 归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-r : 递归传输目录和子目录
-v : 显示rsync过程,可以使用"-vvvv"获取更详细信息。
-P : 显示rsync过程及详细信息(传输进度)
-z : 传输时进行压缩提高效率。
-R : 使用相对路径(存储时自动创建当前文件从根开始完整目录文件夹)
-c --checksum :
-n : 模拟执行,不实际操作文件
特殊选项:
--delete : 使目标目录成为源目录镜像存在(对目标目录‘多删少补’)
--exclude : 指定排除文件模式,例:
(--exclude='*.txt' 排除所有txt文件)
(--exclude=".*" 排除所有.开头隐藏文件)
(--exclude 'dir1/*' 排除某个子目录里面的所有文件,但不希望排除该子目录本身)
(--exclude 'file1.txt' --exclude 'dir1/*') 多个排除模式
(--exclude={'file1.txt','dir1/*'}) 多个排除模式汇总
(--exclude-from='exclude-file.txt') 多个排除模式调用文件
--include : 必须同步模式,一般与排除模式混用(--include必须在--exclude之前),例:
(--include="[0-9].txt" --exclude='*') 排除所有文件,但是会包括1.txt、2.txt等文件
--backup : 同步时对目标目录下已存在的文件做备份,以后缀'~'标识
--backup-dir : 与上一条配合使用,指定备份路径,要求路径必须存在(使用该选项后默认不会添加后缀,除非显式指定),例:--backup-dir=/mnt/bak
--suffix : 指定备份使用后缀:例:--suffix=".bak"
四、rsync两种工作模式:
注意:源路径如果是一个目录的话,带上尾随斜线和不带尾随斜线是不一样的,不带尾随斜线表示的是整个目录包括目录本身,带上尾随斜线表示的是目录中的文件,不包括目录本身,这一点本地模式与远程模式均适用
1、本地模式
本地模式时,类似于cp
cp命令只是本地复制,每次cp都会用源文件内容覆盖新文件,所以cp命令会修改文件时间属性
rsync可本地可远程,首次rsync与cp一样,后续rsync会对比两个文件的不同,只传输文件更新的部分,如果未更新,则rsync不会修改文件任何属性
示例:rsync /mnt/sda /test
2、远程模式
传输时需要认证远程主机的账号密码,有两种认证方式:ssh认证与守护进程rsync-daemon认证
ssh协议
基于ssh协议:rsync 默认使用 SSH 进行远程登录和数据传输,详细地说,rsync 在传输数据之前,会先与远端进行一次 ssh 登录认证(采用的是系统账号),因此需要目标主机事先开启ssh服务。
(1)在本地与目标主机都安装rsync
(2)远程主机要打开sshd服务
(3)需要用到的账号是远程主机可登录系统账号—》不安全
(4)不受目录限制————————-》不安全
语法:语法类似于scp命令,但备份方案不同于scp(scp 与 cp一样,每次都是全量)
# 拉取
命令 选项 远程用户@远程主机:远程的目录作为源 本地作为目标
rsync [OPTION] [USER@]HOST:SRC [DEST]
# 推送
命令 选项 本地数据作为源 远程用户@远程主机:远程的目录作为目标
rsync [OPTION] SRC [SRC]... [USER@]HOST:DEST
示例:
拉取 rsync -avz root@192.168.12.17:/data /bak/
推送 rsync -avz /bak root@192.168.12.17:/data/
#######################################################################
由于早期 rsync 不使用 SSH 协议,需要用-e参数指定协议,后来才改的。所以,下面-e ssh可以省略。
$ rsync -av -e ssh source/ user@remote_host:/destination
但是,如果 ssh 命令有附加的参数,则必须使用-e参数指定所要执行的 SSH 命令。
$ rsync -av -e 'ssh -p 8888' source/ user@remote_host:/destination
上面命令中,-e参数指定 SSH 使用2234端口。
守护进程rsync协议
守护进程模式其实也是一种远程模式,只不过采用的是rsync协议传输,若想采用rsync协议传输,则需要远程主机也安装rsync,并启动rsync守护进程,此时不需要依赖远程主机的sshd服务
1.基于ssh的认证,传输时会使用系统用户和密码,不安全,而守护进程模式使用的是虚拟用户和虚拟密码
2.当使用普通用户传输文件时会出现权限不足的情况,而守护进程模式可以解决这个问题
(1)在本地与目标主机都安装rsync
(2)远程主机要打开rsync守护进程 rsync –daemon 或 systemctl start rsyncd
(3)用到的是虚拟账号,虚拟账号对应的是配置文件中uid的权限,例如:uid=rsync 虚拟账号egon——->远端主机真实存在的系统账号rsync
(4)用的是模块名-》具体的目录
# 方式一:rsync://协议(默认端口873)
$ rsync -av source/ rsync://192.168.12.66/module/destination
# 方式二:远程目标前面使用连续两个冒号
$ rsync -av source/ 192.168.12.66::module/destination
完整语法:
rsync ----命令
[OPTION…] ----选项
[USER@] ----远程主机用户(虚拟用户)
HOST:: ----远程主机地址
SRC… ----远程主机模块(不是目录)
[DEST] ----远程主机数据备份至本地位置
拉取 Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
例子:# rsync -avz rsync_backup@192.168.20.21::backup/ /mnt/ --password-file=/etc/rsync.password
推送 Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
例子:# rsync -avz /mnt/ rsync_backup@192.168.20.21::backup/ --password-file=/etc/rsync.password
若远程主机修改了rsync守护进程的端口,那么在本机应该这么做
$ rsync -av source/ rsync://192.168.12.66:879/module/destination # 可以指定端口
注意,上面地址中的module并不是实际路径名,而是 rsync 守护程序指定的一个资源名,由管理员分配。
守护进程模式搭建
1、本地和远程主机安装rsync
2、远程主机配置并启动守护进程
创建编辑配置文件 vim /etc/rsyncd.conf
#客户端以虚拟用户egon(客户端登录服务端使用的虚拟账号)登录成功后,会转换成uid指定的身份,然后以该身份来完成对目标目录的写操作(文件实际写入时使用的账号)
uid = rsync
#客户端以虚拟用户egon登录成功后,转换成的组身份
gid = rsync
#端口
port = 873
#设置为yes,则代表uid可以不为root
fake super = yes
#注意,如果想让rsync -a选项能把本地文件的属主和属组也同步到远端
#则必须让远端的守护进程以root用户启动,即设置uid=root、gid=root,并且将fake super改为no
#在rsync -a选项下,本地文件的uid和gid会同步给服务端,但服务端的uid和gid对应的用户和组名有可能与本地不一致,这完全正常
#安全机制,rsync daemon在传输前是否切换到指定的path目录下,并将其监禁在内
use chroot = no
#最大连接数,0表示没有限制
max connections = 200
#超时时间,确保rsync服务器不会永远等待一个崩溃的客户端,0表示永远等待
timeout = 600
#忽略错误(忽略I/O错误,报错会跳过--delete)
ignore errors
#关闭只读
read only = false
#查看模块列表,改为true后,在local端可以用命令rsync rsync://192.168.12.39查看远端可用的模块数
list = false
#指定虚拟用户,传输时使用该用户就会对应到真实系统用户rsync的权限,把此处注释掉,可以在模块里设置
#auth users = egon
#指定虚拟用户的密码文件
#secrets file = /etc/rsync.passwd
#日志文件
log file = /var/log/rsyncd.log
# 指定哪些文件不用进行压缩传输
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
###########下面指定模块,并设定模块配置参数,可以创建多个模块###########
# 模块名为xxx,对应的实际目录为/egon_bak
[xxx]
#注释说明
comment = "备份文件"
#真实文件目录
path = /egon_bak
# 忽略某些IO错误信息
ignore errors
# 指定该模块是否可读写,即能否上传文件,false表示可读写,true表示可读不可写。所有模块默认不可上传
read only = false
# 指定该模式是否支持下载,设置为true表示客户端不能下载。所有模块默认可下载
write only = false
# 客户端请求显示模块列表时,该模块是否显示出来,设置为false则该模块为隐藏模块。默认true
list = false
# 指定允许连接到该模块的机器,多个ip用空格隔开或者设置区间
hosts allow = 10.0.0.0/24
# 指定不允许连接到该模块的机器
hosts deny = 0.0.0.0/32
# 若模块里指定虚拟用户,则把全局的注释掉即可
# 保存auth users用户列表的用户名和密码,每行包含一个username:passwd。
auth users = rsync_backup
# 由于"strict modes"默认为true,所以此文件要求非rsync daemon用户不可读写。只有启用了auth users该选项才有效。
secrets file = /etc/rsyncd.passwd
创建启动守护进程时用到的用户与组(已存在用户则无需创建)
useradd rsync -s /sbin/nologin -M
配置虚拟用户egon的密码文件
echo "egon:123" > /etc/rsync.passwd # 虚拟用户egon的密码为123,注意这是在服务端的密码文件,里面必须是"用户名:密码"的格式,而在客户端则不一样
chmod 600 !$
为模块xxx创建真实的目录
mkdir /egon_bak
chown -R rsync.rsync /egon_bak/
启动守护进程
rsync --daemon
客户端使用
创建密码文件
echo 123 > /etc/egon.password # 客户端的密码文件只能写入密码,文件名可以自定义
chmod 600 /etc/egon.password # 必须配置好权限
rsync -az egon@192.168.12.39::xxx /test --password-file=/etc/egon.password