Bootstrap

Rsync来同步文件

     当你的计算机越来越多(大于或等于2台)时,随之而来的一个非常令人头疼的问题就是如何在这众多的计算机中同步你的重要文件。比如你有一台式机和一台笔记本,这两台机子中都有一个文件夹是Working,你现在面临的问题是需要在这两台机子(很有可能分别安装了不同的操作系统)上都维持最新的Working。通常的做法是手动的复制粘贴,但这样费时费力,还很有可能遗忘,如果交给机器自动来完成那自然是方便许多。
已经有许多文件同步工具可供选择,例如Novell赞助的项目iFolder,但它在Windows上的服务端需要付费购买,而且配置比较麻烦,微软的FolderShare,类似网络硬盘,用户把自己的文件传到微软的服务器上,然后利用专门的客户端在网上访问和更新,微软的SynctTOY则只能用于本地文件的同步,另外,如今比较热门的SyncBackSE需要FTP和网上邻居的支持,设置也同样复杂。
现在我需要的是一个跨平台的,高可配置性,部署简单,不依赖于互联网或者某种特定的协议,而且可以自动运行的文件同步解决方案。通过分析发现以上的几种方案都不合适。这里我选择rsync,姜还是老的辣,它虽然已有十几年的历史,可至今为止仍然是很多研究人员包括企业首选的文件同步工具;不论是备份你的数据,异地更新您的隐私文件,在多台机器上同步重要的文件夹,rsync都可以满足你的需要。cwRsync是rsync在windows平台下的版本,使用它非常方便。
首先需要去相应的网站下载它的服务器端和客户端。选择一台主机做为服务器,配置服务器端,直接运行安装文件即可完成初步的安装,结束后在系统服务Services里将会增加两个服务:
RsyncServer   rsync服务端,提供增量文件传输功能
Openssh         提供主机间加密文件传输(可选)
随后是配置你的cwRsyncServer目录下的rsyncd.conf,下面给出一个例子:
#其工作进程的属主及组
uid = sync
gid = backup

#是否使用chroot
use chroot = yes
#最大连接数为
max connections = 1024
#进程pid位置
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
#日志记录文件
log file = /var/log/rsync/rsyncd.log
#链接过来时的提示信息
motd file = /etc/rsyncd/motd
#侦听端口
port = 873

#这里是认证的模块名,在client端需要指定
[test]
#需要做镜像的目录
path = /home/data/dtest/   
#注释
comment = Backup Client Of wela data
#设置字符集
charset = utf8
#默认为0,意no timeout,建议为600(10分钟)
timeout = 600
#可以忽略一些无关的IO错误
ignore errors
#忽略对用户没有可读的文件
ignore nonreadable
#只读
read only = no
#禁止客户端进行列出操作
list = yes
#记录下传输记录
transfer logging = yes
#日志格式
log format = %a-%o-%a-%m-%u-%f-%l

[log]
path = /home/data/log/   
comment = Backup Client Of log data
charset = utf8
timeout = 600
read only = no
list = yes
transfer logging = yes
log format = %a-%o-%a-%m-%u-%f-%l
auth users = sanetitv,hto
secrets file = /etc/rsyncd/rsyncd.passwd

启动服务后就可以供其他主机访问进行同步了。其他主机安装客户端,同样是直接点击安装客户端安装文件,随后需要写一个批处理文件供其他程序自动调用。如:"F:/cwRsync/bin/rsync.exe" -avr --ignore-errors --force /cygdrive/f/Image/sthb 59.66.116.50::Image
Limitations:客户端向服务器提交更新时,不能从服务端拿回更新的部分,只能把客户端的文件增量提交到服务端上去。解决方案可以是在每台机子上同时配置客户和服务端,利用runSaver异步更新到多台机器上。rsync 是很强大的同步工具 本地远程皆宜,不少project都提供 http ftp rsync 等mirror方式rsync官方主页是 http://samba.anu.edu.au/rsync/

