分类专栏: Linux服务学习

版权

目录
• 了解rsync 功能及其特点
• 了解rsync语法及常用选项功能
• 了解rsync命令的三种基本常用使用方法
• 了解并掌握筛选rsync 的传输目标

简介

rsync(remote synchronize)是一个远程数据同步工具,可通过 LAN/WAN 快速同步多台主机之间的文件。也可以使用 rsync 同步本地硬盘中的不同目录。

rsync 是用于替代 rcp 的一个工具,rsync 使用所谓的 rsync算法进行数据同步,这种算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。

参考 How Rsync Works A Practical Overview 进一步了解 rsync 的运作机制。

rsync 的初始作者是 Andrew Tridgell 和 Paul Mackerras,目前由 http://rsync.samba.org 维护。

rsync 支持大多数的类 Unix 系统,无论是 Linux、Solaris 还是 BSD上 都经过了良好的测试。

配置免密:

rsync基本使用详解_数据同步

基本特性

⚫ 可以镜像保存整个目录树和文件系统
⚫ 可以很容易做到保持原来文件的权限、时间、软硬链接等
⚫ 无须特殊权限即可安装
⚫ 优化的流程,文件传输效率高
⚫ 可以使用 rsh、ssh 方式来传输文件,当然也可以通过直接的 socket 连接
⚫ 支持匿名传输,以方便进行网站镜象在 windows 平台下也有相应的版本,如 cwrsync 和DeltaCopy 等。

使用基本方法

在使用 rsync 进行远程同步时,可以使用两种方式:远程 Shell 方式(建议使用 ssh,用户验证由 ssh负责)和 C/S 方式(即客户连接远程 rsync 服务器,用户验证由 rsync 服务器负责)。
• 无论本地同步目录还是远程同步数据,首次运行时将会把全部文件拷贝一次,以后再运行时将只拷贝有
变化的文件(对于新文件)或文件的变化部分(对于原有文件)。
• 本节重点介绍 rsync 客户命令的使用,有关 rsync 服务器的配置和使用请参见下节。
• rsync 在首次复制时没有速度优势,速度不如 tar,因此当数据量很大时可以考虑先使用 tar 进行首次复制,然后再使用 rsync 进行数据同步。

rsync命令:

rsync 命令基本格式为:
1)本地使用:
rsync [OPTION…] SRC… [DEST]
2)通过远程 Shell 使用:
拉: rsync [OPTION…] [USER@]HOST:SRC… [DEST]
推: rsync [OPTION…] SRC… [USER@]HOST:DEST
3)访问 rsync 服务器:
拉: rsync [OPTION…] [USER@]HOST::SRC… [DEST]
推: rsync [OPTION…] SRC… [USER@]HOST::DEST
拉: rsync [OPTION…] rsync://[USER@]HOST[:PORT]/SRC… [DEST]
推: rsync [OPTION…] SRC… rsync://[USER@]HOST[:PORT]/DEST

其中: SRC: 是要复制的源位置 DEST: 是复制目标位置
若本地登录用户与远程主机上的用户一致,可以省略 USER@
使用远程shell 同步时,主机名与资源之间使用单个冒号“:”作为分隔符
使用 rsync服务器同步时,主机名与资源之间使用两个冒号“::”作为分隔符 当访问 rsync 服务器时也可以使用 rsync:// URL
“拉”复制是指从远程主机复制文件到本地主机(下载) “推”复制是指从本地主机复制文件到远程主机(上传) 当进行“拉”复制时,若指定一个SRC 且省略 DEST,则只列出资源而不进行复制

rsync常用选项

rsync基本使用详解_数据同步_02


rsync基本使用详解_数据_03


rsync基本使用详解_服务器_04

rsync基本使用语法

本地磁盘同步数据

rsync -a --delete /etc/ /www/

rsync基本使用详解_服务器_05


基于ssh的rsync远程同步数据(推)

rsync -av /etc root@192.168.249.135:/www/

rsync基本使用详解_数据同步_06

基于ssh的rsync远程同步数据(拉)

/www/两个不同,前者为ip机的目录,后者是给本机的

rsync基本使用详解_数据_07

