阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Rsync原理详解及部署

102次阅读
没有评论

共计 17943 个字符,预计需要花费 45 分钟才能阅读完成。

Rsync 介绍

一、什么是rsync

rsync是一款开源,快速,多功能的可实现增量的本地或远程的数据镜像同步备份的优秀工具。适用于多个平台。从软件名称可以看出来是远程同步的意思(remote sync)。可使本地主机不同分区或目录之间及本地和远程两台主机之间的数据快速同步镜像,远程备份等功能。

在同步备份时,默认情况下,rsync通过其独特的“quick check”算法,仅同步大小或者最后修改时间发生变化的文件或目录(也可根据权限,属主等变化同步,需要制定参数)。甚至是只同步一个文件里变化的内容部分,所以可以实现快速的同步数据的功能。

提示:传统的 cpscp 工具拷贝每次均为完整拷贝,而 rsync 除了完整拷贝,还具备增量拷贝的功能,因此从此性能及效率上更胜一筹。

Rsync的特性如下:

1)支持拷贝特殊文件如链接,设备等

2)可以有排除指定文件或目录同步的功能,相当于打包命令tar

3)可以保持原来文件或目录的权限,时间,软硬链接等所有属性均不改变。

4)可实现增量同步,即 只同步发生变化的数据,因此数据传输效率更高

5)可以使用 rcprshssh 等方式来配合传输文件,也可以通过直接的 socker 链接

6)支持匿名的或认证的进程模式传输,方便进行数据备份及镜像。

 

[1]核心算法介绍:

假定在名为 α 和 β 的两台计算机之间同步相似的文件 A B ,其中 α 对文件 A 拥有访问权,β 对文件 B 拥有访问权。并且假定主机 α 与 β 之间的网络带宽很小。那么 rsync 算法将通过下面的五个步骤来完成:

1. β 将文件 B 分割成一组不重叠的固定大小为 S 字节的数据块。最后一块可能会比 S 小。

2. β 对每一个分割好的数据块执行两种校验:一种是 32 位的滚动弱校验,另一种是 128 位的 MD4 强校验。

3. β 将这些校验结果发给 α。

4. α 通过搜索文件 A 的所有大小为 S 的数据块 ( 偏移量可以任选,不一定非要是 S 的倍数 ) ,来寻找与文件 B 的某一块有着相同的弱校验码和强校验码的数据块。这项工作可以借助滚动校验的特性很快完成。

5. α 发给 β 一串指令来生成文件 A 在 β 上的备份。这里的每一条指令要么是对文件 B 经拥有某一个数据块而不须重传的证明,要么是一个数据块,这个数据块肯定是没有与文件 B 的任何一个数据块匹配上的。

————————————- 小结 ————————————————

rsync 就是会同步我们指定的两端目录之间的数据,这个数据可以是特殊的数据。同步之前就先进行两端的数据的比对,只会同步两者之间不同的部分,并保留文件原本的属性。并且支持匿名的方式进行同步传输。所以 rsync 在备份,同步上就会较为快速。

—————————-—————————-———————————

二、软件安装

http://rsync.samba.org/ rsync 的官方网站

1)编译安装

很简单那就直接解压

tar zxf rsync-3.1.0.tar.gz

cd rsync-3.1.0

./configure

make

make install

提示:服务器和客户端均要安装 rsync

三、服务器端 rsync 部署

rsync 的启动

1、守护进程启动 rsync
[root@www rsync-2.4.6]# /usr/local/bin/rsync –daemon
即可启动。rsync 默认服务端口为 873,服务器在该端口接收客户的匿名或者认证方式的请求。
2、开机启动
2.1)inetd.conf
编辑 /etc/services,加入行 rsync 873/tcp,指定 rsync 的服务端口是 873。编加 /etc/inetd.conf,加入 rsync stream tcp nowait root /bin/rsync rsync –daemon

注:对于 xinetd,设置方法类似。
2.2)加入 rc.local
将启动命令加入 rc.local 中:/usr/local/bin/rsync –daemon

 

rsync 的两种工作方式:

1) 传输本地文件

2)传输服服务端和客户端之间的数据

 

传输本地文件

具体的 rsync 命令参数后续会讲

[root@CT5_6-32-220-NFS01tmp]# rsync -avz /tmp/dir01/ /tmp/dir02/

building file list … done

./

test01

sent 105 bytes received 48 bytes 306.00bytes/sec

total size is 0 speedup is 0.00

[root@CT5_6-32-220-NFS01 tmp]# tree

.

|– dir01