rsync(d)服务端启动两种方式
1.daemon 2.xinetd inetd
启动后绑在 TCP/873 端口
% cat /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
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}

配置 注意设置读写权限属主
% cat /etc/rsyncd.conf
motd file = /var/log/rsync/welcome.msg
pid file = /var/log/rsync/rsyncd.pid
lock file = /var/log/rsync/rsync.lock
log file = /var/log/rsync/rsyncd.log

[rsyncwww]
comment = rsync www
path = /var/www/
use chroot = no
max connections = 4
read only = false
list = true
uid = nobody
gid = nobody
auth users = wwwuser
secrets file = /etc/rsyncd.secrets
hosts allow = 1.1.1.1,2.2.2.2
hosts deny = 0.0.0.0/0
ignore errors = yes
transfer logging = yes
log format = "%a %f %l"
#log format = "%o %h [%a] %m (%u) %f %l"

rsyncd.secrets 一行一个用户 用户名:密码 格式
使用
rsync -auvPz --progress dir1 dir2
rsync -ztruvoglpD --progress dir1 dir2
rsync -ztruvoglpD --progress dir1/ dir2
rsync -ztruvoglpD --progress dir1/file1 dir2
如果不想包含某个目录/文件可以设置--exclude

远程使用
rsync 1.1.1.1:: 只列list
rsync [email protected]::
rsync [email protected]::module
rsync [email protected]::module/path
如果没有配置rsync server 可以通过 ssh 方式使用
rsync -e ssh -auvPz 1.1.1.1:/etc ./

同步时注意注意 / 最后的问题不放/ 则目录名也包含mirror
放 / 则只有目录里面的东西mirror了

rsync -ztruvoglp --progress [email protected]::module/path ./
为了脚本调用方便 还可以调用 --password-file 同样注意属主权限,也可以设置环境变量RSYNC_PASSWORD=访问含用户认证的rsync
windows下rsync可以用 http://itefix.no/cwrsync
http://prdownloads.sourceforge.net/sereds/cwRsync_2.0.6_Installer.zip
http://heanet.dl.sourceforge.net/sourceforge/sereds/cwRsync_2.0.6_Installer.zip

因为需要在两台机器上同步一些数据, cwRsync 是可以的。

1、安装
安装的过程很简单,也很顺利,从 cwRsync 网站上下载的 server and client ,都安装了一下,不过后来发现其实是不需要安装 client 的,只要 server 就可以了,server 包括了 client 的功能。安装完 server 后,会在 service 中增加 Rsync 和 ssh 服务。

2、配置
配置了一下 rsyncd.conf
use chroot = false
strict modes = false
hosts allow = *
log file = rsyncd.log
pid file = rsyncd.pid

# Module definitions
# Remember cygwin naming conventions : c:/work becomes /cygwin/c/work
#
[test]
path = /cygdrive/c/work
read only = false
transfer logging = yes

只是将 [test] 中的 path 改成了我本机的备份目录
[test]
path = /cygdrive/d/backup
read only = false
transfer logging = yes

3、数据同步
因为只是最简单的数据同步,所以就不使用 ssh 了,直接启动 rsync 服务就可以了。然后按照 usage 上面教的。
rsync -av /cygdrive/d/test localhost::test

完成了数据的同步工作,一切顺利。顺便说一下,/cygdrive/d 是安装完 cwRsync ,会自动将系统上所有的盘 mount 成 /cygdrive/x ,x 表示盘符,小写的,并把安装目录 mount 成 / 了。

4、绿色安装
我将 cwRsync copy 到另一台机器上,试图不安装就启动 cwRsync server,启动过程比较正常,只要运行 rsync --config=$config_file --daemon --no-detach 就可以了,这里面的 $config_file 指的是前面配置的 rsyncd.conf ,路径要写成 /cygdrive/d 这样的形式。

