分类: 系统运维
2011-08-30 21:02:32
CwRsync是基于cygwin平台的rsync软件包,支持windows对windows、windows对Linux、Linux对windows高效文件同步。由于CwRsync已经集成了cygwin类库,因此安装的时候可以省去cygwin包。Cwrsync还集成了OpenSSH for windows,可以实现Linux 下Rsync一模一样的操作。详细配置步骤如下:
一、服务器端安装配置
1、下载安装文件
2、安装
cwRsync分server包和client包,这里先说server包。
解开server包,执行解开后的安装文件;
第一步没什么好说的;
到第二步,安装文件会提示要求输入启动rsyncserver服务所需的系统账号以及对应的密码;
这一步很重要,可以说是cwRsync安装成功与否的关键。这一步要求输入当前系统存在的账号密码,用来启动RsyncServer服务,这个账号需要在安装前就要建立好,因为安装程序不会自动创建。如果这个账号没有提前创建好的话,系统“服务”里将不会出现“RsyncServer”服务。
于是暂停安装进度,打开系统管理界面,建立了一个对应用户(本例中此用户名为SvcCWRsrync),并记录密码,修改用户的安全权限,然后把切换到安装界面,填入刚才建好的用户名和对应密码,继续安装;
安装完毕后,安装程序会将rsyncserver所在目录及其下子目录和文件赋给SvcCWRsrync用户完全操作权限,因为SvcCWRsrync需要写入日志、更新配置文件等;
3、修改配置文件rsyncd.conf
配置文件在安装程序的根目录下,配置内容如下:
use chroot = no # 不使用chroot
strict modes = false #使用静态模式
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log # 日志记录文件
[rsync] # 这里是认证的模块名,在client端需要指定
path = /cygdrive/d/works # 需要做镜像的目录,如d:/www
transfer logging = yes # 记录传输日志
ignore errors # 可以忽略一些无关的IO错误
read only = yes # 只读
list = no # 不允许列文件
hosts allow=19.2.0.0/255.255.0.0
hosts deny = * # 禁止除19.2.0.0/255.255.0.0段外的连接IP
auth users = SvcCWRSYNC # 认证的用户名,如果没有这行,则表明是匿名
secrets file = /cygdrive/d/secure/rsync.passwd # 认证文件名以及所在路径
红字部分需要着重说明一下,因为这跟下面遇到的一处错误有关
根据资料,server的配置文件可以以不同的[xxx]块来划分不同的同步位置和内容,供不同的client来取文件,对应的client配置,下面会讲到。
4、建立认证文件
根据配置的内容,在对应位置创建认证文件 d:/secure/rsync.passwd内容格式为
用户:密码,如rsyncuser:woaixizao4234
5、将需要同步的目录及其下子目录和文件,赋予SvcCWRsrync用户可读权限
ok,server端配置到此结束,最后,还需要打开管理工具,启动rsyncserver服务,并将其设置为自动启动。
二、客户端安装配置
1、下载客户端安装包
下载地址见上,与server端下载点一样;
下载完后就是解包,安装,安装过程没有什么特别的,无非就是根据自己需要改变一下安装路径而已;
2、配置
cwRsync客户端不需要很复杂的配置,只需要通过命令行来同步服务器端的数据,建立批处理脚本rsync.bat内容如下:
@echo off
set RSYNC_HOME=d:\Program Files\cwRsync\bin
cd %RSYNC_HOME%
d:
rsync -avzP --progress --delete --password-file=/cygdrive/d/secure/rsync.passwd /cygdrive/d/works
脚本内容很简单,前面几行没什么可说的,重点讲一下最后一行参数的含义,以及红字部分:
(2012.11.12更新)
建议采用-rltDzvP参数
因为以下参数中的a参数,有时会造成目标服务器上的文件权限错乱,从而导致目标服务器上的web服务不可用,个人判断:windows对用户的处理和linux不同,两台不同的服务器,即使创建相同名字的用户,在服务器上对应的gid和uid也不一样,因此当CWRSYNC使用-a参数时,他会尝试将源服务器上的文件权限也赋给目标服务器上的文件,两者权限上的差异导致了错误的产生,因此解决办法就是不传递文件权限和属主信息;
-avzP
-a 参数,相当于-rlptgoD,-r 是递归 -l 是链接文件,意思是拷贝链接文件;-p 表示保持文件原有权限;-t 保持文件原有时间;-g 保持文件原有用户组;-o 保持文件原有属主;-D 相当于块设备文件;
-z 传输时压缩;
-P 传输进度;
-v verbose,详细模式输出
-u是只同步已经更新的文件,避免没有更新的文件被重复更新一次,不过要注意两者机器时钟的同步
--progress
显示备份过程
--delete
删除那些DST中SRC没有的文件
--password-file
指定密码文件以及路径,内容为server端配置的对应密码,此处无需、也不能写用户名;
这一段包含三个要素:SvcCWRSYNC为登陆rsync server的用户,1.2.3.4为rsync server的ip,rsync用来区别client到server端获取的同步内容(见前文server端配置相关红字描述)
/cygdrive/d/works
存放服务器端同步文件的本地目录
脚本写好后,可以配置一个系统计划任务,定期执行该脚本,以便获得最新文件。
最后,要记得建立密码文件,位置和内容和之前说的、脚本中--password-file参数所设定的一致,文件内容要和server端密码文件配置一致;
三、错误处理
1、client执行同步脚本时,提示:
@ERROR: Unknown module 'rsync'
rsync error: error starting client-server protocol (code 5) at main.c(1383)
赶紧检查,结果发现server端第五步没有配(即同步目录权限未赋),囧,赶紧加上;
再试,还是一样错误;
google了一下,一时没有很直接的答案,但有提示,说该错误一般会跟client到server端的验证有关,于是重点检查两端的密码文件内容、server的配置以及client脚本的一致性,最后终于发现server端rsyncd.conf中,[ ]中定义和client脚本中定义不一致,将两端修正为一致后,错误解决;
2、提示:
@ERROR: auth failed on module rsync
rsync error: error starting client-server protocol (code 5) at main.c(1383) [receiver=2.6.9]
这个问题一般跟server端passwd文件权限有关,记得给passwd文件+上rsync服务账号(本例中是SvcCWRsrync)可读权限;
3、client执行同步脚本时,提示:
password file must be owned by root when running as root
这个问题一般是由于server端和client端的版本不同造成的,如果不想重装,可以采取如下解决办法:
将rsync server的bin目录下的chown.exe拷贝到client的bin下,执行:
chown.exe administrator /cygdrive/d/secure/rsync.passwd (后面为client端密码文件所存放的位置)
再次执行同步脚本,终于ok了。
最后还是要强调一点:server端和client端的密码文件内容是不完全一致的,server的需要写明用户名和密码,client则只需要写密码即可,具体格式见前文所述。这里是很多人在配置过程中容易犯错的地方。