| `–test01

|– dir02

| `–test01

## 可以看到已经成功的拷贝了。并且要注意/dir01/ 表示目录下的所有内容 /dir01 表示的目录本身

次例子是拷贝 目录下的内容 所以要加上 /dir01/ 如果是要将 /dir01整个目录 拷贝到 /dir02 下,那么就要写/dir01 —> 注意后面没有 /

[root@CT5_6-32-220-NFS01 tmp]# rsync -avz /tmp/dir01 /tmp/dir02/##这样拷贝的是目录本身

building file list … done

dir01/

dir01/test01

sent 111 bytes received 48 bytes 318.00bytes/sec

total size is 0 speedup is 0.00

[root@CT5_6-32-220-NFS01 tmp]# tree

|– dir01

| `–test01

|– dir02

| |– dir01

| | `– test01

| `–test01

Rsync 的详细介绍:请点这里
Rsync 的下载地址:请点这里

推荐阅读:

利用 inotifywait 监控主机文件和目录 http://www.linuxidc.com/Linux/2013-03/81075.htm

利用 inotify+rsync 实现 Linux 文件批量更新 http://www.linuxidc.com/Linux/2012-01/52132.htm

inotify-tools+rsync 实时同步文件安装和配置 http://www.linuxidc.com/Linux/2012-06/63624.htm

rsync 同步完整配置 http://www.linuxidc.com/Linux/2013-06/85781.htm

服务端和客户端传输

1、服务端配置文件

rsync服务器的配置文件为 /etc/rsyncd.conf,其控制认证、访问、日志记录等等。
该文件是由一个或多个模块结构组成。一个模块定义以方括弧中的模块名开始,直到下一个模块定义开始或者文件结束,模块中包含格式为 name = value 的参数定义。

每个模块其实就对应需要备份的一个目录树 ,比方说在我们的实例环境中,有三个目录树需要备份:/www/、/home/web_user1/ 和 /home/web_user2/,那么就需要在配置文件中定义三个模块,分别对应三个目录树。 配置文件是行为单位的,也就是每个新行都表示一个新的注释、模块定义或者参数赋值。以 #开始的行表示注释,以 ”\” 结束的行表示下面一行是该行的继续。参数赋值中等号后可能是一个大小写不敏感的字符串、一个以 trure/false 表示的布尔值。

参数说明:

全局参数:在文件中 [modlue 模块名] 之前的所有参数都是 全局参数 当然也可以在全局参数部分定义模块参数,这时候该参数的值就是所有模块的默认值。

全局参数

描述

motd file

motd file

log file

指定 rsync 的日志文件,而不将日志发送给syslog

pid file

指定 rsyncpid文件。

syslog facility

指定 rsync 发送日志消息给 syslog 时的消息级别,常见的消息级别是:uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3,local4, local5, local6local7。默认值是daemon

模块参数 : 在全局参数之后就需要定义一个或多个模块了,模块中可以定义以下参数:模块以 [ 模块名 ] 开始,直到另一个模块的开始结束

模块参数

描述

comment

给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。默认没有描述定义。

path

指定该模块的供备份的目录树路径,该参数是必须指定的

use chroot

如果 “use chroot” 指定为 true,那么rsync 在传输文件以前首先 chrootpath参数所指定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要以 roots 权限,并且不能备份指向外部的符号连接所指向的目录文件。默认情况下 chroot 值为 true 推荐:?

max connections

指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试。默认值是0,也就是没有限制。

lock file

指定支持 max connections 参数的锁文件,默认值是/var/run/rsyncd.lock

read only

该选项设定 是否允许客户上载文件 。如果为true 那么任何上载请求都会失败,如果为 false 并且服务器目录读写权限允许那么上载是允许的。默认值为true

list

该选项设定当客户请求可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为false,可以创建隐藏的模块。默认值是true

uid

该选项指定当该模块传输文件时守护进程应该具有的 uid,配合gid 选项使用可以确定哪些可以访问怎么样的文件权限,默认值是“nobody”

gid

该选项指定当该模块传输文件时守护进程应该具有的gid。默认值为“nobody”

就是说当同步到这个模块的时候,rsync 守护进行要使用什么样的 UID 和 GID 权限来读取本地文件。(疑问:不懂是否是这样理解)

exlude

用来指定多个由空格隔开的多个模式列表,并将其添加到 exclude 列表中。这等同于在客户端命令中使用 –exclude 来指定模式,不过配置文件中指定的 exlude 模式不会传递给客户端,而仅仅应用于服务器。一个模块只能指定一个 exlude 选项,但是可以在模式前面使用 “-““+”来指定是 exclude 还是include

但是需要注意的一点是该选项有一定的安全性问题,客户很有可能绕过 exlude 列表,如果希望确保特定的文件不能被访问,那就最好结合 uid/gid 选项一起使用。

include

用来指定多个由空格隔开的多个 rsync 并应该 exlude 的模式列表。这等同于在客户端命令中使用 –include 来指定模式,结合 include exlude可以定义复杂的 exlude/include 规则。一个模块只能指定一个 include 选项,但是可以在模式前面使用 “-““+”来指定是 exclude 还是include

auth users

该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果 “auth users” 被设置,那么客户端发出对该模块的连接请求以后会被 rsync 请求 challenged 进行验证身份这里使用的 challenge/response 认证协议。用户的名和密码以明文方式存放在 “secrets file” 选项指定的文件中。默认情况下无需密码就可以连接模块 ( 也就是匿名方式)

secrets file

该选项指定一个包含定义用户名 : 密码对的文件。只有在 “auth users” 被定义时,该文件才有作用。文件每行包含一个 username:passwd 对。一般来说密码最好不要超过 8 个字符。没有默认的 secures file 名,需要限式指定一个。(例如:/etc/rsyncd.secrets)

hosts allow

该选项指定哪些 IP 的客户允许连接该模块。客户模式定义可以是以下形式:
192.168.1.1 指定只有某个 IP 地址

192.168.1.0/24 指定某个网络的客户端

Backup.linux.com 指定某个主机名才能访问
默认是允许所有主机连接。

hosts deny

指定不允许连接 rsync 服务器的机器,可以使用 hosts allow 的定义方式来进行定义。默认是没有 hosts deny 定义

ignore errors

指定 rsyncd 在判断是否运行传输时的删除操作时忽略 server 上的 IP 错误,一般来说 rsync 在出现 IO 错误时将将跳过 –delete 操作,以防止因为暂时的资源不足或其它 IO 错误导致的严重问题。

ignore nonreadable

指定 rysnc 服务器完全忽略那些用户没有访问权限的文件。这对于在需要备份的目录中有些文件是不应该被备份者得到的情况是有意义的。

transfer logging

使 rsync 服务器使用 ftp 格式的文件来记录下载和上载操作在自己单独的日志中。

log format

通过该选项用户在使用 transfer logging 可以自己定制日志文件的字段。其格式是一个包含格式定义符的字符串,可以使用的格式定义符如下所示:

默认 log 格式为:“%o %h [%a] %m (%u) %f %l”,一般来说 , 在每行的头上会添加 “%t [%p] “。在源代码中同时发布有一个叫rsyncstatsperl脚本程序来统计这种格式的日志文件。

%h 远程主机名 %a 远程 IP 地址 %m 模块名 %t 当前时间 %f 文件名

%l 文件长度字符数

timeout

通过该选项可以覆盖客户指定的 IP 超时时间。通过该选项可以确保 rsync 服务器不会永远等待一个崩溃的客户。超时单位为秒钟,0表示没有超时定义,这也是默认值。对于匿名 rsync 服务器来说,一个理想的数字是600

dont compress

用来指定那些不进行压缩处理再传输的文件,默认值是
*.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

因为这些文件已经经过压缩咯,默认不用修改。


服务器配置实例分析
有两台服务器:A 和 B。其中 A 是主 web 服务器,
具有域名www.atong.com(192.168.1.1) B 服务器是备份机,其域名为 back.atong.com(192.168.1.2)。其中 A 的 web 内容存放在以下几个地方:/www/ 和 /home/web_user1/ 和 /home/web_user2/。我们需要在备份机 B 上建立对这几个目录内容的备份。

#vi /etc/rsyncd.conf 编辑服务端的配置文件。

# 配置文件内容

uid = nobody
gid = nobody
use chroot = no
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[www]
path = /www/
ignore errors
read only = true
list = false
hosts allow = 192.168.1.2
hosts deny = 0.0.0.0/32 #拒绝任何主机,只有 hosts allow 的主机
auth users = rsync
secrets file = /etc/rsync.pas


[web_user1]

path = /home/web_user1/
ignore errors
read only = true #客户端不能上传资料
list = false
hosts allow = 192.168.1.2
hosts deny = 0.0.0.0/32
uid = web_user1 #同步次模块时,shi 是用 web_user1 这个用户来读取 path 下的文件。
gid = web_user1
auth users = rsync
secrets file = /etc/rsync.pas


[web_user2]

path = /home/web_user2/
ignore errors
read only = true
list = false
hosts allow = 192.168.1.2
hosts deny = 0.0.0.0/32
uid = web_user2
gid = web_user2
auth users = rsync
secrets file = /etc/rsync.pas

这里定义有三个模块,分别对应于三个需要备份的目录树。这里只允许 192.168.1.2 备份本机的数据,并且需要认证。三个模块授权的备份用户都为 rsync,并且用户信息保存在文件 /etc/rsync.pas 中,其内容如下:rsync:123456

并且该文件只能是 root 用户可读写的,否则 rsyncd 启动时会出错。这些文件配置完毕以后,就需要在 A 服务器上启动 rsyncd 服务器:/usr/bin/rsync –daemon

注意:密码文件的权限设置为 600

Rsync 介绍

一、什么是rsync

rsync是一款开源,快速,多功能的可实现增量的本地或远程的数据镜像同步备份的优秀工具。适用于多个平台。从软件名称可以看出来是远程同步的意思(remote sync)。可使本地主机不同分区或目录之间及本地和远程两台主机之间的数据快速同步镜像,远程备份等功能。

在同步备份时,默认情况下,rsync通过其独特的“quick check”算法,仅同步大小或者最后修改时间发生变化的文件或目录(也可根据权限,属主等变化同步,需要制定参数)。甚至是只同步一个文件里变化的内容部分,所以可以实现快速的同步数据的功能。

提示:传统的 cpscp 工具拷贝每次均为完整拷贝,而 rsync 除了完整拷贝,还具备增量拷贝的功能,因此从此性能及效率上更胜一筹。

Rsync的特性如下:

1)支持拷贝特殊文件如链接,设备等

2)可以有排除指定文件或目录同步的功能,相当于打包命令tar

3)可以保持原来文件或目录的权限,时间,软硬链接等所有属性均不改变。

4)可实现增量同步,即 只同步发生变化的数据,因此数据传输效率更高

5)可以使用 rcprshssh 等方式来配合传输文件,也可以通过直接的 socker 链接

6)支持匿名的或认证的进程模式传输,方便进行数据备份及镜像。

 

[1]核心算法介绍:

假定在名为 α 和 β 的两台计算机之间同步相似的文件 A B ,其中 α 对文件 A 拥有访问权,β 对文件 B 拥有访问权。并且假定主机 α 与 β 之间的网络带宽很小。那么 rsync 算法将通过下面的五个步骤来完成:

1. β 将文件 B 分割成一组不重叠的固定大小为 S 字节的数据块。最后一块可能会比 S 小。

2. β 对每一个分割好的数据块执行两种校验:一种是 32 位的滚动弱校验,另一种是 128 位的 MD4 强校验。

3. β 将这些校验结果发给 α。

4. α 通过搜索文件 A 的所有大小为 S 的数据块 ( 偏移量可以任选,不一定非要是 S 的倍数 ) ,来寻找与文件 B 的某一块有着相同的弱校验码和强校验码的数据块。这项工作可以借助滚动校验的特性很快完成。

5. α 发给 β 一串指令来生成文件 A 在 β 上的备份。这里的每一条指令要么是对文件 B 经拥有某一个数据块而不须重传的证明,要么是一个数据块,这个数据块肯定是没有与文件 B 的任何一个数据块匹配上的。

————————————- 小结 ————————————————

rsync 就是会同步我们指定的两端目录之间的数据,这个数据可以是特殊的数据。同步之前就先进行两端的数据的比对,只会同步两者之间不同的部分,并保留文件原本的属性。并且支持匿名的方式进行同步传输。所以 rsync 在备份,同步上就会较为快速。

—————————-—————————-———————————

二、软件安装

http://rsync.samba.org/ rsync 的官方网站

1)编译安装

很简单那就直接解压

tar zxf rsync-3.1.0.tar.gz

cd rsync-3.1.0

./configure

make

make install

提示:服务器和客户端均要安装 rsync

三、服务器端 rsync 部署

rsync 的启动

1、守护进程启动 rsync
[root@www rsync-2.4.6]# /usr/local/bin/rsync –daemon
即可启动。rsync 默认服务端口为 873,服务器在该端口接收客户的匿名或者认证方式的请求。
2、开机启动
2.1)inetd.conf
编辑 /etc/services,加入行 rsync 873/tcp,指定 rsync 的服务端口是 873。编加 /etc/inetd.conf,加入 rsync stream tcp nowait root /bin/rsync rsync –daemon

注:对于 xinetd,设置方法类似。
2.2)加入 rc.local
将启动命令加入 rc.local 中:/usr/local/bin/rsync –daemon

 

rsync 的两种工作方式:

1) 传输本地文件

2)传输服服务端和客户端之间的数据

 

传输本地文件

具体的 rsync 命令参数后续会讲

[root@CT5_6-32-220-NFS01tmp]# rsync -avz /tmp/dir01/ /tmp/dir02/

building file list … done

./

test01

sent 105 bytes received 48 bytes 306.00bytes/sec

total size is 0 speedup is 0.00

[root@CT5_6-32-220-NFS01 tmp]# tree

.

|– dir01

| `–test01

