RSync

Linux系统 gongyj 775℃ 已收录 0评论

一、什么是rsync

rsync是类unix系统下的数据镜像备份工具,一款快速增量备份工具Remote Sync(remote synchronize),远程同步支持本地复制,或者与其他SSH、rsync主机同步,其保密性也非常好,另外它还是免费的软件。它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。 rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法。

rsync 包括如下的一些特性:

   可以镜像保存整个目录树和文件系统;

   可以很容易做到保持原来文件的权限、时间、软硬链接等等;

  对于安装来说,无任何特殊权限要求;

   快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽;

   安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接;

   支持匿名传输,是理想的镜像工具。

Rsync同步算法:

   Rsync只所以同步文件的速度相当快,是因为“Rsync同步算法”能在很短的时间内计算出需要备份的数据,关于Rsync的同步算法描述如下:

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

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

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

   3、2号将这些校验结果发给1号。

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

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

二、架设rsync服务器

架设rsync 服务器比较简单,写一个配置文件rsyncd.conf 。文件的书写也是有规则的,我们可以参照rsync.samba.org 上的文档来做。当然我们首先要安装好rsync这个软件才行。

1、rsync的安装

获取rsync

rysnc的官方网站:http://rsync.samba.org/可以从上面得到最新的版本。目前最新的发型版是3.1.1。当然,因为rsync是一款如此有用的软件,所以很多Linux的发行版本都将它收录在内了。

软件包安装

sudo apt-get install rsync
#在debian、ubuntu 等在线安装方法;
yum install rsync
#Fedora、Redhat 等在线安装方法;
rpm -ivh rsync-3.0.6-12.el6.x86_64.rpm
#Fedora、Redhat 等rpm包安装方法;

其它Linux发行版,请用相应的软件包管理方法来安装。

源码包安装

tar xvf  rsync-xxx.tar.gz
#在用源码包编译安装之前,您得安装gcc等编译开具才行;
cd rsync-xxx
./configure --prefix=/usr
make && make install

2、配置文件

rsync的主要有以下四个配置文件rsyncd.conf(主配置文件)、rsyncd.secrets(密码文件)、rsyncd.motd(rysnc服务器信息)、rsync.password(rsync客户端密码文件),服务器配置文件(/etc/rsyncd.conf),该文件默认不存在,请创建它。启动和客户端操作,如果没加参数,默认会到/etc寻找这些文件,但为了管理方便,我们在/etc下创建的文件夹,来放这些文件。

具体步骤如下:

mkdir /etc/rsyncd
touch /etc/rsyncd/rsyncd.conf
touch /etc/rsyncd/rsyncd.secrets
chmod 600 /etc/rsyncd/rsyncd.secrets
touch /etc/rsyncd/rsync.password
chmod 600 /etc/rsyncd/rsyncd.secrets
touch /etc/rsyncd//rsyncd.motd

首先设定etc/rsyncd/rsyncd.conf

rsyncd.conf是rsync服务器主要配置文件。我们先来个简单的示例,后面在详细说明各项作用。

vim /etc/rsyncd/rsyncd.conf
# Distributed under the terms of the GNU General Public License v2
# 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
pid file = /var/run/rsyncd.pid 
lock file=/var/run/rsyncd.lock 
port = 873
address = 192.168.1.171  
uid=root
gid=root
max connections=0   #limit client conection

use chroot = yes  
read only = no

#This will give you a separate log file
log file=/var/log/rsyncd.log

motd file = /etc/rsyncd/rsyncd.motd

####limit user conn######
hosts allow=192.168.1.0/24
hosts deny=*

#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

[webapps]
path = /data/website/webapps
list = yes
ignore errors
auth users = admin
#username
secrets file = /etc/rsyncd/rsyncd.secrets
comment = webapps directory
#exclude = a/ b/   #####a,b directory not backup

关于auth users不是在服务器上存在的真实的系统用户,自己创建,如果你想用多个用户以,号隔开,比如auth users = admin,root,user2

设定密码文件

