Rsync 介绍和测试

rsync 表示 remote sync,其用于在本地或与远程主机间进行文件或目录备份

rsync有以下优点:

    速度:除首次全拷贝外,其他时候实现增量拷贝,加快传输速度
    安全:传输数据时可用ssh加密传输
    带宽占用:rsync可对数据进行分块压缩传输,相比其他文件传输工具占用更少带宽
    权限限制:非root用户也可安转和执行rsync命令

核心算法介绍:

    假定在名为α和β的两台计算机之间同步相似的文件 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在备份,同步上就会较为快速。
    -----------------------------------------------------------------------------------------

rsync执行方式如下:

    $ rsync options source destination
    source 和 destination 既可以指示本地,也可以是远程机器。下面通过实例说明rsync的用法。

rsync的命令格式可以为以下六种:

    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] 


对应于以上六种命令格式,rsync有六种不同的工作模式: 

    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@172.16.78.192::www /databack 
    5)从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含”::”分隔符时启动该模式。如:rsync -av /databack root@172.16.78.192::www 
    6)列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。如:rsync -v rsync://172.16.78.192/www 

由此可知,rsync可以像cp一样从本地拷贝文件备份,可以像scp一样远程拷贝,也可以以rsync服务的方式拷贝文件(隐藏了本地具
体目录名称,增强了安全性),关于rsync服务的搭建,后面有专门讲解。注意rsync不能实现直接控制远程机器和远程机器之间的拷贝。 

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 
--progress 显示备份过程 
-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 显示帮助信息 

一般同步传输目录都使用-zav选项. 

测试结果:

1. 在本地两个目录间进行数据同步
    以下命令用于在两个目录间完成文件拷贝:
        $ rsync -zvr /var/opt/lx/ /root/temp/

2. 本地与远程主机间完成数据同步
    我们可以用rsync将本地的文件,同步到远程机器:
        $ rsync -avz /root/temp/ lx@192.168.1.103:/home/lx/tmp/
         //(Password:此处输入你的密码)

3. 使用ssh通道进行数据同步
    在与远端进行数据同步时,我们一般采用ssh通道,使用 -e ssh 选项可以完成该功能:
        $ rsync -avz -e ssh /root/temp/ lx@192.168.1.103:/home/lx/tmp/


4. 不覆盖目的地对文件已作的修改
    经常出现这样的场景,我们对源文件和目的地文件均作了修改,同时想将源文件作的修改同步到目的地,但又保留对目的地文件的更改,此时可以使用 -u 选项:
        $ rsync -avzu /var/opt/lx/ /root/temp/

5. 删除不存在于源目录的目的地文件
    对于不存在于源目录,但存在于目的地的文件,有时我们想在做文件同步时删除它们,–delete 选项可以满足要求:
        $ rsync -avz --delete /var/opt/lx/ /root/temp/

6. 在同步时不在目的地创建新文件
    有时我们只想对目的地已经有的文件进行同步,而不理会源目录新增的文件,此时可以使用 –existing 选项:
        $ rsync -avz --existing /var/opt/lx/ /root/temp/

7. 显示执行进度
    使用 –progress 选项可以显示同步的进度,包括文件传输完成进度、传输速率信息:
        $ rsync -avz --progress /var/opt/lx/ /root/temp/

8. 查看 source 和 destination 间的区别
    -i 选项可以显示源目录与目的地间的差异
        $ rsync -avzi /var/opt/lx/ /root/temp/
    显示结果:
        sending incremental file list
        .d..t...... ./
        >f.st...... a.c
        .f....o.... b.c

        sent 175 bytes  received 37 bytes  424.00 bytes/sec
        total size is 153  speedup is 0.72

对于同步的每个文件,均对应有一条输出,有11个标志位指示源文件与目的地文件的区别,在以上例子中,各标志位意义如下:
    > 指示传输到本地
    f 指示所传为文件
    s 指示文件大小不一致
    t 指示时间戳不一致
    o 指示属主不一致