|– dir02

| `–test01

## 可以看到已经成功的拷贝了。并且要注意/dir01/ 表示目录下的所有内容 /dir01 表示的目录本身

次例子是拷贝 目录下的内容 所以要加上 /dir01/ 如果是要将 /dir01整个目录 拷贝到 /dir02 下,那么就要写/dir01 —> 注意后面没有 /

[root@CT5_6-32-220-NFS01 tmp]# rsync -avz /tmp/dir01 /tmp/dir02/##这样拷贝的是目录本身

building file list … done

dir01/

dir01/test01

sent 111 bytes received 48 bytes 318.00bytes/sec

total size is 0 speedup is 0.00

[root@CT5_6-32-220-NFS01 tmp]# tree

|– dir01

| `–test01

|– dir02

| |– dir01

| | `– test01

| `–test01

Rsync 的详细介绍:请点这里
Rsync 的下载地址:请点这里

推荐阅读:

利用 inotifywait 监控主机文件和目录 http://www.linuxidc.com/Linux/2013-03/81075.htm

利用 inotify+rsync 实现 Linux 文件批量更新 http://www.linuxidc.com/Linux/2012-01/52132.htm

inotify-tools+rsync 实时同步文件安装和配置 http://www.linuxidc.com/Linux/2012-06/63624.htm