5、安装成服务
程序包中带了 cygwin 的 cygrunsrv ,可以通过这个命令将 rsync server 做成 windows 服务,但我试了一下,路径中有空格没有成功,命令是这样的
cygrunsrv.exe -I "Rsync" -p /cygdrive/d/cwRsyncServer/bin/rsync.exe -a "--config=/cygdrive/d/cwRsyncServer/rsyncd.conf --daemon --no-detach" -f "Rsync"

也很顺利的安装成服务了。

6、问题二
惨的是当我在第二台机器上同步数据的时候,权限却成了问题,同步过去的文件(目录)所有者是 SYSTEM,不是我,而且我没有访问的权限,只有在安全中把自己加进来(我用管理员帐户),给自己权限,才能访问。或者在 cygwin 下使用 chmod 给自己授权,和在 windows 中给自己授权没什么区别。

问题2已经解决
方法:只要把 cwRsyncServer 这个目录 mount 到 / ,就可以了,估计是 rsync 同步数据的时候,会调用 /bin/chmod 来授权,如果是安装版的,这个目录会在安装的时候 mount 好。

Rsync差异数据备份(基于Win/Linux平台)
Rsync客户端的使用
1、Rsync概述
Rsync 是一个小巧的算法的强大实现。它最基本的功能是高效地镜像一个文件系统的能力。使用 rsync,可以灵活地选用一组网络协议,诸如 nfs、smb 或 ssh,方便地让一个文件系统与另一个文件系统保持同步更新。rsync 的第二个功能,也就是备份系统使用的功能,它可以把已经发生改变或是被删除的文件的老的版本归档。

2、Rsync客户端的选择与安装
Rsync客户端包括Windows与Linux两种平台。大多数Linux平台均集成了Rsync客户端,也可从网络上下载进行更新,推荐版本:rsync 2.6.4版本及以上。对于Windows平台上的客户端,推荐使用cwRsync,可从网络上下载后进行安装。
cwRsync(windows平台):
下载链接:http://sdb6800.sdg.ac.cn/storage/doc.html
软件名称:cwRsync工具下载(for windows)
Rsync(Linux平台)
下载链接:http://samba.anu.edu.au/rsync/
Linux平台下rsync的安装:
#tar -zxvf rsync-{version}.tar.gz
#cd rsync-{version}
#./configure
#make
#make install

