概述
rsync是一个相当棒的异地备份系统的备份指令。rsync在传输时,可以比对本地端与远程主机欲复制的文件内容,而仅复制两端有差异的文件。rsync的传输方式至少可以通过三种方式来工作:
- 在本机上直接运行,用法和CP一样。rsync -av /etc /tmp(将etc下文件拷贝到tmp下)
- 通过ssh或rsh的信道在server/client之间进行传输数据 rsync -av -e ssh user@ip:/etc /tmp(将远程数据拷贝到本地)
- 使用rsync提供的服务(daemon)来传输,此时rsync主机需要启动873 端口。
- 服务器端必须启动rsync
- 必须编辑/etc/rsync.conf配置文件
- 必须设置定义client端连接的密码数据
- 在client端可以利用,rsync -av user@hostname::/dir/path /local/path
使用rsync daemon
一、测试说明
1. 设备:server:172.20.1.137
client:172.20.1.138
2. 同步方向:从client端到server端
3. 服务器端配置
cp /usr/share/doc/rsync/examples/rsyncd.conf /etc/rsyncd.conf 拷贝配置文件到/etc/目录下
/etc/rsyncd.conf 内容:
pid file = /var/run/rsyncd.pid #指定rsync.pid所在路径
motd file = /etc/rsyncd.motd #版本欢迎信息,没多大用
log file = /var/log/rsyncd.log #指定log文件
secrets file = /etc/rsyncd.secrets #指定密码文件所在目录
uid=root #运行rsyncd守护进程的用户,填写root,否则同步时会报错,failed: Permission denied (13)
gid=root #运行rsyncd守护进程的用户组,填写root
[ftp] #自定义同步模块
path = /home/data/ #同步目录
read only = false #该选项设定是否允许客户上载文件
write only = false #该选项设定是否允许客户下载文件
list = false #该选项设定当客户请求可以使用的模块列表时,该模块是否应该被列出。false 隐藏,true,显示
host allow = 201.99.11.121#该选项指定哪些IP的客户允许连接该模块
o xxx.xxx.xxx.xxx,客户主机只有完全匹配该IP才允许访问。例如:192.167.0.1
o a.b.c.d/n,属于该网络的客户都允许连接该模块。例如:192.168.0.0/24
o a.b.c.d/e.f.g.h,属于该网络的客户都允许连接该模块。例如:192.168.0.0/255.255.255.0
o 一个主机名,客户主机只有拥有该主机名才允许访问,例如:backup.linuxaid.com.cn
o *.linuxaid.com.cn,所有属于该域的主机都允许
host deny = * #拒绝某些客户机访问
auth users = lxj #授权用户名
max connections = 1 #允许连接的客户端数量
comment = This is lxj data
log format = %t %a %m %f %b #定制日志格式
rsyncd.secretes内容:
#用户名:密码(密码必须和server端相同)
4. 客户端配置
/etc/rsyncd.conf 内容为空
/etc/rsyncd.secretes内容
#密码格式:密码
5. 同步
在server执行同步命令
rsync -rzfr /home/data/ 172.20.1.137@lxj::ftp 将本地/home/data/目录下的数据同步到172.20.1.137设备的/home/data/目录下。
6. pyinotify+rsync
7. 使用中遇到的问题
1) -u 增量备份,第一次和以后,都是只备份比目的目录时间新或者大小不一样的文件或文件夹
2) 如果不使用-u参数,则第一次和以后,都是
3)-I ,即使文件修改时间相同,也会备份
4) -I + 非-u, 第一次全量备份不论时间新旧或大小,以后备份会比较文件时间
二、rsync说明
rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。
1. 全局参数
参数 | 说明 | 默认值 |
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 选项。 | 无 |
2. 模块参数
参数 | 说明 | 默认值 |
path | 指定同步文件路径,该参数是必须指定的。 | 无 |
comment | 给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。 | 无 |
usee 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 nonreadable | 指定 rysnc 服务器完全忽略那些用户没有访问权限的文件。这对于在需要备份的目录中有些不应该被备份者获得的文件时是有意义的。 | false |
timeout | 该选项可以覆盖客户指定的 IP 超时时间。从而确保 rsync 服务器不会永远等待一个崩溃的客户端。对于匿名 rsync 服务器来说,理想的数字是 600(单位为秒)。 | 0 (未限制) |
exclude | 指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到 exclude 列表中。这等同于在客户端命令中使用 –exclude 来指定模式。 | 空 |
exclude from | 指定一个包含 exclude 规则定义的文件名,服务器从该文件中读取 exclude 列表定义。 | 空 |
include | 指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到 include 列表中。这等同于在客户端命令中使用 –include 来指定模式 。 | 空 |
include from | 指定一个包含 include 规则定义的文件名,服务器从该文件中读取 include 列表定义。 | 空 |
uth users | 指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。用户名和口令以明文方式存放在 secrets file参数指定的文件中。 | (匿名方式) |
secrets file | 指定一个 rsync 认证口令文件。只有在 auth users 被定义时,该文件才起作用。 | 空 |
strict modes | 指定是否监测口令文件的权限。若为 true则口令文件只能被 rsync 服务器运行身份的用户访问,其他任何用户不可以访问该文件。 | true |
hosts allow | 用一个主机列表指定哪些主机客户允许连接该模块。不匹配主机列表的主机将被拒绝。 | * |
hosts deny | 用一个主机列表指定哪些主机客户不允许连接该模块。 | 空 |
transfer logging | 使 rsync 服务器将传输操作记录到传输日志文件。 | false |
log format | 指定传输日志文件的字段。 | %h 远程主机名 %a 远程IP地址 %l 文件长度字符数 %p 该次rsync会话的进程id %o操作类型:"send"或"recv" %f 文件名 %P 模块路径 %m 模块名 %t 当前时间 %u 认证的用户名(匿名时是null) %b 实际传输的字节数 %c 当发送文件时,该字段记录该文件的校验码 |
三、语法
rsync有六种命令格式:
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
rsync [OPTION]... [USER@]HOST:SRCDEST
rsync [OPTION]... SRC [SRC]... DEST
rsync [OPTION]... [USER@]HOST::SRC[DEST]
rsync [OPTION]... SRC [SRC]...[USER@]HOST::DEST
rsync[OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
六种工作模式:
1) 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。
2) 使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。
3) 使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。
4) 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
5) 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。
6) 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
举例:
1) rsync*.c src/
#传输当前目录下的所有.c文件到src/
2) rsync-vz foo:src/bar /data/tmp
#shell方式,将foo机器上的src/bar目录下的文件以压缩方式递归地传输到本地的/data/tmp/目录下
3) rsync-vz /data/tmp foo:src/bar
#shell方式,将本地的/data/tmp/目录下的文件以压缩方式递归地传输到foo机器上的src/bar目录下
4) rsync-vz /data/tmp foo::src/bar
#将本地的/data/tmp/目录下的文件以压缩方式递归地传输到foo机器上的src/bar目录下
5) rsync-vz foo::src/bar /data/tmp
将foo机器上的src/bar目录下的文件以压缩方式递归地传输到本地的/data/tmp/目录下。
6) rsyncfoo:src/bar
列出远程主机foo的src/bar目录下的文件。
四、启动服务
service rsync start/restart/stop