rsync 同步完整配置 http://www.linuxidc.com/Linux/2013-06/85781.htm

客户端操作

在对 rsync 服务器配置结束以后,下一步就需要在客户端发出 rsync 命令来实现将服务器端的文件备份到客户端 来。rsync 是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面就对它的选项一一进行分析说明。首先,rsync 的命令格式可以为:
1)rsync [OPTION]… SRC [SRC]… [USER@]HOST:DEST 推送(因为 SRC 是本地)
2)rsync [OPTION]… [USER@]HOST:SRC DEST 拉取 (因为 SRC 是服务端)
3)rsync [OPTION]… SRC [SRC]… DEST 拷贝本地文件
4)rsync [OPTION]… [USER@]HOST::SRC [DEST]
5)rsync [OPTION]… SRC [SRC]… [USER@]HOST::DEST
6)rsync [OPTION]… rsync://[USER@]HOST[:PORT]/SRC[DEST]

SRC: 标示源文件(从哪来拷)DES:目标文件(拷到哪里)
rsync 命令有六种格式:

第 1 个命令格式:是将本地的内容推送到服务器端。实例:rsync /tmp rsync@192.168.1.1:www

第 2 个命令格式:是将服务器的内容拉取到本地端。实例:rsync rsync@192.168.1.1:www /tmp