注:拉去目标需要配置上下文
配置Rsync服务器,需要将共享目录的SELinux Context(上下文)配置为指定类型的上下文,否则目录无法访问
获取系统默认定义的所有类型的上下文,使用semanage fcontext -l
查看文件的上下文,在使用ls -l时,加上Z选项,也就是ls -lZ
例如
ll -Z /

配置上下示例
临时配置,在autorelabel时,会恢复默认上下文
chcon -t public_content_t /images
永久配置上下文,在autorelabel时,还是会恢复到自定义的上下文类型
#semanage fcontext -a -t public_content_t "/images(/.*)?"
#restorecon -Rv /images
恢复上下文为自定义的public_content_t

 

定期自动同步数据

创建脚本:

rsync基本使用详解_服务器_08


计划定时任务:每天00:10分执行

rsync基本使用详解_数据同步_09

筛选rsync的传输目标

–exclude=文件或目录名 指定删除一个不需要传输的文件匹配模式
–include=文件或目录名 制定需要传输的文件匹配模式
当 include/exclude 的规则较复杂时,可以将规则写入规则文件。使用规则文件可以灵活地选择
传输哪些文件(include)以及忽略哪些文件(exclude)。
• 若文件/目录在剔除列表中,则忽略传输
• 若文件/目录在包含列表中,则传输
• 若文件/目录未被提及,也传输
在 rsync 的命令行中使用 --exclude-from=FILE 或 --include-from=FILE 读取规则文件。
规则文件 FILE 的书写约定:
• 每行书写一条规则 RULE
• 以 # 或 ; 开始的行为注释行
包含(include)和排除(exclude)规则的语法如下:
• include PATTERN 或简写为 + PATTERN
• exclude PATTERN 或简写为 – PATTERN
PATTERN 的书写规则如下:
• 以 / 开头:匹配被传输的跟路径上的文件或目录
• 以 / 结尾:匹配目录而非普通文件、链接文件或设备文件
• 使用通配符
• *:匹配非空目录或文件(遇到 / 截止)
• **:匹配任何路径(包含 / )
• ?:匹配除了 / 的任意单个字符
• [:匹配字符集中的任意一个字符,如 [a-z] 或 [[:alpha:]]
• 可以使用转义字符 \ 将上述通配符还原为字符本身含义
举例说明:

例1:
# 不传输所有后缀为 .o 的文件
- *.o
# 不传输传输根目录下名为 foo 的文件或目录
- /foo
# 不传输名为 foo 的目录
- foo/
# 不传输 /foo 目录下的名为 bar 的文件或目录
- /foo/bar
例2:
# 传输所有目录和C语言源文件并禁止传输其他文件
+ */
+ *.c
- *
定义规则文件

 不传输 logs 目录
- logs/
# 不传输后缀为 .tmp 的文件
- *.tmp
# 传输 Apache 虚拟主机文档目录(/*/ 匹配域名)
+ /srv/www/
+ /srv/www/*/
+ /srv/www/*/htdocs/
+ /srv/www/*/htdocs/**
# 传输每个用户的 public_html 目录(/*/ 匹配用户名)
+ /home/
+ /home/*/
+ /home/*/public_html/
+ /home/*/public_html/**
# 禁止传输其他
- *

 

rsync基本使用详解_数据同步_10

 

__________________________________________________________________________________________________________________________________

rsync 只同步指定类型的文件

 

需求: 同步某个目录下所有的图片(*.jpg),该目录下有很多其他的文件,但只想同步*.jpg的文件。
rsync 有一个--exclude 可以排除指定文件,还有个--include选项的作用正好和--exclude相反。
那直接使用--include="*.jpg"是否可以呢?
rsync -av  --include="*.jpg"  /src/   /des/
实验证明,这样是不对的。
而正确的答案是
rsync -av  --include="*.jpg" --exclude=*  /src/ /des/

 

 




需求: 同步某个目录下所有的图片(*.jpg),该目录下有很多其他的文件,但只想同步*.jpg的文件。
rsync 有一个--exclude 可以排除指定文件,还有个--include选项的作用正好和--exclude相反。
那直接使用--include="*.jpg"是否可以呢?
rsync -av  --include="*.jpg"  /src/   /des/
实验证明,这样是不对的。
而正确的答案是
rsync -av  --include="*.jpg" --exclude=*  /src/ /des/