9. 按指定模式进行同步
    使用 –include 和 –exclude 选项,可以帮助我们完成只同步特定文件的目的,例如以下只同步以 ‘a’ 开头的文件:
        $ rsync -avz --include 'a*' --exclude '*' /var/opt/lx/ /root/temp/

10. 限制传输文件的大小
    使用 –max-size 选项,我们可以限制传输文件的最大大小:
        $ rsync -avz --max-size='100K' /var/opt/lx/ /root/temp/
11. 全拷贝
    默认情况下 rsync 采用增量拷贝,这样能节省带宽,在所同步文件不大的情况下,我们可以通过 -W 选项实现全拷贝:
        $ rsync -avzW /var/opt/lx/ /root/temp/

rsync 常见错误与解决方法整理

我们都是通过错误日志查看
在rsyncd.log里面或.err文件里面,大家可以用记事本打开查看。
注意windows下面我们需要给SvcwRsync用户,管理同步目录的所有权限,基本上这样就可以了

问题一: 
@ERROR: chroot failed 
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3] 
    原因: 服务器端的目录不存在或无权限,创建目录并修正权限可解决问题。 

问题二: 
@ERROR: auth failed on module tee 
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3] 
    原因: 服务器端该模块(tee)需要验证用户名密码,但客户端没有提供正确的用户名密码,认证失败。 
提供正确的用户名密码解决此问题。 

问题三: 
@ERROR: Unknown module ‘tee_nonexists' 
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3] 
    原因: 服务器不存在指定模块。提供正确的模块名或在服务器端修改成你要的模块以解决问题。 


问题1: 
在client上遇到问题: 
rsync -auzv --progress --password-file=/etc/rsync.pas root@192.168.133.128::backup /home/ 
rsync: could not open password file "/etc/rsync.pas": No such file or directory (2) 
Password: 
@ERROR: auth failed on module backup 
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7] 
    遇到这个问题:client端没有设置/etc/rsync.pas这个文件,而在使用rsync命令的时候,加了这个参数-- 
password-file=/etc/rsync.pas 

问题2: 
rsync -auzv --progress --password-file=/etc/rsync.pas root@192.168.133.128::backup /home/ 
@ERROR: auth failed on module backup 
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7] 
    遇到这个问题:client端已经设置/etc/rsync.pas这个文件,里面也设置了密码111111,和服务器一致,但是 
服务器段设置有错误,服务器端应该设置/etc/rsync.pas ,里面内容root:111111 ,这里登陆名不可缺少 

问题3: 
rsync -auzv --progress --password-file=/etc/rsync.pas root@192.168.133.128::backup /home/ 
@ERROR: chdir failed 
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7] 
    遇到这个问题,是因为服务器端的/home/backup 其中backup这个目录并没有设置,所以提示:chdir failed 

问题4: 
rsync: write failed on "/home/backup2010/wensong": No space left on device (28) 
rsync error: error in file IO (code 11) at receiver.c(302) [receiver=3.0.7] 
rsync: connection unexpectedly closed (2721 bytes received so far) [generator] 
rsync error: error in rsync protocol data stream (code 12) at io.c(601) [generator=3.0.7] 
    磁盘空间不够,所以无法操作。 可以通过df /home/backup2010 来查看可用空间和已用空间 

问题5:网络收集问题 
1、权限问题 
    类似如下的提示:rsync: opendir "/kexue" (in dtsChannel) failed: Permission denied (13)注意查看同步的目录权限是否为755 
2、time out 
rsync: failed to connect to 203.100.192.66: Connection timed out (110) 
rsync error: error in socket IO (code 10) at clientserver.c(124) [receiver=3.0.5] 
    检查服务器的端口netstat –tunlp,远程telnet测试。 
    可能因为客户端或者服务端的防火墙开启 导致无法通信,可以设置规则放行 rsync(873端口) 或者直接关闭防火墙。 
    还有一种在同步过程中可能会提示没有权限 (将同步目录加上SvcwRsync全部权限即可,更简单的方法就是将SvcwRsync设为管理员即可)