3、Rsync备份基本语法及构成
(1)基本语法
Usage: rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
or   rsync [OPTION]... [USER@]HOST:SRC DEST
or   rsync [OPTION]... SRC [SRC]... DEST
or   rsync [OPTION]... [USER@]HOST::SRC [DEST]
or   rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
or   rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
or   rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST
语法范例见『Rsync的两种常见备份方式』
注意:rsync在Windows平台和Linux平台上的不同之处,在Linux平台上rsync采用与Linux平台一致的文件路径表示方法,如:/home/hto
在Windows平台上rsync采用独特的文件路径表示方法,将Windows路径中的反斜杠(/)转换成斜杠(/),盘符的表示法也有所不同,如:
D:/WORK/* 转换成 /cygdrive/d/WORK/*
(2)语法组成
rsync服务器地址:如:storage.sdg.ac.cn,10.0.0.2
端口:标准端口873,一般备份时客户端无需特别指定端口号
帐号:根据用户需求决定
密码:与帐号共同构成认证体系
已开空间:即备份模块名对应在服务器上的磁盘空间,由服务器管理分配
模块名:在服务器端进行分配。如:backup

4、Rsync的两种常见备份方式
(1)采用系统帐号+ssh的方法
此时rsync的配置文件基本失效。并且备份后的权限为作备份的帐号权限。备份语法:
rsync –avz –progress –delete –e ssh /locahostl/path/ backup_user@ip_address:/path/to/backup/
如:
rsync –avz –progress –delete –e ssh /cygdrive/d/test [email protected]:/home/hto/tmp

此种方法只有在具有系统帐号的情况下才能使用。
(2)基于rsync本身配置中设置的权限
此时的用户是rsync的独立用户。需在配置文件中进行配置,但些时rsync以root运行,客户端采用合理参数可保持原文件属性。建议不建立相应系统用户。备份语法:
rsync –avz –progress –delete /localhost/path backup_user@ip_address::subject/project_name/
如:rsync –avz  --progress –delete /cygdirve/d/test [email protected]::backup/tmp
运行效果如图:采用rsync进行数据传输的一般方法。推荐采用。后文均以此种备份方式为例进行讲述。
(3)参数说明
-v是verbose。
-z是压缩。
--progress是指显示出详细的进度情况。
--delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致,相反亦成立。请慎用,以免造成不必要的破坏。
-a是指采用归档方式,等同于参数-rlptgoD,主要用来保持文件原有属性如属主、时间等。
--password-file =/path/to/passwordfile中,/path/to/passwordfile为密码文件的路径。
/path/to/backup/指要备份的目录。
backup_user是指定密码文件中的用户名,即帐号名。
ip_address为服务器地址
subject是模块名,也就是在/etc/rsyncd.conf中自定义的名称。
project_name为备份到远程的目录名。(可以为空)

5、如何向服务器上传/下载文件
采用rsync进行文件的上传/下载,虽然客户端工具略有不同,但语法基本相同,下面分别举例说明。
(1)Linux平台下
在Linux平台下,在命令行状况下输入相应的rsync语法即可完成文件的传输。
I 上传文件
如将用户当前目录下test目录里的文件上传到服务器(10.0.0.2)上backup模块里的tmp目录下,用户名rsync。此时rsync语法如下:
rsync -avz --progress --delete ~/test/* [email protected]::backup/tmp/

II 下载文件
如将服务器(10.0.0.2)上backup模块里tmp目录里的文件下载到用户当前目录下test目录里,用户名rsync。此时rsync语法如下:
rsync –avz –progress –delete [email protected]::backup/tmp/ ~/test/

(2)Windows平台下
在Windows平台下,运行cmd命令行进入MS_DOS【命令提示符】状况。
I 上传文件
如将本机D盘test目录下的文件上件到服务器(10.0.0.2)上backup模块里的tmp目录下,用户名rsync。此时rsync语法如下:
rsync –avz –progress –delete /cygdrive/d/test/ [email protected]::backup/tmp
注:/cygdrive/d/test即表示文件路径D:/test

II 下载文件
如将服务器(10.0.0.2)上backup模块下tmp目录里的文件下载到本机目录D:/test下,用户名rsync。此时rsync语法如下:
rsync –avz –progress –delete [email protected]::backup/tmp/ /cygdrive/d/test/

6、如何查看服务器文件列表
在某些情况下,用户可能需要查看某模块下的文件列表,加上—list-only参数的rsync即可完成此项功能,但低版本rsync不对此参数提供支持。建议用户安装rsync2.6.4及以上版本。
如查看服务器(10.0.0.2)上backup模块下tmp目录里的文件列表信息,用户名rsync,其语法如下:rsync –list-only [email protected]::/backup/tmp/

7、如何去除部分文件
配置—exclude参数可以去除整个备份目录下的部分文件。
如在上传时不想上传D盘test目录下以“ap”开头的文件。
语法范例如下:
rsync –avz –delete –progress –exclude=ap* /cygdrive/d/test/ [email protected]::backup/tmp/

8、如何向服务器作增量备份
Rsync 除了很好的提供文件镜像服务以外,也可以用来做文件的增量备份,它的备份原理是:将当前的文件备份到备份模块的current子目录里,当新上传文件时,它和current目录里的文件作比较,如果发现有变化了的文件,将此文件从current目录里分离出来,在同一模块下新建立一个目录并将变化了的文件保存在此目录里,一般以时间的格式来定名新建立的目录名。
如将D盘test目录下的文件作增量备份到服务器(10.0.0.2)上backup模块里,并且将文件备份到current子目录下。
用rsync作备份的语法范例如下:
rsync –avz –delete –backup –backup-dir=/friday /cygdrive/d/test/ [email protected]::backup/current/
其中:
--backup参数用来指明此次文件上传是作增量备份
--backup-dir参数是用来指明存放变化了的文件的目录,它处于模块的下一级目录下,如本例中的“/friday”即相当于 “backup/friday”路径下。此目录的文件名一般以时间的形式来命名,如在Linux平台下,即以命令行`date +%Y%m%d-%H_%M`来代替普通的文件名(如本例中的friday)。
此时将D盘test目录里的rsync.bat文件删除后再运行增量备份的命令。从上可以清晰的看到—delete参数的效果,它会将current目里的文件rsync.bat文件删除。同时对于current目录里已有的文件它不作传输,这也是rsync的一个重要特性:只传变化了的文件,提高传输效率。此时如果从服务器上查看backup模块下的文件列表,可以发现新建立了 friday目录,并将rsync.bat文件保存在此目录里。

9、如何作无密码交互的文件传输
配合合理的参数,rsync可以用来作无密码交互的文件传输。具体步骤如下:
(1)建立密码文件。
新建一个文本文件(如:passwd.txt),向其中写入密码。并且保证此密码文件只对当前登录用户具有权限。在Linux平台下可使用使用命令行 “chmod 700 passwd.txt“实现,在Windows平台下可将此密码文件保存在“C:/Documents and Settings/用户名”路径下。
(2)运行类似下面范例的命令行。
rsync -avz --delete --progress --password-file="/cygdrive/c/Documents and Settings/hto/passwd
.txt" /cygdrive/d/test/ [email protected]::backup/tmp/
--password-file参数用来指定密码文件的位置

10、如何定时向服务器作备份
向服务器作定时备份需要配合各系统的定时执行程序功能,在Linux平台通过cron来实现,Windows平台上通过任务计划来实现。
(1) Windows平台下
I 建立批处理文件,如backup.bat
II 编辑此文件并写入rsync文件传输语句:如:第9小节的无密码交互文件传输语句
III 通过Windows的任务计划功能将此脚本添加进去使其定期执行。
添加过程:【控制面板】->【性能和维护】->【任务计划】->【添加任务计划】

(2) Linux平台下
I 编写shell脚本程序,在其中加入备份命令行。并保存在/etc/cron.backup目录下。
II 使此备份脚本可执行。如:chmod u+x backup
III 加入cron使其定期运行。
#vi /etc/crontab
加入如范例所示语句
00 23 * * * root run-parts /etc/cron.backup
下面给出了一个Linux平台下较为完整的定期增量备份脚本以作参考:
#!/bin/sh
# This script does personal backups to a rsync backup server. You will end up
# with a 7 day rotating incremental backup. The incrementals will go
# into subdirectories named after the day of the week, and the current
# full backup goes into a directory called "current"
# directory to backup
BDIR=/var/csdb-data
# the name of the backup machine
BSERVER=

# directory to backup
BDIR=/home/$USER

# excludes file - this contains a wildcard pattern per line of files to exclude
EXCLUDES=$HOME/cron/excludes

# the name of the backup machine
BSERVER=owl

# your password on the backup server
export RSYNC_PASSWORD=XXXXXX

########################################################################

BACKUPDIR=`date +%A`
OPTS="--force --ignore-errors --delete-excluded --exclude-from=$EXCLUDES
--delete --backup --backup-dir=/$BACKUPDIR -a"

export PATH=$PATH:/bin:/usr/bin:/usr/local/bin

# the following line clears the last weeks incremental directory
[ -d $HOME/emptydir ] || mkdir $HOME/emptydir
rsync --delete -a $HOME/emptydir/ $BSERVER::$USER/$BACKUPDIR/
rmdir $HOME/emptydir

# now the actual transfer
rsync $OPTS $BDIR $BSERVER::$USER/current

2)、备份至一个空闲的硬盘
#!/bin/sh
export PATH=/usr/local/bin:/usr/bin:/bin
LIST="rootfs usr data data2"
for d in $LIST; do
mount /backup/$d
rsync -ax --exclude fstab --delete /$d/ /backup/$d/
umount /backup/$d
done

DAY=`date "+%A"`
rsync -a --delete /usr/local/apache /data2/backups/$DAY
rsync -a --delete /data/solid /data2/backups/$DAY

3)、对vger.rutgers.edu的cvs树进行镜像
#!/bin/bash
cd /var/www/cvs/vger/
PATH=/usr/local/bin:/usr/freeware/bin:/usr/bin:/bin

RUN=`lps x | grep rsync | grep -v grep | wc -l`
if [ "$RUN" -gt 0 ]; then
echo already running
exit 1
fi

rsync -az vger.rutgers.edu::cvs/CVSROOT/ChangeLog $HOME/ChangeLog
sum1=`sum $HOME/ChangeLog`
sum2=`sum /var/www/cvs/vger/CVSROOT/ChangeLog`

if [ "$sum1" = "$sum2" ]; then
echo nothing to do
exit 0
fi

rsync -az --delete --force vger.rutgers.edu::cvs/ /var/www/cvs/vger/
exit 0

6、FAQ
Q:如何通过ssh进行rsync,而且无须输入密码?
A:可以通过以下几个步骤
1. 通过ssh-keygen在server A上建立SSH keys,不要指定密码,你会在~/.ssh下看到identity和identity.pub文件
2. 在server B上的home目录建立子目录.ssh
3. 将A的identity.pub拷贝到server B上
4. 将identity.pub加到~[user b]/.ssh/authorized_keys
5. 于是server A上的A用户,可通过下面命令以用户B ssh到server B上了
e.g. ssh -l userB serverB

这样就使server A上的用户A就可以ssh以用户B的身份无需密码登陆到server B上了。

Q:如何通过在不危害安全的情况下通过防火墙使用rsync?
A:解答如下:这通常有两种情况,一种是服务器在防火墙内,一种是服务器在防火墙外。无论哪种情况,通常还是使用ssh,这时最好新建一个备份用户,并且配置sshd仅允许这个用户通过RSA认证方式进入。如果服务器在防火墙内,则最好限定客户端的IP地址,拒绝其它所有连接。如果客户机在防火墙内,则可以简单允许防火墙打开TCP端口22的ssh外发连接就ok了。

Q:我能将更改过或者删除的文件也备份上来吗?
A:当然可以:你可以使用如:rsync -other -options -backupdir = ./backup-2000-2-13 ...这样的命令来实现。
这样如果源文件:/path/to/some/file.c改变了,那么旧的文件就会被移到./backup-2000-2-13/path/to/some/file.c,
这里这个目录需要自己手工建立起来

Q:我需要在防火墙上开放哪些端口以适应rsync?
A:视情况而定
rsync可以直接通过873端口的tcp连接传文件,也可以通过22端口的ssh来进行文件传递,但你也可以通过下列命令改变它的端口:
rsync --port 8730 otherhost::
或者
rsync -e 'ssh -p 2002' otherhost:

Q:我如何通过rsync只复制目录结构,忽略掉文件呢?
A:rsync -av --include '*/' --exclude '*' source-dir dest-dir

Q:为什么我总会出现"Read-only file system"的错误呢?
A:看看是否忘了设"read only = no"了

Q:为什么我会出现'@ERROR: invalid gid'的错误呢?
A:rsync使用时默认是用uid=nobody;gid=nobody来运行的,如果你的系统不存在nobody组的话,就会出现这样的错误,可以试试gid = nogroup或者其它

Q:绑定端口873失败是怎么回事?
A:如果你不是以root权限运行这一守护进程的话,因为1024端口以下是特权端口,会出现这样的错误。你可以用--port参数来改变。

Q:为什么我认证失败?
A:从你的命令行看来:

你用的是:
> bash$ rsync -a 192.168.2.36::test test
> Password:
> @ERROR: auth failed on module test
> I dont understand this. Can somebody explain as to how to acomplish this.
> All suggestions are welcome.

;