首页 > 代码库 > 4.6.2 Rsync文件同步

4.6.2 Rsync文件同步

Rsyncremote sync)是UNIX及类UNIX平台下一款神奇的数据镜像备份软件,它不像FTP或其他文件传输服务那样需要进行全备份,Rsync可以根据数据的变化进行差异备份,从而减少数据流量,提高工作效率。你可以使用它进行本地数据或远程数据的复制,Rsync可以使用SSH安全隧道进行加密数据传输,Rsync服务器端定义源数据,Rsync客户端仅在源数据发生改变后才会从服务器上实际复制数据至本地,如果源数据在服务器端被删除,则客户端数据也会被删除,以确保主机之间的数据是同步的。Rsync使用TCP873端口。

 

1. 搭建Rsync服务器

部署Rsync服务器需要创建至少一个配置文件,默认在系统中并不存在Rsync配置文件,对于服务器而言,配置文件创建完成后,使用守护进程模式启动rsync程序即可。下面将以图4-15为原型创建配置文件,将/common目录发布给所有的客户端主机。因为RsyncAndrew TridgellSamba的作者)与Paul Mackerras合作开发的软件,所以Rsync配置文件域Samba配置文件比较相似。Rsync主要分为三个配置文件:rsyncd.conf(主配置文件)、rsyncd.secrets(密码文件)和rsyncd.motd(服务器信息文件)。

wKioL1Q5HwnSO68FAABw3TTtFYU640.jpg

[root@desktop24 ~]# yum -y install rsync
[root@desktop24 ~]# mkdir /common ; cp /etc/init.d/* /common/
[root@desktop24 ~]# vim /etc/rsyncd.conf
#/etc/rsync.conf
#设置服务器信息提示文件名称,在该文件中编写提示信息
motd file = /etc/rsyncd.motd
#开启Rsync数据传输日志功能
transfer logging = yes
#设置日志文件名称,可以通过log format参数设置日志格式
log file = /var/log/rsyncd.log
#设置Rsync进程号保存文件名称
pid file = /var/run/rsyncd.pid
#设置锁文件名称
lock file = /var/run/rsyncd.lock
#设置服务器监听的端口号,默认为873
port = 873
#设置服务器所监听网卡接口的IP地址,这里服务器IP地址为192.168.0.254
address = 192.168.0.254
#设置进行数据传输时所使用的账户名称或ID号,默认使用nobody
uid = nobody
#设置进行数据传输时所使用的组名称或GID号,默认使用nobody
gid = nobody 
#设置use chroot为yes后,rsync会首先进行chroot设置,将根映射到path参数路径下,	对客户端而言,系统的根就是path参数所指定的路径。但这样做需要chroot权限,并且	在同步符号连接资料时仅会同步名称,而内容将不会同步。
use chroot = no
#是否允许客户端上传数据,这里设置为只读
read only = yes
#设置并发连接数,0代表无限制。超出并发数后,如果依然有客户端连接请求,则将会	受到稍后重试的提示消息
max connections = 10
#模块,Rsync通过模块定义同步的目录,模块以[name]的形式定义,这与Samba定义共	享目录是一样的效果。在Rsync中也可以定义多个模块。
[common]
#comment定义注释说明字串
comment = Web content
#同步目录的真实路径通过path指定
path = /common
#忽略一些IO错误
ignore errors
#exclude可以指定例外的目录,即将common目录下的某个目录设置为不同步数据
#exclude = test/
#设置允许连接服务器的账户,账户可以是系统中不存在的用户
auth users = tom,jerry
#设置密码验证文件名称,注意该文件的权限要求为只读,建议权限为600,仅在设置auth 	users参数后有效
secrets file = /etc/rsyncd.secrets
#设置允许哪些主机可以同步数据,可以是单个IP,也可以是网段,多个IP与网络之间	使用空格分隔
hosts allow = 192.168.0.0/255.255.255.0
#设置拒绝所有(除host allow定义的主机外)
hosts deny = *
#客户端请求显示模块列表时,本模块名称是否显示,默认为true
list = false

    接下来,通过echo的方式创建密码文件/etc/rsyncd.secrets,需要注意的是,密码文件不可以对所有人开放可读权限,为了安全,建议设置权限为600。创建服务器提示信息文件并向该文件中导入欢迎词。由于Rsync默认不是开机启动服务,为了实现开机启动Rsync服务,我们可以通过echorsync --daemon追加至开机启动文件/etc/rc.local。最后通过设置iptables开启873端口的入站数据请求。

