rsync配置与使用指南

好了,这一篇我们顺着上面几篇的思路来说说rsync,所有的内容在参考链接中都可以看到更详细应该也是更有深度的说明……

rsync科普级介绍

如果你在寻找一个差异同步上传机制,那么rsync就是你想要的,在目录中选择性拷贝,安全保障,提供多种传输方式,具体的功能可以从之后的介绍和扩展阅读中看出。

rsync算法介绍

酷壳有一篇介绍,不过一些名词介绍的比较让人郁闷,先给个总结:rsync = 分块hash check + 滑动窗口。

摘要算法,不考虑碰撞的话,核心也就是相同的内容,会在计算后产生相同的摘要,但是我们知道,md5其实是有一定的碰撞概率的,在rsync中,为了更加快速,引入了一个弱检验算法——Alder32算法,当然,这也代表了更大的碰撞率,因此,我们要同时用到强弱检验,弱检验可以用于确认两段信息是否不同,而强检验确保他们相同,两者结合,碰撞的概率就极低,基本可以不考虑。

滑动窗口,对,我们想到了TCP中的那个滑动窗口,在rsync中叫做rolling checksum(由于英文刚开始没看懂……),之后我们会介绍如何应用滑动窗口检验。

为什么要引入摘要算法,首先我们注意,平时我们用的git,或者是刷的OJ,本质上用的是diff,但是diff必须保证在同一台机器上进行,如果上传完了再diff,也就没有意义了,因此我们分块传输比较,只要传输摘要即可。

接下来,我们分块滑动,毕竟如果整体摘要,那么无法表现出差异了,假定窗口大小为4字节(因为我们例子字符串不长,实际上自然不会这么小)。称待上传的文件为源文件,服务器里的文件为目标文件。

以下是一个实际例子,用简单的实际例子能更好的说明问题:

假设目标文件中为codesky,源文件中已经修改为icodesky,即多了一个i字,先分块计算出目标文件的弱检验的值便于比较。

首先比较icod和code,发现不同,但是我们直接移动到下一个块的话,这辈子都匹配不起来了……实际上变动的只有一个字符,所以就移动一个字节,i就是目前的差异项。

code和code,相同,进行强检验,也相同,我们看做同一个块,不改动,源文件滑动到下一个块,此时不满4字节了,直接传输。

这是一段总结引用:

每块计算出Alder32校验和,再与目标文件的校验和比。如此循环下去,直到某个校验和相同了,那么把这段字符串再计算出MD5值,再与源文件过来的对应的MD5值相比(还记得吧?目标文件对每个块既计算出Alder32又计算出MD5值),如果不同,则继续往后移1字节,继续比Alder32、MD5值。如果相同,则认为这4字节数据,服务器与客户端保存的一致,忽略这块数据(例如4字节),继续向下看。
全部处理完后,按源文件的文件顺序,向目标文件发送以下数据:对于不能够在目标文件数据块中找到相同块的字符串,直接列上发出;如果可以找到,则写上MD5和Alder32值,代替原来1024字节的数据块。同样,最后不足1K大小的部分直接列上发出。

rsync配置

知道了rsync的原理之后,我们来看一下rsync的配置信息,首先,客户端和服务端都必须安装rsync,在Mac和Ubuntu中都已经自带了,CentOS没有确定过,但安装现在对于我们而言应该不是太大难事。