[对照一下上面的命令格式,一般是有 USER@HOST: 就表示是服务器端,而没有知识 SRC 或 DEST 就表示是客户端。怎么分清楚是拉取还是推送,要看服务端是 SRC 还是 DEST,如果是 SRC 就表示从服务端拷,就是拉取格式如 USER@HOST:SRC。如果是 DEST(拷到哪里)就表示推送,拷到服务端 USER@HOST:DEST]

第 4 个和第 5 个命令同第 1、2 之间的区别就在于服务端(USER@HSOT)后面是跟上一个:还是两个::1g 个:表示会在服务器端启用以个 shell 来执行这个命令。而::表示会以 deamon 模式来执行。

 

 

rsync命令同步参数:

先了解下 rsync 的同步参数选项,先通过本地同步的方式来验证 rsync 的同步参数。

-v :详细模式输出,传输时的进度等信息

-z :传输时进行压缩以提高效率 —compress-level=num 可按级别压缩

-r :对子目录以递归模式,即目录下的所有目录都同样传输。

-t :保持文件的时间信息—time

-o :保持文件属主信息owner

-p :保持文件权限

-g :保持文件的属组信息

-P :–progress 显示同步的过程及传输时的进度等信息

-a :归档模式,表示以地柜模式传输文件,并保持文件所有属性相当于-rtopgdl

