1、rsync 简介html
Rsync(remote synchronize)是一个远程数据同步工具,可经过LAN/WAN快速同步多台主机间的文件,也可使用 Rsync 同步本地硬盘中的不一样目录。 linux
Rsync 是用于取代rcp的一个工具,Rsync使用所谓的 “Rsync 算法” 来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不一样部分,而不是每次都整份传送,所以速度至关快。您能够参考 How Rsync Works A Practical Overview 进一步了解 rsync 的运做机制。算法
Rsync支持大多数的类Unix系统,不管是Linux、Solaris仍是BSD上都通过了良好的测试。此外,它在windows平台下也有相应的版本,比较知名的有cwRsync和Sync2NAS。vim
Rsync 的初始做者是 Andrew Tridgell 和 Paul Mackerras,它当前由 http://rsync.samba.org维护。windows
Rsync的基本特色以下:centos
1. 能够镜像保存整个目录树和文件系统;安全
2. 能够很容易作到保持原来文件的权限、时间、软硬连接等;服务器
3. 无须特殊权限便可安装;微信
4. 优化的流程,文件传输效率高;并发
5. 可使用rcp、ssh等方式来传输文件,固然也能够经过直接的socket链接;
6. 支持匿名传输,以方便进行网站镜像。
在使用 rsync 进行远程同步时,可使用两种方式:远程 Shell 方式(建议使用 ssh,用户验证由 ssh 负责)和 C/S 方式(即客户链接远程 rsync 服务器,用户验证由 rsync 服务器负责)。
不管本地同步目录仍是远程同步数据,首次运行时将会把所有文件拷贝一次,之后再运行时将只拷贝有变化的文件(对于新文件)或文件的变化部分(对于原有文件)。
rsync 在首次复制时没有速度优点,速度不如 tar,所以当数据量很大时您能够考虑先使用 tar 进行首次复制,而后再使用 rsync 进行数据同步。
2、系统环境
系统平台:CentOS release 6.3 (Final)
rsync 版本:rsync-3.0.9-2.el6.rfx.x86_64.rpm
rsync 客户端:TS-CLIENT (172.16.1.136)
3、服务器端安装rsync服务
3.1. 检查rsync 是否已经安装
# rpm -qa|grep rsync
若已经安装,则使用rpm -e 命令卸载。
3.2. 下载RPM包
# wget http://pkgs.repoforge.org/rsync/rsync-3.0.9-2.el6.rfx.x86_64.rpm
3.3. 安装rsync
# rpm -ivh rsync-3.0.9-2.el6.rfx.x86_64.rpm
4、配置 rsync 服务
4.1. 配置 rsync 服务器的步骤
4.2. 以 xinetd 运行 rsync 服务
CentOS 默认以 xinetd 方式运行 rsync 服务。rsync 的 xinetd 配置文件
在 /etc/xinetd.d/rsync。要配置以 xinetd 运行的 rsync 服务须要执行以下的命令:
# chkconfig rsync on # service xinetd restart
管理员能够修改 /etc/xinetd.d/rsync 配置文件以适合您的须要。例如,您能够修改配置行
server_args = --daemon
在后面添加 rsync 的服务选项。
4.3. 独立运行 rsync 服务
最简单的独立运行 rsync 服务的方法是执行以下的命令:
# /usr/bin/rsync --daemon
您能够将上面的命令写入 /etc/rc.local 文件以便在每次启动服务器时运行 rsync 服务。固然,您也能够写一个脚本在开机时自动启动 rysnc 服务。
4.4. 配置文件 rsyncd.conf
两种 rsync 服务运行方式都须要配置 rsyncd.conf,其格式相似于 samba 的主配置文件。
配置文件 rsyncd.conf 默认在 /etc 目录下。为了将全部与 rsync 服务相关的文件放在单独的目录下,能够执行以下命令:
# mkdir /etc/rsyncd # touch /etc/rsyncd/rsyncd.conf # ln -s /etc/rsyncd/rsyncd.conf /etc/rsyncd.conf
配置文件 rsyncd.conf 由全局配置和若干模块配置组成。配置文件的语法为:
全局参数
在文件中 [module] 以外的全部配置行都是全局参数。固然也能够在全局参数部分定义模块参数,这时该参数的值就是全部模块的默认值。
参数 | 说明 | 默认值 |
---|---|---|
address | 在独立运行时,用于指定的服务器运行的 IP 地址。由 xinetd 运行时将忽略此参数,使用命令行上的 –address 选项替代。 | 本地全部IP |
port | 指定 rsync 守护进程监听的端口号。 由 xinetd 运行时将忽略此参数,使用命令行上的–port 选项替代。 | 873 |
motd file | 指定一个消息文件,当客户链接服务器时该文件的内容显示给客户。 | 无 |
pid file | rsync 的守护进程将其 PID 写入指定的文件。 | 无 |
log file | 指定 rsync 守护进程的日志文件,而不将日志发送给 syslog。 | 无 |
syslog facility | 指定 rsync 发送日志消息给 syslog 时的消息级别。 | daemon |
socket options | 指定自定义 TCP 选项。 | 无 |
模块参数
模块参数主要用于定义 rsync 服务器哪一个目录要被同步。模块声明的格式必须为 [module] 形式,这个名字就是在 rsync 客户端看到的名字,相似于 Samba 服务器提供的共享名。而服务器真正同步的数据是经过 path 来指定的。能够根据本身的须要,来指定多个模块,模块中能够定义如下参数:
a. 基本模块参数
参数 | 说明 | 默认值 |
---|---|---|
path | 指定当前模块在 rsync 服务器上的同步路径,该参数是必须指定的。 | 无 |
comment | 给模块指定一个描述,该描述连同模块名在客户链接获得模块列表时显示给客户。 | 无 |
b. 模块控制参数
参数 | 说明 | 默认值 |
---|---|---|
use chroot | 若为 true,则 rsync 在传输文件以前首先 chroot 到 path 参数所指定的目录下。这样作的缘由是实现额外的安全防御,可是缺点是须要 root 权限,而且不能备份指向 path 外部的符号链接所指向的目录文件。 | true |
uid | 指定该模块以指定的 UID 传输文件。 | nobody |
gid | 指定该模块以指定的 GID 传输文件。 | nobody |
max connections | 指定该模块的最大并发链接数量以保护服务器,超过限制的链接请求将被告知随后再试。 | 0(没有限制) |
lock file | 指定支持 max connections 参数的锁文件。 | /var/run/rsyncd.lock |
list | 指定当客户请求列出可使用的模块列表时,该模块是否应该被列出。若是设置该选项为 false,能够建立隐藏的模块。 | true |
read only | 指定是否容许客户上传文件。若为 true 则不容许上传;若为 false 而且服务器目录也具备读写权限则容许上传。 | true |
write only | 指定是否容许客户下载文件。若为 true 则不容许下载;若为 false 而且服务器目录也具备读权限则容许下载。 | false |
ignore errors | 指定在 rsync 服务器上运行 delete 操做时是否忽略 I/O 错误。通常来讲 rsync 在出现 I/O 错误时将将跳过 –delete 操做,以防止由于暂时的资源不足或其它 I/O 错误致使的严重问题。 | true |
ignore nonreadable | 指定 rysnc 服务器彻底忽略那些用户没有访问权限的文件。这对于在须要备份的目录中有些不该该被备份者得到的文件时是有意义的。 | false |
timeout | 该选项能够覆盖客户指定的 IP 超时时间。从而确保 rsync 服务器不会永远等待一个崩溃的客户端。对于匿名 rsync 服务器来讲,理想的数字是 600(单位为秒)。 | 0 (未限制) |
dont compress | 用来指定那些在传输以前不进行压缩处理的文件。该选项能够定义一些不容许客户对该模块使用的命令选项列表。必须使用选项全名,而不能是简称。当发生拒绝某个选项的状况时,服务器将报告错误信息而后退出。例如,要防止使用压缩,应该是:”dont compress = *”。 | *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz |
c. 模块文件筛选参数
参数 | 说明 | 默认值 |
---|---|---|
exclude | 指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到 exclude 列表中。这等同于在客户端命令中使用 –exclude 来指定模式。 | 空 |
exclude from | 指定一个包含 exclude 规则定义的文件名,服务器从该文件中读取 exclude 列表定义。 | 空 |
include | 指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到 include 列表中。这等同于在客户端命令中使用 –include 来指定模式 。 | 空 |
include from | 指定一个包含 include 规则定义的文件名,服务器从该文件中读取 include 列表定义。 | 空 |
d. 模块用户认证参数
参数 | 说明 | 默认值 |
---|---|---|
auth users | 指定由空格或逗号分隔的用户名列表,只有这些用户才容许链接该模块。这里的用户和系统用户没有任何关系。用户名和口令以明文方式存放在 secrets file 参数指定的文件中。 | (匿名方式) |
secrets file | 指定一个 rsync 认证口令文件。只有在 auth users 被定义时,该文件才起做用。 | 空 |
strict modes | 指定是否监测口令文件的权限。若为 true 则口令文件只能被 rsync 服务器运行身份的用户访问,其余任何用户不能够访问该文件。 | true |
username:passwd
e. 模块访问控制参数
参数 | 说明 | 默认值 |
---|---|---|
hosts allow | 用一个主机列表指定哪些主机客户容许链接该模块。不匹配主机列表的主机将被拒绝。 | * |
hosts deny | 用一个主机列表指定哪些主机客户不容许链接该模块。 | 空 |
客户主机列表定义能够是如下形式:
f. 模块日志参数
参数 | 说明 | 默认值 |
---|---|---|
transfer logging | 使 rsync 服务器将传输操做记录到传输日志文件。 | false |
log format | 指定传输日志文件的字段。 | ”%o %h [%a] %m (%u) %f %l” |
设置了”log file”参数时,在日志每行的开始会添加”%t [%p]“。
5、rsync 服务器应用案例
5.1. 在服务器端TS-DEV上配置rsync 服务
a. 编辑配置文件
# vi /etc/rsyncd/rsyncd.conf
# Minimal configuration file for rsync daemon # See rsync(1) and rsyncd.conf(5) man pages for help # This line is required by the /etc/init.d/rsyncd script
# GLOBAL OPTIONS uid = root gid = root
use chroot = no
read only = yes #limit access to private LANs hosts allow=172.16.0.0/255.255.0.0 192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0 hosts deny=*
max connections = 5
pid file = /var/run/rsyncd.pid
secrets file = /etc/rsyncd/rsyncd.secrets
#lock file = /var/run/rsync.lock
motd file = /etc/rsyncd/rsyncd.motd #This will give you a separate log file log file = /var/log/rsync.log #This will log every file transferred - up to 85,000+ per user, per sync transfer logging = yes log format = %t %a %m %f %b syslog facility = local3 timeout = 300
# MODULE OPTIONS [davidhome] path = /home/david/ list=yes ignore errors auth users = david comment = David home exclude = important/ [chinatmp] path = /tmp/china/ list=no ignore errors auth users = china comment = tmp_china
b. 创建/etc/rsyncd/rsyncd.secrets文件
# vim /etc/rsyncd/rsyncd.secrets
david:asdf #格式 用户名:口令
china:jk #该用户不要求是系统用户
c. 为了密码的安全性,咱们把权限设为600
# chown root:root /etc/rsyncd/rsyncd.secrets
# chmod 600 /etc/rsyncd/rsyncd.secrets
d. 创建链接到服务器的客户端看到的欢迎信息文件/etc/rsyncd/rsyncd.motd
# vim /etc/rsyncd/rsyncd.motd
+++++++++++++++++++++++++++
+ David Camp +
+++++++++++++++++++++++++++
e. 启动rsync
# /etc/init.d/xinetd restart
f. 查看873端口是否起来
# netstat -an | grep 873
若是rsync启动成功的话能够看到873端口已经在监听了。
g. 服务器端文件详细
5.2. 客户端配置
a. 客户端安装rsync
# yum -y install rsync
b. 经过rsync客户端来同步数据
场景一:
# rsync -avzP david@172.16.1.135::davidhome /tmp/david/
Password: 这里要输入david的密码,是服务器端提供的,在前面的例子中,咱们用的是 asdf,输入的密码并不显示出来;输好后就回车;
注: 这个命令的意思就是说,用david 用户登陆到服务器上,把davidhome数据,同步到本地目录/tmp/david/上。固然本地的目录是能够你本身定义的,好比 dave也是能够的;当你在客户端上,当前操做的目录下没有davidhome这个目录时,系统会自动为你建立一个;当存在davidhome这个目录中,你要注意它的写权限。
说明:
-a 参数,至关于-rlptgoD,-r 是递归 -l 是连接文件,意思是拷贝连接文件;-p 表示保持文件原有权限;-t 保持文件原有时间;-g 保持文件原有用户组;-o 保持文件原有属主;-D 至关于块设备文件;
-z 传输时压缩;
-P 传输进度;
-v 传输时的进度等信息,和-P有点关系,本身试试。能够看文档;
场景二:
# rsync -avzP --delete david@172.16.1.135::davidhome /tmp/david/
这回咱们引入一个 –delete 选项,表示客户端上的数据要与服务器端彻底一致,若是 /tmp/david/目录中有服务器上不存在的文件,则删除。最终目的是让/tmp/david/目录上的数据彻底与服务器上保持一致;用的时候要当心点,最好不要把已经有重要数所据的目录,当作本地更新目录,不然会把你的数据所有删除;
场景三:
# rsync -avzP --delete --password-file=/tmp/rsync.password david@172.16.1.135::davidhome /tmp/david/
此次咱们加了一个选项 –password-file=rsync.password ,这时当咱们以david用户登陆rsync服务器同步数据时,密码将读取 /tmp/rsync.password 这个文件。这个文件内容只是david用户的密码。咱们要以下作;
# touch /tmp/rsync.password
# chmod 600 /tmp/rsync.password
# echo "asdf"> /tmp/rsync.password
# rsync -avzP --delete --password-file=/tmp/rsync.password david@172.16.1.135::davidhome /tmp/david/
注: 这样就不须要密码了;其实这是比较重要的,由于服务器经过crond 计划任务仍是有必要的;
5.3. rsync 客户端自动与服务器同步数据
编辑crontab
# crontab -e
加入以下代码:
10 0 * * * rsync -avzP --delete --password-file=/tmp/rsync.password david@172.16.1.135::davidhome /tmp/david/
表示天天0点10分执行后面的命令。
6、错误分析
rsync: opendir "." (in xxxxxxx) failed: Permission denied (13)
解决办法:
一、将 selinux 对 rsync 的限制所有去掉:
# /usr/sbin/setsebool -P rsync_disable_trans 1
# service xinetd restart
二、狠一点,禁止整个 selinux :
# vim /etc/selinux/config
将其中的 SELINUX=enforcing 修改成 SELINUX=disabled
保存退出后,重启机器。
至此,rsync服务器配置完毕。
7、参考
关于rsync 命令的使用,请参考:http://www.howtocn.org/rsync:use_rsync
关于rsync 服务的详细说明,请参考:http://www.howtocn.org/rsync:use_rsync_server
David Camp
系统运维技术分享:296513821
咱们永远相信,分享是一种美德 | We Believe, Great People Share Knowledge...