(以下来自:centos下配置rsyncd服务器

接下来创建配置文件等:

touch /etc/rsyncd/rsyncd.conf          #主配置文件
touch /etc/rsyncd/rsyncd.secrets       #用户名密码文件,一组用户一行,用户名和密码使用 : 分割
touch /etc/rsyncd/rsyncd.motd          #非必须,连接上rsyncd显示的欢迎信息,此文件可不创建

设置密码文件权限:

chmod 0600 /etc/rsyncd/rsyncd.secrets

必须是600,否则会报错——密码文件中的用户名密码不一定是服务器的用户名密码,用户名与配置文件相对应即可。

######################################################################################################
#                      ******进程相关全局配置******
######################################################################################################
# = 后面的值可根据自己的实际情况更改
#    pid file 守护进程pid文件
#    port 守护进程监听端口,可更改,由xinetd允许rsyncd时忽略此参数
#    address 守护进程监听ip,由xinetd允许rsyncd时忽略此参数
pid file = /usr/local/var/run/rsyncd.pid
port = 873
address = 192.168.1.2
#rsyncd 守护进程运行系统用户全局配置,也可在具体的块中独立配置,
uid = root
gid = root
#允许 chroot,提升安全性,客户端连接模块,首先chroot到模块path参数指定的目录下
#chroot为yes时必须使用root权限,且不能备份path路径外的链接文件
use chroot = yes
#只读
read only = no
#只写
write only = no
#允许访问rsyncd服务的ip,ip端或者单独ip之间使用空格隔开
hosts allow = 192.168.0.1/255.255.255.0 198.162.145.1 10.0.1.0/255.255.255.0
#不允许访问rsyncd服务的ip,*是全部(不涵盖在hosts allow中声明的ip,注意和hosts allow的先后顺序)
hosts deny = *
#客户端最大连接数
max connections = 5
#欢迎文件路径,可选的
#motd file = /etc/rsyncd/rsyncd.motd
#日志相关
#    log file 指定rsync发送消息日志文件,而不是发送给syslog,如果不填这个参数默认发送给syslog
#    transfer logging 是否记录传输文件日志
#    log format 日志文件格式,格式参数请google
#    syslog facility rsync发送消息给syslog时的消息级别,
#    timeout连接超时时间
log file = /usr/local/logs/rsyncd.log
transfer logging = yes
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300

######################################################################################################
#                      ******模块配置(多个)******
######################################################################################################
#模块 模块名称必须使用[]环绕,比如要访问data1,则地址应该是data1user@192.168.1.2::data1
[data1]
#模块根目录,必须指定
path=/home/username
#是否允许列出模块里的内容
list=yes
#忽略错误
#ignore errors
#模块验证用户名称,可使用空格或者逗号隔开多个用户名
auth users = data1user
#模块验证密码文件 可放在全局配置里
secrets file=/etc/rsyncd/rsyncd.secrets
#注释
comment = some description about this moudle
#排除目录,多个之间使用空格隔开
exclude = test1/ test2/

这个配置文件有很多可以简化的地方重要的是只读权限必须要设置为no,不然无法上传到服务器,模块必须配置,并配置好目录和模块用户验证名,模块用户即对应的密码文件中的用户名,排除目录可以在服务器中设置,也可以在传输时指定。

全部配置完成之后启动服务:

#默认配置文件是/etc/rsyncd.conf,所以需要显式的指定配置文件
/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
#假设使用putty,xshell终端操作,保证终端断开进程仍然执行
nohup /usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf

这样配置文件就算是配置成功了,开机启动需要编辑/etc/rc.local添加以上命令即可。

如果你的服务器开启了防火墙,记得加上对应的端口(写在配置文件或者默认为873):

iptables -A INPUT -p tcp -m state --state NEW  -m tcp --dport 873 -j ACCEPT

rsync使用

基础:

rsync src_file machineB:/home/userB

这种方法走的是ssh:

rsync [OPTION]... SRC DEST
rsync [OPTION]... SRC [USER@]host:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... [USER@]HOST::SRC DEST 
rsync [OPTION]... SRC [USER@]HOST::DEST
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

以上是6种不同的工作方式,具体的来说:

  1. 拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。如:rsync -a /data /backup
  2. 使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。如:rsync -avz *.c foo:src
  3. 使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。如:rsync -avz foo:src/bar /data
  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。如:rsync -av root@192.168.78.192::www /databack
  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。如:rsync -av /databack root@192.168.78.192::www
  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。如:rsync -v rsync://192.168.78.192/www

需要注意,如果需要用到配置文件中的用户名密码信息,则需要使用两个冒号的形式,一个冒号走的是使用如ssh等方式运行(此时免密码可以通过配置ssh-key的方式进行)。

使用双冒号的形式,配置为:

rsync [options] localFile --password-file=[file] user@server::module_name/extra_path

同时,尽管rsync可以创建目录,但只能创建一级(换言之用的是mkdir而不是mkdir -p),需要创建多级目录才能传输的情况会直接抛出错误,无法正确传输,需要事先在服务器中建立好对应文件。

本地的password-file只需要记录密码即可。

这里介绍几个参数来印证我们上述算法:

-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节。
-I, --ignore-times 不跳过那些有同样的时间和长度的文件。

剩下的参数可以看,在这里就不多做解释了:

http://man.linuxde.net/rsync

http://roclinux.cn/?p=2643

结束

之后我们终于能愉快的同步了。

参考链接

centos下配置rsyncd服务器

烂泥:linux文件同步之rsync学习(一)

rsync 的核心算法

详解rsync算法--如何减少同步文件时的网络传输量

rsync算法

rsync那些事儿

如果您觉得文章不错,可以通过赞助支持我

标签: centos, 命令, 使用, 算法

仅有一条评论

  1. 前来点赞

添加新评论