-e :使用的信道协议,指定替代 rshshell程序。例如:ssh

-D :保持设备文件信息

-l –links 保留软连接

–progress :显示备份过程

–delete : 删除那些 DST 中 SRC 没有的文件

–exclude=PATTERN 指定排除不需要传输的文件模式

-u, –update 仅仅进行更新,也就是跳过所有已经存在于 DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)

-b, –backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。

-suffix=SUFFIX 定义备份文件前缀

-stats 给出某些文件的传输状态

-R, –relative 使用相对路径信息 如:rsync foo/bar/foo.c remote:/tmp/ 则在 /tmp 目录下创建 foo.c 文件,而如果使用 - R 参数:rsync -R foo/bar/foo.c remote:/tmp/ 则会创建文件 /tmp/foo/bar/foo.c,也就是会保持完全路径信息。

–config=FILE 指定其他的配置文件,不使用默认的 rsyncd.conf 文件

–port=PORT 指定其他的 rsync 服务端口

一般就使用 -avz 来进行传输, 如果放入脚本中可以吧 - v 和 - P 去掉。

客户端命令格式实例:

1.2 从服务器上下载文件

rsync -avz –delete rsycn@192.168.1.1::/tmp /tmp –password-file=/etc/rsync.pas

从本地上传到服务器上去

rsync -avz –delete –progress /tmp rsync@192.168.1.1::/tmp

 

参考实例 1:

 

具体需求:在 A-SERVER 上以 rsync 守护进程的方式部署 rsync 服务,使得所有客户端主机,可以把本地的数据通过 rsync 的方式据备份到服务器 A-SERVER 上。也可以通过 rsync 将数据从 A-SERVER 抓取到客户端。

拓扑方向:C<—->A A<—>B

服务器端

1)配置/etc/rsyncd.conf

Rsyncd.conf 默认是 rsync 服务的配置文件

uid = root #此表示 rsync 以什么用户来读取本地的目。也就是以 root 用户来进行 rsync 指定目录的文件读取,写入权限。

gid = root

use chroot = no

max connections = 200 #最大连接数

timeout = 300

pid file = /var/run/rsyncd.pid

locak file = /var/run/rsync.lock

log file = /var/log/rsyncd.log #日志文件

[atong] #当我们读取的时候,就需要使用到模块名

Path = /tmp/ #指定备份的路径

Ignore errors #忽略错误

read only = false #不只读

list = false #不列出 rsync 目录文件

hosts allow = 10.0.0.0/24

hosts deny = 0.0.0.0/32

auth users = rsync_backup

secrets file = /etc/rsync.password #认证的密钥文件

man rsyncd.conf查看配置的细节信息

注意:配置的 path 一定要存在,并且权限是允许 uidgid去进行读写才可以。有点类似 nfs 的本地文件权限,和 nfs 共享权限一样。

2)配置密码文件:文件格式为 用户:密码 并且里面的只能以这样的格式,并且是没有空格的。而且在配置文件中的 log file 指定的存放路径,就是此密码文件的存放路径,且文件名要正确。密码文件的权限必须是 600 的权限,root root

3)启动rsync

#rsync –-daemon 表示让 rsyncdaemon的模式进行启动

#ps -ef | grep rsync 查看 rsync 进程是否已经启动

#netstat –lnt | grep 873 查看 rsync 是否已经启动,并检测端口状态

#lsof –I tcp:873 用来反查端口对应的是什么服务。

拓展:–daemon 表示以守护进程的方式启动

–address 绑定某个 ip 地址来提供服务,如果有多个 ip 地址的话

–config=file 更还配置文件路径,而不是默认的/etc/rsyncd.conf

–port=PORT 更改其他端口提供服务器,而不是默认的 873 端口

以上的几个参数为了解内容,生产环境并不长常用

配置 rsync 开机启动

echo“/usr/bin/rsync –daemon”>>/etc/rc.local

重启 rsync 服务pkill rsync&&rsync -daemon

客户端部署

1)在同样的密码文件下添加用户的密码 600 权限(文件不一定要和服务端的一样,但为了方便管理,建议一样的)

推送#rsync –avz –P /tmp/atong rsync_back@192.168.1.1::atong

最后面的::表示是以 daemon 模式,并且是 oldboy 模块。此模块的名称必须和配置文件中的一样。

#rsync–avz –P /tmp/atong rsync://rsync_back@192.168.1.1:/atong/ hosts

–password-file=/etc/rsync.password