[root@desktop24 ~]# echo "tom:pass" > /etc/rsyncd.secrets
[root@desktop24 ~]# echo "jerry:111" >> /etc/rsyncd.secrets
[root@desktop24 ~]# chmod 600 /etc/rsyncd.secrets 
[root@desktop24 ~]# echo "welcome to access" > /etc/rsyncd.motd
[root@desktop24 ~]# rsync --daemon
[root@desktop24 ~]# echo "/usr/bin/rsync --daemon" >>/etc/rc.local 
[root@desktop24 ~]# iptables -I INPUT -p tcp --dport 873 -j ACCEPT
[root@desktop24 ~]# service iptables save

2. 客户端同步数据

在客户端同样使用rsync命令进行初始化数据传输,使用同样的程序,但客户端主机不需要--daemon选项。

[root@dns2 ~]# yum -y install rsync
[root@dns2 ~]# rsync -vzrtopg --progress tom@192.168.0.254::common /test
tom@192.168.0.254‘s password:

rsync命令

描述:一个快速、多功能的远程(或本地)数据复制工具。

用法:见表4-6SRC表示源路径,DEST表示目标路径。

4-6

本地复制

rsync [选项] SRC ... [DEST]

通过远程shell复制

下载数据

rsync [选项] [USER@]HOST:SRC ... [DEST]

上传数据

rsync [选项] SRC ... [USER@]HOST:DEST

通过rsync进程复制

下载数据

rsync [选项] [USER@]HOST::SRC ... [DEST]

rsync [选项] rsync://[USER@]HOST[:PORT]/SRC ... [DEST]

上传数据

rsync [选项] SRC ... [USER@]HOST::DEST

rsync [选项] SRC ... rsync://[USER@]HOST[:PORT]/DEST

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)拷贝本地文件。当SRCDES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。如:rsync -a /data /backup

2)使用一个远程shell程序(rshssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。如:rsync -avz *.c foo:src

3)使用一个远程shell程序(rshssh)来实现将远程机器的内容拷贝到本地机器。当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

 

 

选项:

-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指定使用rshssh方式进行数据同步

--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息

-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件

--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件

--delete 删除那些DESTSRC没有的文件

--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 显示帮助信息

 

实例:

将本机当前目录下的以.c结尾的文件复制至foo主机的src目录下:

[root@dns2 ~]# rsync -t *.c foo:src/

foo主机上以递归方式将src/bar目录复制至本机/data/tmp目录:

[root@dns2 ~]# rsync -avz foo:src/bar /data/tmp

foo主机上以递归方式将src/bar目录下的所有内容复制至本机/data/tmp目录,但在/data/tmp目录下不会创建bar目录:

[root@dns2 ~]# rsync -avz foo:src/bar/ /data/tmp

将本机/src/foo目录复制至/dest目录:

[root@dns2 ~]# rsync -avz /src/foo /dest

使用tom账户连接远程192.168.0.254主机的rsync进程,将common模块定义的path路径下载至本地test3目录:

[root@dns2 ~]# rsync -avz tom@192.168.0.254::common /test3

匿名下载192.168.0.254服务器的common模块至本地dest目录:

[root@dns2 ~]# rsync -avz 192.168.0.254::common /dest

显示192.168.0.254服务器所有的模块名称,需要服务器端配置list=true才会显示:

[root@dns2 ~]# rsync --list-only tom@192.168.0.254:: 

创建密码文件rsync.pass,在该文件中仅包含密码,最后使用rsync命令的--password-file参数指定密码文件,就可以省去每次输入密码的烦恼:

[root@dns2 ~]# echo "pass" > rsync.pass

[root@dns2 ~]# rsync -avz --delete --password-file=rsync.pass tom@192.168.0.254::common /dest

 

 

如果客户端需要定期对rsync服务器的数据进行备份,可以编写shell脚本,通过计划任务实现数据的定期备份工作。

[root@dns2 ~]# vim rsync_bak.sh
#!/bin/bash
#This script does backup through rsync.
#Date:2014-10-08
#Version:1.0 beta
#
export PATH=/bin:/usr/bin:/usr/local/bin
SRC=http://www.mamicode.com/common>

 

4.6.2 Rsync文件同步