密码文件格式很简单(密码是明文的),rsyncd.secrets的内容格式为:

用户名:密码

vim /etc/rsyncd/rsyncd.secrets
admin:abc123
root:qweasd
user2:123890

修改属主

chown root.root /etc/rsyncd/rsyncd.secrets

配置文件中uid与gid设置的是哪个用户,就要把此文件改成对应的属主,将rsyncd.secrets这个密码文件的文件属性设为root拥有, 且权限要设为600, 否则无法备份成功!出于安全目的,文件的属性必需是只有属主可读,服务端需要写入的话,也要赋予写入权限。

客户端密码文件

这个文件只需要在客户机上创建即可(/etc/rsyncd/rsync.password),里边只需写入密码,如果没有该文件,使用的时候就必须手工输入密码了。

vim /etc/rsyncd/rsync.password
abc123

提示文件(rsyncd.motd),这个文件只是个提示信息,里边随便写点就行,如主机名或ip地址,没有此文件也可以。

三、rsyncd.conf服务器的配置详解

1、全局定义

在rsync 服务器中,全局定义有几个比较关健的,根据我们前面所给的配置文件 rsyncd.conf 文件:

pid file = /var/run/rsyncd.pid      #进程pid文件路径
lock file=/var/run/rsyncd.lock      #进程锁定文件路径
port = 873                          #指定运行端口,默认是873,可以自己指定;
address = 192.168.1.171             #指定服务器IP地址,也可以设置成监听服务器上所有IP地址
uid=root                            #进程启动用户身份,可以用id
gid=root                            #进程启动用户组,可以用gid
                                    #服务器端传输文件时,要发哪个用户和用户组来执行,默认是nobody。 如果用nobody 用户和用户组,写入时可能遇到权限问题,有些文件从服务器上拉不下来。所以我就偷懒,为了方便,用了root 。不过您可以在定义要同步的目录时定义的模块中指定用户来解决权限的问题。
max connections=0                   #客户端最大连接数,0为不限制
use chroot = yes                    #用chroot,在传输文件之前,服务器守护程序在将chroot 到文件系统中的目录中,这样做的好处是可能保护系统被安装漏洞侵袭的可能。缺点是需要超级用户权限。另外对符号链接文件,将会排除在外。也就是说,你在 rsync服务器上,如果有符号链接,你在备份服务器上运行客户端的同步数据时,只会把符号链接名同步下来,并不会同步符号链接的内容;这个需要自己来尝试
read only = no                      #read only 是只读选择,yes也就是说,不让客户端上传文件到服务器上。还有一个 write only选项,自己尝试是做什么用的吧;
motd file = /etc/rsyncd/rsyncd.motd   #motd file 是定义服务器信息的,要自己写 rsyncd.motd 文件内容。当用户登录时会看到这个信息
####limit user conn######
hosts allow=192.168.1.0/24          #限定允许哪些Ip可以访问,在您可以指定单个IP,也可以指定整个网段,能提高安全性。格式是ip 与ip 之间、ip和网段之间、网段和网段之间要用空格隔开;
hosts deny=*
#This will give you a separate log file
log file=/var/log/rsyncd.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
                                    %h 远程主机名
                                    %a 远程IP地址
                                    %l 文件长度字符数
                                    %p 该次rsync会话的进程id
                                    %o 操作类型:"send"或"recv"
                                    %f 文件名
                                    %P 模块路径
                                    %m 模块名
                                    %t 当前时间
                                    %u 认证的用户名(匿名时是null)
                                    %b 实际传输的字节数
                                    %c 当发送文件时,该字段记录该文件的校验码
                                    默认log格式为:"%o %h [%a] %m (%u) %f %l",一般来说,在每行的头上会添加"%t [%p] "。在源代码中同时发布有一个叫rsyncstats的perl脚本程序来统计这种格式的日志文件。
