RSYNC是什么?
- rsync是类unix系统下的数据镜像备份工具——remote sync。通俗说就是让多台服务器上指定部分的文件保持同步更新,实际应用中,只需要更新主服务器文件,其他服务器会根据配置,定时保持更新。
- 特性如下:
可以镜像保存整个目录树和文件系统。
可以很容易做到保持原来文件的权限、时间、软硬链接等等。
无须特殊权限即可安装。
优化的流程,文件传输效率高。
可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。
支持匿名传输,以方便进行网站镜象。
- RSYNC主页:
http://rsync.samba.org/
下载安装
- centos默认就已经安装,运行文件在/usr/bin/rsync,但版本是3.0.8,如果不升级也可以用。
# wget wget https://download.samba.org/pub/rsync/src/rsync-3.1.2.tar.gz
# tar zxvf rsync-3.1.2.tar.gz
# cd rsync-3.1.2
# ./configure --prefix=/usr/local/rsync
# make
# make install
- rsync的服务器端和客户端是同一个文件,根据参数的不同,实现不同的角色功能。
配置服务器端:
配置定义
- 此文件原本是没有的,编辑同时创建
- 启动配置文件
#vi /etc/rsyncd.conf
uid = root //运行RSYNC守护进程的用户
gid = root //运行RSYNC守护进程的组
use chroot = no //不使用chroot
max connections = 4 // 最大连接数为4
strict modes =yes //是否检查口令文件的权限
port = 1873 //默认端口,最好大于1024
motd file = /etc/rsyncd.motd //欢迎信息文件,可有可无
[backup] //这里是认证的模块名,在client端需要指定
path = /home/backup/ //需要做镜像的目录,不可缺少!
comment = This is a test //这个模块的注释信息
ignore errors //可以忽略一些无关的IO错误
read only = yes // 只读,也就是客户端不允许上传
list = no //不允许列文件
auth users = username //认证的用户名,如果没有这行则表明是匿名,此用户与系统无关
secrets file = /etc/rsyncd.pwd //密码和用户名对比表,密码文件自己生成
hosts allow = 192.168.1.1,10.10.10.10 //允许主机
hosts deny = 0.0.0.0/0 //禁止主机
#transfer logging = yes
exclude = beinan/ samba/ //要排除的目录或文件,空格分开
pid file = /var/run/rsyncd.pid //pid文件的存放位置
lock file = /var/run/rsync.lock //锁文件的存放位置
log file = /var/log/rsyncd.log //日志记录文件的存放位置
[可以有多个块]
详细:http://www.cnblogs.com/mchina/p/2829944.html
密码表文件
- 文件名即为上面secrets file的指定文件,格式:【账号:密码】,即:一行一个用户
#vi /etc/rsyncd.pwd
chat:123456
backup:234567
- 权限:因为rsync.pas存储了rsync服务的用户名和密码,所以非常重要。要将rsync.pas设置为root拥有, 且权限为600。
#chown root:root /etc/rsyncd.pas
#chmod 600 /etc/rsyncd.pas
欢迎信息
- 若启用motd file,则此项才有效,可有可无。
# vi /etc/rsyncd.motd
Welcome to use the rsync services!
命令脚本启动
- 独立运行:如果项目负荷大,可以用这种方式,可以把启动脚本放到/etc/rc.local随机启动
- 启动:
# rsync --daemon
如果启动配置文件不在etc下,需指定config位置
# rsync --daemon --config=/etc/rsyncd.conf
- 重启动
[root@memrel ~]# ps -ef|grep rsync
root 3365 1 0 18:28 ? 00:00:00 rsync --daemon --config=/etc/rsyncd.conf
root 3367 3127 0 18:29 pts/0 00:00:00 grep rsync
# 3365是进程ID,或直接看PID文件,效果一样
[root@memrel ~]# cat /tmp/rsyncd.pid
3365
[root@memrel ~]# kill 3365
[root@memrel ~]# rsync --daemon --config=/etc/rsyncd.conf
[root@memrel ~]# netstat -a | grep rsync #查看是否运行
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN
用xinetd启动:
- 适合于项目不大负荷不重,依附于xinetd可以占用更少的系统资源
- 设定服务和对应端口号
#nano -w /etc/services
往下走,可以找到:这一般不需要动,当然,如果你很想换个端口,也是可以的
rsync 873/tcp # rsync
rsync 873/udp # rsync
然后编辑xinetd文件, 把原来的YES改成NO
# whereis rsync #确定rsync位置
rsync: /usr/bin/rsync /usr/share/man/man1/rsync.1.gz
#vi /etc/xinetd.d/rsync
service rsync
{
disable = no #这原来是Yes
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
主要是要打开rsync的daemon, 一旦有rsync client要连接, xinetd会把它转介到 rsyncd(port 873)。
然后
# chkconfig rsync on #加入xinetd
# service xinetd restart #重启
# netstat -an | grep 873 #查看873端口是否在监听
如果xinetd不存在,则安装一下:yum -y install xinetd
配置客户端:
设置密码
#vi /etc/rsync.pwd
123456
修改权限
#chown root:root /etc/rsync.pwd
#chmod 600 /etc/rsync.pwd
连接服务器同步文件
- 从SERVER端取文件
/usr/bin/rsync -vzrtopg --progress --password-file=/etc/rsync.pwd --delete userName@192.168.1.11::chat /home/chat
- 向SERVER端上传文件
/usr/bin/rsync -vzrtopg --progress --password-file=/root/rsync.pwd /home/chat userName@192.168.1.11::chat
- 注意:如果路径结束后面带有”/”,表示操作该目录下的文件,但不会创建该目录,如不带”/”则创建该目录。
- 连接服务器端说明:
userName@192.168.1.11::chat
【userName】是前面服务器端密码表中的用户名
【192.168.1.11】就是服务器端IP地址了
【chat】是服务器端启动配置中的块
制作脚本文件自动运行
vi /usr/local/rsync/time.sh //制作脚本文件
#!/bin/bash
/usr/bin/rsync -vzrtopg --progress --delete [email protected]192.168.1.11::chat /home/chat --password-file=/etc/rsync.pwd
crontab -e
55 * * * * /usr/local/rsync/time.sh //每55分运行一次time.sh脚本文件
- 注意:实际生产环境中,代码同步基本都是发生在代码有变更后,所以一般都是手动同步,代码如果没更新,也就没必要同步。
rsync命令参数
-v 表示verbose详细显示
-z 启用压缩传输
-r 表示recursive递归
-t 保持原文件创建时间
-o 保持原文件属主
-p 保持原文件的参数
-g 保持原文件的所属组
-a 存档模式
-P 代替-partial和-progress两者的选项功能
-e ssh建立起加密的连接。
--partial 阻止rsync在传输中断时删除已拷贝的部分(如果在拷贝文件的过程中,传输被中断,rsync的默认操作是撤消前操作,即从目标机上
删除已拷贝的部分文件。)
--progress 显示出详细的进度情况
--delete 如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致。
--exclude 不包含/ins目录
--size-only 这个参数用在两个文件夹中的差别仅是源文件夹中有一些新文件,不存在重名且被修改过的文件,因为这种文件有可能会因为内容被修改可大小一样,而被略过。这个参数可以大大地提高同步的效率,因为它不需要检查同名文件的内容是否相同。
--password-file 指定密码文件,内容包含server端指定认证用户的密码。
- 以上单字母参数可以合并,如:-vzrtopg
完整配置实例
服务器端:
- 配置文件
# vim /etc/rsyncd.conf
uid = root
gid = root
use chroot = yes
max connections = 4
pid file = /tmp/rsyncd.pid
lock file = /tmp/rsync.lock
log file = /tmp/rsyncd.log
[chat]
path = /home/web/chat/
ignore errors
read only = false
list = false
hosts allow = 192.168.1.13
hosts deny = 0.0.0.0
auth users = backup
secrets file = /etc/rsyncd.pwd
- 密码表文件
# vim /etc/rsyncd.pwd
userName:123456
- 密码表文件权限
# chown root.root /etc/rsyncd.pwd
# chmod 600 /etc/rsyncd.pwd
客户端
- 编辑密码文件
# vim /etc/rsync.pwd
123456
# chown root:root /etc/rsync.pwd
# chmod 600 /etc/rsync.pwd
- 从服务器同步文件
# rsync -vzrtopg --progress --delete --password-file=/etc/rsync.pwd userName@192.168.1.11::chat /home/chat
服务器端配置文件参数
全局参数
在文件中 [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 来指定的。可以根据自己的需要,来指定多个模块,模块中可以定义以下参数:
基本模块参数
参数 | 说明 | 默认值 |
---|---|---|
path | 指定当前模块在 rsync 服务器上的同步路径,该参数是必须指定的。 | 无 |
comment | 给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。 | 无 |
模块控制参数
参数 | 说明 | 默认值 |
---|---|---|
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 |
模块文件筛选参数
参数 | 说明 | 默认值 |
---|---|---|
exclude | 指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到 exclude 列表中。这等同于在客户端命令中使用 –exclude 来指定模式。 | 空 |
exclude from | 指定一个包含 exclude 规则定义的文件名,服务器从该文件中读取 exclude 列表定义。 | 空 |
include | 指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到 include 列表中。这等同于在客户端命令中使用 –include 来指定模式 。 | 空 |
include from | 指定一个包含 include 规则定义的文件名,服务器从该文件中读取 include 列表定义。 | 空 |
- 一个模块只能指定一个exclude 参数、一个include 参数。
- 结合 include 和 exclude 可以定义复杂的exclude/include 规则 。
- 这几个参数分别与相应的rsync 客户命令选项等价,唯一不同的是它们作用在服务器端。
模块用户认证参数
参数 | 说明 | 默认值 |
---|---|---|
auth users | 指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。用户名和口令以明文方式存放在 secrets file 参数指定的文件中。 | (匿名方式) |
secrets file | 指定一个 rsync 认证口令文件。只有在 auth users 被定义时,该文件才起作用。 | 空 |
strict modes | 指定是否监测口令文件的权限。若为 true 则口令文件只能被 rsync 服务器运行身份的用户访问,其他任何用户不可以访问该文件。 | true |
- rsync 认证口令文件的权限一定是 600,否则客户端将不能连接服务器。
- rsync 认证口令文件中每一行指定一个 用户名:口令 对,格式为: username:passwd
- 一般来说口令最好不要超过8个字符。若只配置匿名访问的 rsync 服务器,则无需设置上述参数。
模块访问控制参数
参数 | 说明 | 默认值 |
---|---|---|
hosts allow | 用一个主机列表指定哪些主机客户允许连接该模块。不匹配主机列表的主机将被拒绝。 | * |
hosts deny | 用一个主机列表指定哪些主机客户不允许连接该模块。 | 空 |
客户主机列表定义可以是以下形式:
单个IP地址。例如:192.168.0.1
整个网段。例如:192.168.0.0/24,192.168.0.0/255.255.255.0
可解析的单个主机名。例如:centos,centos.bsmart.cn
域内的所有主机。例如:*.bsmart.cn
“*”则表示所有。
多个列表项要用空格间隔。
模块日志参数
参数 | 说明 | 默认值 |
---|---|---|
transfer logging | 使 rsync 服务器将传输操作记录到传输日志文件。 | false |
log format | 指定传输日志文件的字段。 | ”%o %h [%a] %m (%u) %f %l” |
设置了”log file”参数时,在日志每行的开始会添加”%t [%p]“。
可以使用的日志格式定义符如下所示:
%a - 远程IP地址
%h - 远程主机名
%l - 文件长度字符数
%p - 该次 rsync 会话的 PID
%o - 操作类型:”send” 或 “recv”
%f - 文件名
%P - 模块路径
%m - 模块名
%t - 当前时间
%u - 认证的用户名(匿名时是 null)
%b - 实际传输的字节数
%c - 当发送文件时,记录该文件的校验码