3、服务未启动 
rsync: failed to connect to 10.10.10.170: Connection refused (111) 
rsync error: error in socket IO (code 10) at clientserver.c(124) [receiver=3.0.5] 
    启动服务:rsync --daemon --config=/etc/rsyncd.conf 

4、磁盘空间满 
rsync: recv_generator: mkdir "/teacherclubBackup/rsync……" failed: No space left on device (28) 
*** Skipping any contents from this failed directory *** 

5、Ctrl+C或者大量文件 
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(544) [receiver=3.0.5] 
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(544) [generator=3.0.5] 
    说明:导致此问题多半是服务端服务没有被正常启动,到服务器上去查查服务是否有启动,然后查看下 /var/run/rsync.pid 文件是否存在,
最干脆的方法是杀死已经启动了服务,然后再次启动服务或者让脚本加入系统启动服务级别然后shutdown -r now服务器

6、xnetid启动 
rsync: read error: Connection reset by peer (104) 
rsync error: error in rsync protocol data stream (code 12) at io.c(759) [receiver=3.0.5] 
    查看rsync日志 
rsync: unable to open configuration file "/etc/rsyncd.conf": No such file or directory 
    xnetid查找的配置文件位置默认是/etc下,根据具体情况创建软链接。例如: 
    ln -s /etc/rsyncd/rsyncd.conf /etc/rsyncd.conf 
    或者更改指定默认的配置文件路径,在/etc/xinetd.d/rsync配置文件中。 
Rsync configure:
配置一:
ignore errors
    说明:这个选项最好加上,否则再很多crontab的时候往往发生错误你也未可知,因为你不可能天天去看每时每刻去看log,不加上这个出现错误的几率相对会很高,因为任何大点的项目和系统,磁盘IO都是一个瓶颈

Rsync error: 
错误一: 
@ERROR: auth failed on module xxxxx 
rsync: connection unexpectedly closed (90 bytes read so far) 
rsync error: error in rsync protocol data stream (code 12) at io.c(150) 
    说明:这是因为密码设置错了,无法登入成功,检查一下rsync.pwd,看客服是否匹配。还有服务器端没启动rsync 服务也会出现这种情况。

错误二: 
password file must not be other-accessible 
continuing without password file 
Password: 
    说明:这是因为rsyncd.pwd rsyncd.sec的权限不对,应该设置为600。如:chmod 600 rsyncd.pwd

错误三: 
@ERROR: chroot failed 
rsync: connection unexpectedly closed (75 bytes read so far) 
rsync error: error in rsync protocol data stream (code 12) at io.c(150) 
    说明:这是因为你在 rsync.conf 中设置的 path 路径不存在,要新建目录才能开启同步

错误四: 
rsync: failed to connect to 218.107.243.2: No route to host (113) 
rsync error: error in socket IO (code 10) at clientserver.c(104) [receiver=2.6.9] 
    说明:防火墙问题导致,这个最好先彻底关闭防火墙,排错的基本法就是这样,无论是S还是C,还有ignore errors选项问题也会导致

错误五:
@ERROR: access denied to www from unknown (192.168.1.123)
rsync: connection unexpectedly closed (0 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(359)
    说明:此问题很明显,是配置选项host allow的问题,初学者喜欢一个允许段做成一个配置,然后模块又是同一个,致使导致

错误六:
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(244) [generator=2.6.9]
rsync error: received SIGUSR1 (code 19) at main.c(1182) [receiver=2.6.9]
    说明:导致此问题多半是服务端服务没有被正常启动,到服务器上去查查服务是否有启动,然后查看下 /var/run/rsync.pid 文件是否存在,最干脆的方法是杀死已经启动了服务,然后再次启动服务或者让脚本加入系统启动服务级别然后shutdown -r now服务器

错误七:
rsync: read error: Connection reset by peer (104)
rsync error: error in rsync protocol data stream (code 12) at io.c(604) [sender=2.6.9]
    说明:原数据目录里没有数据存在


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值