此方式的推送,最后面的 /atong/ 跟的并不是模块名称,而是直接接上目录路径。[此目录是不是只能够接上,服务器上配置的同步目录]

实例:

[root@CT5_6-32-220-NFS01 data]# cat/etc/rsyncd.conf

uid = root

gid = root

user chroot = no

max connections =200

timeout = 300

pid file =/var/run/rsyncd.pid

locake file =/var/run/rsync.lock

log file = /var/log/rsyncd.log

[tmp]

path=/tmp/

ignore errors

read only = false

list = false

hosts allow = 192.168.40.0/22

hsots deny=0.0.0.0/32

authusers = rsync_back

secretsfile= /etc/rsync.password

[/data/rsync/]

path=/data/rsync/

read only = false

auth users = rsync_back

secrets file = /etc/rsync.password

###

root@CT5_6-32-220-NFS01 tmp]# mkdir /data ## 创建模块中使用到的目录

mkdir: cannot create directory `/data’: File exists

[root@CT5_6-32-220-NFS01 tmp]# cd /data

[root@CT5_6-32-220-NFS01 data]# echo”rsync_back:123456″ >> /etc/rsync.password

[root@CT5_6-32-220-NFS01 data]# chmod 600 /etc/rsync.password##注意密码文件的权限为 600 权限。

[root@CT5_6-32-220-NFS01 data]# rsync –daemon 启动

[root@CT5_6-32-220-NFS01 data]# netstat -lnt | grep873 ##查看系统中是否已经启动 rsync

tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN

###配置客户端:客户端中只需要存放用户的密码,并且权限为 600 即可 ###

[root@CT56-32-221-NFS02 dir01]# echo “123456” >>/etc/rsync.password

[root@CT56-32-221-NFS02 dir01]# chmod 600/etc/rsync.password

第一种拉取方式:

[root@CT56-32-221-NFS02 tmp]# rsync -avz rsync_back@192.168.41.220::tmp /tmp/ ## 其中

[root@CT56-32-221-NFS02 tmp]# ll

total 20

drwxr-xr-x 84 root root 4096 Jun 20 10:28 2

drwxr-xr-x 3root root 4096 Jun 20 10:19 dir01

drwxr-xr-x 3root root 4096 Jun 20 09:43 dir02

drwxr-xr-x 84 root root 4096 Jun 19 05:25 etc

drwx—— 2root root 4096 Jun 20 07:40 ssh-ZQBmZ29557

说明:如果是加上 -delete进行推送,那么我指定的本地目录的内容有哪些,远端目录的内容也就只有哪些。如我原本指定 /tmp/atong/ 和远端 /atong/ 一样。后来又再创建了一个 /delete 目录且为空,那么我再推送 /tmp/delete/ 和远端 /atong/ 目录,那么远端原来有的所有内容都会被删除掉,因为此时的 /delete/ 目录有啥,远端也就有啥。

 

一些示例脚本
这里这些脚本都是 rsync 网站上的例子:


1、每隔七天将数据往中心服务器做增量备份

#!/bin/sh
# This script does personal backups to a rsyncbackup server. You will end up
# with a 7 day rotating incremental backup. Theincrementals will go
# into subdirectories named after the day of theweek, and the current
# full backup goes into a directory called”current”
# tridge@linuxcare.com

# directory to backup
BDIR=/home/$USER

# excludes file – this contains a wildcard patternper line of files to exclude
EXCLUDES=$HOME/cron/excludes

# the name of the backup machine
BSERVER=owl

# your password on the backup server
export RSYNC_PASSWORD=XXXXXX

########################################################################
BACKUPDIR=`date +%A`
OPTS=”–force –ignore-errors–delete-excluded –exclude-from=$EXCLUDES
–delete –backup –backup-dir=/$BACKUPDIR -a”
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin
# the following line clears the last weeks incrementaldirectory
[-d $HOME/emptydir] || mkdir $HOME/emptydir
rsync –delete -a $HOME/emptydir/$BSERVER::$USER/$BACKUPDIR/
rmdir $HOME/emptydir
# now the actual transfer
rsync $OPTS $BDIR $BSERVER::$USER/current
2、备份至一个空闲的硬盘
#!/bin/sh
export PATH=/usr/local/bin:/usr/bin:/bin
LIST=”rootfs usr data data2″
for d in $LIST; do
mount /backup/$d
rsync -ax –exclude fstab –delete /$d/ /backup/$d/
umount /backup/$d
done
DAY=`date “+%A”`
rsync -a –delete /usr/local/apache/data2/backups/$DAY
rsync -a –delete /data/solid /data2/backups/$DAY
3、对vger.rutgers.educvs树进行镜像
#!/bin/bash
cd /var/www/cvs/vger/
PATH=/usr/local/bin:/usr/freeware/bin:/usr/bin:/bin
RUN=`lps x | grep rsync | grep -v grep | wc -l`
if [“$RUN” -gt 0]; then
echo already running
exit 1
fi
rsync -az vger.rutgers.edu::cvs/CVSROOT/ChangeLog$HOME/ChangeLog
sum1=`sum $HOME/ChangeLog`
sum2=`sum /var/www/cvs/vger/CVSROOT/ChangeLog`
if [“$sum1” = “$sum2”]; then
echo nothing to do
exit 0
fi
rsync -az –delete –force vger.rutgers.edu::cvs//var/www/cvs/vger/
exit 0
FAQ
Q:如何通过ssh 进行 rsync,而且无须输入密码?
A:可以通过以下几个步骤
1. 通过 ssh-keygenserver A上建立 SSH keys,不要指定密码,你会在~/.ssh 下看到 identityidentity.pub文件
2. server B上的 home 目录建立子目录 .ssh
3. Aidentity.pub 拷贝到 server B
4. identity.pub 加到 ~[user b]/.ssh/authorized_keys
5. 于是 server A 上的 A 用户,可通过下面命令以用户 B sshserver B上了
e.g. ssh -l userB serverB
这样就使 server A 上的用户 A 就可以 ssh 以用户 B 的身份无需密码登陆到 serverB 上了。
Q:如何通过在不危害安全的情况下通过防火墙使用 rsync?
A:解答如下:
这通常有两种情况,一种是服务器在防火墙内,一种是服务器在防火墙外。无论哪种情况,通常还是使用 ssh,这时最好新建一个备份用户,并且配置 sshd 仅允许这个用户通过 RSA 认证方式进入。如果服务器在防火墙内,则最好限定客户端的 IP 地址,拒绝其它所有连接。如果客户机在防火墙内,则可以简单允许防火墙打开 TCP 端口 22 的 ssh 外发连接就 ok 了。
Q:我能将更改过或者删除的文件也备份上来吗?
A:当然可以:
你可以使用如:rsync -other -options-backupdir = ./backup-2000-2-13 … 这样的命令来实现。
这样如果源文件:/path/to/some/file.c 改变了,那么旧的文件就会被移到./backup-2000-2-13/path/to/some/file.c,
这里这个目录需要自己手工建立起来
Q:我需要在防火墙上开放哪些端口以适应rsync
A:视情况而定
rsync 可以直接通过 873 端口的 tcp 连接传文件,也可以通过 22 端口的 ssh 来进行文件传递,但你也可以通过下列命令改变它的端口:
rsync –port 8730 otherhost::
或者
rsync -e ‘ssh -p 2002’ otherhost:
Q:我如何通过rsync 只复制目录结构,忽略掉文件呢?
Arsync -av –include ‘*/’ –exclude ‘*’ source-dir dest-dir
Q:为什么我总会出现 “Read-only file system” 的错误呢?
A:看看是否忘了设 “read only = no”
Q:为什么我会出现 ‘@ERROR: invalid gid’ 的错误呢?
Arsync使用时默认是用 uid=nobody;gid=nobody 来运行的,如果你的系统不存在 nobody 组的话,就会出现这样的错误,可以试试 gid = nogroup 或者其它
Q:绑定端口873 失败是怎么回事?
A:如果你不是以 root 权限运行这一守护进程的话,因为 1024 端口以下是特权端口,会出现这样的错误。你可以用 –port 参数来改变。
Q:为什么我认证失败?
A:从你的命令行看来:
你用的是:
>; bash$ rsync -a 144.16.251.213::test test
>; Password:
>; @ERROR: auth failed on module test
>;
>; I dont understand this. Can somebody explainas to how to acomplish this.
>; All suggestions are welcome.
应该是没有以你的用户名登陆导致的问题,试试 rsync -amax@144.16.251.213::test test

————————————– 自我小结 ——————————————-

rsycn 就是用于同步的工具,只要服务器端配置好,具体的配置参数依据自己的应用而定。而客户端的同步命令也是依据个人的环境而定。倒是之后的的客户端同步脚本我觉得很有用。这次文章好长啊,本来自己的笔记就比较乱,一时没整理好文章的结构出来。大家看看有什么不对的地方,给我提一提。

—————————————————————————————–

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计17943字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中