#syslog facility = local3
#timeout = 300
[webapps]                           #定义模块,模块为我们提供了一个链接的名字
path = /data/website/webapps        #指定文件目录所在位置,这是必须指定的 
list = yes                          #意思是把rsync 服务器上提供同步数据的目录在服务器上模块是否显示列出来。默认是yes 。如果你不想列出来,就no ;如果是no是比较安全的,至少别人不知道你的服务器上提供了哪些目录。你自己知道就行了;
ignore errors                       #忽略IO错误
auth users = admin                  #可以访问用户
secrets file = /etc/rsyncd/rsyncd.secrets #密码存在哪个文件
comment = webapps directory         #注释可以自己定义
#exclude = a/ b/                    #排除哪些目录,用空格分开

四、启动rsync服务器并允许防火墙通过

启动rsync服务器相当简单,有以下几种方法

daemon参数方式,是让rsync以服务器模式运行

/usr/bin/rsync --daemon  --config=/etc/rsyncd/rsyncd.conf
#--config用于指定rsyncd.conf的位置,如果在/etc下可以不写

可以在/etc/rc.d/rc.local里加入让系统自动启动

xinetd方式

修改services加入如下内容

vim /etc/services
rsync  873/tcp  # rsync 
rsync  873/udp  # rsync

这一步一般可以不做,通常都有这两行。修改的目的是让系统知道873端口对应的服务名为rsync。如没有的话就自行加入。

设定 /etc/xinetd.d/rsync, 简单例子如下:

vim /etc/xinetd.d/rsync
# default: off
# description: The rsync server is a good addition to an ftp server, as it \
#       allows crc checksumming etc.
service rsync
{
        disable = no
        flags           = IPv6
        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)。然后service xinetd restart, 使上述设定生效。

resync修改配置文件后,立即生效,无需重启服务,使用起来非常方便。

五、通过rsync客户端来同步数据

rsync有六种不同的工作模式:
  1. rsync [OPTION]... SRC [SRC]... DEST
  拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。
  2. rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
  用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。
  3. rsync [OPTION]... [USER@]HOST:SRC DEST
  使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。 
  4. rsync [OPTION]... [USER@]HOST::SRC [DEST]
  从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
  5. rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
  从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。 
  6. rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
  列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。

参数详解编辑

-v, --verbose        详细模式输出
-q, --quiet         精简输出模式
-c, --checksum       打开校验开关,强制对文件传输进行校验
-a, --archive       归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, --recursive      对子目录以递归模式处理
-R, --relative       使用相对路径信息
-b, --backup        创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
--backup-dir        将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX        定义备份文件前缀
-u, --update        仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l, --links         保留软链结
-L, --copy-links      想对待常规文件一样处理软链结
--copy-unsafe-links    仅仅拷贝指向SRC路径目录树以外的链结
--safe-links         忽略指向SRC路径目录树以外的链结
-H, --hard-links      保留硬链结
-p, --perms         保持文件权限
-o, --owner        保持文件属主信息
-g, --group        保持文件属组信息
-D, --devices        保持设备文件信息
-t, --times         保持文件时间信息
-S, --sparse         对稀疏文件进行特殊处理以节省DST的空间
-n, --dry-run        现实哪些文件将被传输
-W, --whole-file      拷贝文件,不进行增量检测
-x, --one-file-system   不要跨越文件系统边界
-B, --block-size=SIZE   检验算法使用的块尺寸,默认是700字节
-e, --rsh=COMMAND     指定使用rsh、ssh方式进行数据同步
--rsync-path=PATH     指定远程服务器上的rsync命令所在路径信息
-C, --cvs-exclude     使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
--existing         仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
--delete          删除那些DST中SRC没有的文件
--delete-excluded     同样删除接收端那些被该选项指定排除的文件
--delete-after       传输结束以后再删除
--ignore-errors      及时出现IO错误也进行删除
--max-delete=NUM     最多删除NUM个文件
--partial         保留那些因故没有完全传输的文件,以是加快随后的再次传输
--force           强制删除目录,即使不为空
--numeric-ids       不将数字的用户和组ID匹配为用户名和组名
--timeout=TIME      IP超时时间,单位为秒
-I, --ignore-times    不跳过那些有同样的时间和长度的文件
--size-only        当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
--modify-window=NUM    决定文件是否时间相同时使用的时间戳窗口,默认为0
-T --temp-dir=DIR     在DIR中创建临时文件
--compare-dest=DIR    同样比较DIR中的文件来决定是否需要备份
-P               等同于 --partial
-z, --compress      对备份的文件在传输时进行压缩处理
--exclude=PATTERN     指定排除不需要传输的文件模式
--include=PATTERN     指定不排除而需要传输的文件模式
--exclude-from=FILE    排除FILE中指定模式的文件
--include-from=FILE    不排除FILE指定模式匹配的文件
--version         打印版本信息
--address          绑定到特定的地址
--config=FILE       指定其他的配置文件,不使用默认的rsyncd.conf文件
--port=PORT        指定其他的rsync服务端口
--blocking-io       对远程shell使用阻塞IO
-stats           给出某些文件的传输状态
--progress          在传输时显示传输过程
--log-format=formAT    指定日志文件格式
--password-file=FILE   从FILE中得到密码
--bwlimit=KBPS       限制I/O带宽,KBytes per second
-h, --help          显示帮助信

其它参数请看man手册与 http://blog.chinaunix.net/uid-10362953-id-2961174.html 查看。

列出rsync 服务器上的所提供的同步内容:

首先:我们看看rsync服务器上提供了哪些可用的数据源

rsync -v rsync://192.168.1.171
  或
rsync --list-only 192.168.1.171::
## 32 ##

webapps         c3 directory
spxq           c3 directory

前面是rsync所提供的数据源,也就是我们在rsyncd.conf中所写的[webapps]模块。而“c3 directory”是由[webapps]模块中的 comment =c3 directory 提供的。

rsync -v rsync://rsync@192.168.1.171/webapps
或
rsync --list-only admin@192.168.1.171::webapps
## 32 ##

drwxr-xr-x        4096 2015/09/08 12:10:26 .
-rw-r--r--    24313835 2015/09/08 12:06:45 ajax.php
drwxr-xr-x      431386 2015/09/08 12:10:26 console.conf.php    
-rw-r--r--    24313835 2015/09/08 12:06:45 index.php
-rwxr-xr-x      431386 2015/09/08 12:10:26 packages

后面的admin@ip中,admin是指定密码文件中的用户名,之后的::webapps这是webapps模块名

rsync客户端同步数据:

rsync -avz --delete --progress --password-file=/etc/rsyncd/rsync.password admin@192.168.1.171::webapps /data/website/webapps/

–delete 选项,表示客户端上的数据要与服务器端完全一致,如果webapps目录中有服务器上不存在的文件,则删除。最终目的是让webapps目录上的数据完全与服务器上保持一致;用的时候要小心点,最好不要把已经有重要数所据的目录,当做本地更新目录,否则会把你的数据全部删除;

–delete-file 当我们以admin用户登录rsync服务器同步数据时,密码将读取rsync.password这个文件,无需再次输入密码。这个文件内容只是admin用户的密码,权限也必须为600。

*请注意,目录加“/”与不加时的区别,测试时请慎重操作

客户端限速上传数据:

rsync -vzrtpP --bwlimit=1000 --delete --password-file=/etc/rsyncd/rsync.password /data/website/webapp/ ladmin@192.168.1.171::webapps

ssh非默认端口传输:

rsync -vzrtpP --bwlimit=1000 -e 'ssh -p 2212' --delete-after /data/website/webapp/ ladmin@192.168.1.171::webapps

ssh模式只能输入密码,或创建密钥对来进行无密码传输。

我们还可以写成脚本,放到计划任务里,定时同步。如果想要实时同步,请看后续文章。

本站文章如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:http://blog.chopmoon.com/favorites/205.html
喜欢 (0)
发表我的评论
取消评论

表情 代码 贴图 加粗 链接 私信 删除线 签到

Hi,请填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
正在加载中……