跨平台用Rsync来同步文件
2010-07-28 11:08:19 阿炯

当所管理的计算机越来越多时,随之而来的一个非常令人头疼的问题就是如何在这众多的计算机中同步你的重要文件。目前已经有许多文件同步工具可供选择,例如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官方主页

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 user@1.1.1.1::
rsync user@1.1.1.1::module
rsync user@1.1.1.1::module/path
如果没有配置rsync server 可以通过 ssh 方式使用
rsync -e ssh -auvPz 1.1.1.1:/etc ./

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

rsync -ztruvoglp --progress user@1.1.1.1::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 hto@10.0.0.2:/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 rsync@10.0.0.2::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/* rsync@10.0.0.2::backup/tmp/

II 下载文件
如将服务器(10.0.0.2)上backup模块里tmp目录里的文件下载到用户当前目录下test目录里,用户名rsync。此时rsync语法如下:
rsync –avz –progress –delete rsync@10.0.0.2::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/ rsync@10.0.0.2::backup/tmp
注:/cygdrive/d/test即表示文件路径D:\test

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

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

7、如何去除部分文件
配置—exclude参数可以去除整个备份目录下的部分文件。
如在上传时不想上传D盘test目录下以“ap”开头的文件。
语法范例如下:
rsync –avz –delete –progress –exclude=ap* /cygdrive/d/test/ rsync@10.0.0.2::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/ rsync@10.0.0.2::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/ rsync@10.0.0.2::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=kevin@storage.sdg.ac.cn
# your password on the backup server
export RSYNC_PASSWORD=123456
BACKUPDIR=`date +%A`
OPTS="--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/kevin/emptydir ] || mkdir /home/kevin/emptydir
rsync --delete -a /home/kevin/emptydir/ $BSERVER::csdb/$BACKUPDIR/
rmdir /home/kevin/emptydir
# now the actual transfer
rsync $OPTS $BDIR $BSERVER::csdb/current

rsync参数详解
选项说明
-v,--verbose 详细模式输出
-q,--quiet 精简输出模式
-c,--checksum 打开校验开关,强制对文件传输进行校验
-a,--archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r,--recursive 对子目录以递归模式处理
-R,--relative 使用相对路径信息

-a 包含-rtplgoD
-r 同步目录时要加上,类似cp时的-r选项
-v 同步时显示一些信息,输出同步的过程
-l 小写l保留软连接,例如A机器上面的文件有软连接所指向的文件,同步到B机器时同样也保留软连接。
-L 大写L加上该选项后,同步软链接时会把源文件给同步
-p 小写p保持文件的权限属性
-o 保持文件的属主
-g 保持文件的属组
-D 保持设备文件信息
-t 保持文件的时间属性
--delete 删除DEST中SRC没有的文件
--exclude 过滤指定文件,如--exclude "logs"会把文件名包含logs的文件或者目录过滤掉,不予同步;支持多个exclude条件同时写出
-P 大写P显示同步过程,比如速率,比-v更加详细
-u 加上该选项后,若DEST中的文件比SRC新,则不予同步
-z(--compress) 表示传输的过程中启用压缩功能(zlib),减少网络资源带宽;使用'--compress-level=NUM'配合使用指定压缩级别

注意:目标路径加/与不加/的区别


rsync foo/bar/foo.c remote:/tmp/

则在/tmp目录下创建foo.c文件,而如果使用-R参数:
rsync -R foo/bar/foo.c remote:/tmp/
则会创建文件/tmp/foo/bar/foo.c,也就是会保持完全路径信息。

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

rsync使用ssh方式的时候,最好建立信任关系,否则可能在传数据过程中暂停,询问密码。还可以用screen封装rsync
如:screen rsync -e ssh -av --exclude-from=rsync_file.list source-dir dest-dir
rsync_file.list为不想传输的文件(比如log,用相对source-dir的路径写或者绝对路径)

----------------------------------------------------
1、什么是Rsync
Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。

Rsync本来是用于替代rcp的一个工具,目前由rsync.samba.org维护,所以rsync.conf文件的格式类似于samba的主配置文件。Rsync可以通过rsh或ssh使用,也能以daemon模式去运行,在以daemon方式运行时Rsync server会打开一个873端口,等待客户端去连接。连接时,Rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份。

Rsync支持大多数的类Unix系统,无论是Linux、Solaris还是BSD上都经过了良好的测试。此外,它在windows平台下也有相应的版本,如cwRsync和Sync2NAS等工具。

Rsync的基本特点如下:
1.可以镜像保存整个目录树和文件系统;
2.可以很容易做到保持原来文件的权限、时间、软硬链接等;
3.无须特殊权限即可安装;
4.优化的流程,文件传输效率高;
5.可以使用rsh、ssh等方式来传输文件,当然也可以通过直接的socket连接;
6.支持匿名传输。

2、Rsync同步算法
Rsync只所以同步文件的速度相当快,是因为“Rsync同步算法”能在很短的时间内计算出需要备份的数据,关于Rsync的同步算法描述如下:
假定在1号和2号两台计算机之间同步相似的文件A与B,其中1号对文件A拥有访问权,2号对文件B拥有访问权。并且假定主机1号与2号之间的网络带宽很小。那么rsync算法将通过下面的五个步骤来完成:

1、2号将文件B分割成一组不重叠的固定大小为S字节的数据块,最后一块可能会比S 小。
2、2号对每一个分割好的数据块执行两种校验:一种是32位的滚动弱校验,另一种是128位的MD4强校验。
3、2号将这些校验结果发给1号。
4、1号通过搜索文件A的所有大小为S的数据块(偏移量可以任选,不一定非要是S的倍数),来寻找与文件B的某一块有着相同的弱校验码和强校验码的数据块。这项工作可以借助滚动校验的特性很快完成。
5、1号发给2号一串指令来生成文件A在2号上的备份。这里的每一条指令要么是对文件B经拥有某一个数据块而不须重传的证明,要么是一个数据块,这个数据块肯定是没有与文件B的任何一个数据块匹配上的。

3、Rsync参数说明
3.1 rsyncd.conf配置文件
一、全局参数
在文件中[module]之前的所有参数都是全局参数,当然也可以在全局参数部分定义模块参数,这时候该参数的值就是所有模块的默认值。
port
指定后台程序使用的端口号,默认为873。

motd file
"motd file"参数用来指定一个消息文件,当客户连接服务器时该文件的内容显示给客户,默认是没有motd文件的。

log file
"log file"指定rsync的日志文件,而不将日志发送给syslog。比如可指定为“/var/log/rsyncd.log”。

pid file
指定rsync的pid文件,通常指定为“/var/run/rsyncd.pid”。

syslog facility
指定rsync发送日志消息给syslog时的消息级别,常见的消息级别是:uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3,local4, local5, local6和local7。默认值是daemon。

二、模块参数
主要是定义服务器哪个目录要被同步。其格式必须为“[module]”形式,这个名字就是在rsync 客户端看到的名字,其实有点象Samba服务器提供的共享名。而服务器真正同步的数据是通过 path 来指定的。我们可以根据自己的需要,来指定多个模块,模块中可以定义以下参数:

comment
给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。默认没有描述定义。

path
指定该模块的供备份的目录树路径,该参数是必须指定的。

use chroot
如果"use chroot"指定为true,那么rsync在传输文件以前首先chroot到path参数所指定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要以roots权限,并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true。

uid
该选项指定当该模块传输文件时守护进程应该具有的uid,配合gid选项使用可以确定哪些可以访问怎么样的文件权限,默认值是"nobody"。

gid
该选项指定当该模块传输文件时守护进程应该具有的gid。默认值为"nobody"。

max connections
指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试。默认值是0,也就是没有限制。

list
该选项设定当客户请求可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为false,可以创建隐藏的模块。默认值是true。

read only
该选项设定是否允许客户上载文件。如果为true那么任何上载请求都会失败,如果为false并且服务器目录读写权限允许那么上载是允许的。默认值为true。

exclude
用来指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到exclude列表中。这等同于在客户端命令中使用--exclude来指定模式,一个模块只能指定一个exclude选项。但是需要注意的一点是该选项有一定的安全性问题,客户很有可能绕过exclude列表,如果希望确保特定的文件不能被访问,那就最好结合uid/gid选项一起使用。

exclude from
指定一个包含exclude模式的定义的文件名,服务器从该文件中读取exclude列表定义。

include
用来指定不排除符合要求的文件或目录。这等同于在客户端命令中使用--include来指定模式,结合include和exclude可以定义复杂的exclude/include规则。

include from
指定一个包含include模式的定义的文件名,服务器从该文件中读取include列表定义。

auth users
该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)。

secrets file
该选项指定一个包含定义用户名:密码对的文件。只有在"auth users"被定义时,该文件才有作用。文件每行包含一个username:passwd对。一般来说密码最好不要超过8个字符。没有默认的secures file名,需要限式指定一个(例如:/etc/rsyncd.passwd)。注意:该文件的权限一定要是600,否则客户端将不能连接服务器。

strict modes
该选项指定是否监测密码文件的权限,如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认值为true。

hosts allow
该选项指定哪些IP的客户允许连接该模块。客户模式定义可以是以下形式:
单个IP地址,例如:192.167.0.1
整个网段,例如:192.168.0.0/24,也可以是192.168.0.0/255.255.255.0
多个IP或网段需要用空格隔开,“*”则表示所有,默认是允许所有主机连接。

hosts deny
指定不允许连接rsync服务器的机器,可以使用hosts allow的定义方式来进行定义。默认是没有hosts deny定义。

ignore errors
指定rsyncd在判断是否运行传输时的删除操作时忽略server上的IO错误,一般来说rsync在出现IO错误时将将跳过--delete操作,以防止因为暂时的资源不足或其它IO错误导致的严重问题。

ignore nonreadable
指定rysnc服务器完全忽略那些用户没有访问权限的文件。这对于在需要备份的目录中有些文件是不应该被备份者得到的情况是有意义的。

lock file
指定支持max connections参数的锁文件,默认值是/var/run/rsyncd.lock。

transfer logging
使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中。

log format
通过该选项用户在使用transfer logging可以自己定制日志文件的字段。其格式是一个包含格式定义符的字符串,可以使用的格式定义符如下所示:
%h 远程主机名
%a 远程IP地址
%l 文件长度字符数
%p 该次rsync会话的进程id
%o 操作类型:"send"或"recv"
%f 文件名
%P 模块路径
%m 模块名
%t 当前时间
%u 认证的用户名(匿名时是null)
%b 实际传输的字节数
%c 当发送文件时,该字段记录该文件的校验码

默认log格式为:"%o %h [%a] %m (%u) %f %l",一般来说,在每行的头上会添加"%t [%p] "。在源代码中同时发布有一个叫rsyncstats的perl脚本程序来统计这种格式的日志文件。

timeout
通过该选项可以覆盖客户指定的IP超时时间。通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户端。超时单位为秒钟,0表示没有超时定义,这也是默认值。对于匿名rsync服务器来说,一个理想的数字是600。

refuse options
通过该选项可以定义一些不允许客户对该模块使用的命令参数列表。这里必须使用命令全名,而不能是简称。但发生拒绝某个命令的情况时服务器将报告错误信息然后退出。如果要防止使用压缩,应该是:"dont compress = *"。

dont compress
用来指定那些不进行压缩处理再传输的文件,默认值是*.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

3.2 Rsync命令
在对rsync服务器配置结束以后,下一步就需要在客户端发出rsync命令来实现将服务器端的文件备份到客户端来。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参数的具体解释如下:
-----------------------------------------------------
简略版
-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 显示帮助信息
-----------------------------------------------------
详细版
-h ,--help 显示rsync求助资讯
--version 顯示rsync版本
-v ,--verbose 复杂的输出信息
-q ,--quiet 安静模式,几乎没有讯息产生, 常用在以cron执行rsync
-I,--ignore-times 通常rsync为了加快速度会忽略同样档案大小且同样,同样存取时间点的档案
可以通过此参数开关此快速检查.
--size-only rsync  只检查档案大小是否改变,不管时间存取点是否改变通常用在mirror, 且对方时间不太正确时
-c,--checksum 在传送之前透过128bit的md4检查码来检查所有要传送的档案(会托满速度);
-a,--archive archive mode 权限保存模式,相当于 -rlptgoD 参数,很快速的保存几乎所有的权限设定,除了硬式连接(透过-H设定).
-r,--recursive 复制所有下面的资料(透过)
-R,--relative 使用相对路径
如: rsync foo/bar/foo.c remote:/tmp/ 在远端产生/tmp/foo.c档案
rsync -R foo/bar/foo.c remote:/tmp/ 在远端产生/tmp/foo/bar/foo.c 档案
-R,--relative 不使用相对路径
-b,--backup 目的地端先前已经存在的档案在传输或删除前会被备份
--backup-dir=DIR 设定备份的资料夹
--suffix=SUFFIX 指定备份的档案名称字尾形式(预设为~)
-K,--keep-dirlinks 接收方将连接到资料夹的档案视为资料夹处理
-l,--links 复制所有的连接
-H,--hard-links 保留硬式连结
-p,--perms 保留档案权限
-o,--owner 保留档案所有者(root only)
-g,--group 保留档案群组
-D,--devices 保留device资讯(root only)
-t,--times 保留时间点
-n,--dry-run 不实际执行传送, 只显示将会有的传输动作
-S,--sparse 尝试去处理稀疏的档案, 让这些档案在目的端占去较少的磁碟空间
-W,--whole-file 复制所有的档案, 不额外作检查
--no-whole-file 关闭 --whole-file 参数
-x,--one-file-system 不要跨越档案系统分界(只在一个档案系统处理)
-B,--block-size=SIZE 强制透过rsync程式去比对修复block-sizeforce
-e --rsh=COMMAND 定义所试用的remote shell
--rsync-path=PATH 定义rsync在远端机器存放资料的路径
--existing 只对比更新目的端已经存在的档案
--ignore-existing 忽略目的断已经存在的档案(也就是不更新)
--delete 删除传送断已经不存在,而目的端存在的档案
--delete-excluded 除了把传送端已经不存在, 而目的端存在的档案删除之外, 也删除 --exclude参数所包含的档案
--delete-after rsync预设会在档案传送前进行相关删除动作确保接收端有足够的档案空间,单可以透过 --delete-after 让删除动作在档案传送后在进行删除
--ignore-errors 忽略任何错误即使是I/O error 也进行 --delete 删除动作
--max-delete=NUM 定义rsync不要删除超过NUM个档案
--partial rsync若遇到传输过程中断时, 会把那些已经传输的档案删除,在某种状况下保留那些部分传送的档案是令人高兴的,你可以透过 --partial 参数达到这个目的。
--partial-dir=DIR 在 --partial 参数启动时, 你还是可以定义rsync把那些部分传送的档案写入定义的资料夹, 而非直接写入目的端,需要注意的是,此资料夹不应该被其他试用者可以写入.(如:/tmp)
--force 当目的端资料夹被传送端非资料夹名称覆盖时, 强制rsync删除资料夹, 即使该资料夹不是空的.
--numeric-ids 不将传送端档案的uid及gid值, 与目的端的使用者/群组进行配对,若传送端并没有uid及gid的对应名称(如:原帐号群组被删除的遗留档案),或目的端没有相对应的帐号/群组, 保留数字型式的uid/gid
--timeout=TIMEOUT 设定I/O 超时的时间(秒). 超过这个秒数而没有资料传送, rsync将会结束,预设为0,也就是没有定义超时时间
-T,--temp-dir=DIR 定义rsync在接收端产生暂时性的复制档案时使用资料夹暂存, 预设时直接在接收端资料夹直接产生暂存档案
--compare-dest=DIR 定义rsync在目的端建立资料夹来比对传送过来的档案.
--link-dest=DIR 与 --compare-dest 相同,但同时会针对无法改变的档案建立硬式连结.
-z,--compress 压缩模式,当资料在传送到目的端进行档案压缩.
-P -P参数和 --partial --progress 相同.只是为了把参数简单化.
-C,--cvs-exclude 排除那些通常不希望传送的档案, 定义的方式与CVS传送相同:
RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state
.nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej
.del-* *.a *.olb *.o *.obj *.so *.exe *.Z *.elc *.ln core .svn/
符合以上条件的都会被忽略不传送.
--exclude=PATTER 符合PATTERN(规则表示式)样式的档案不仅行传送
--exclude-from=FILE 和 --exclude 参数相同, 不过是把不进行传送的档案事先写入某一档案,执行时, 透过此参数让rsync读取.(; #开头的行列或者空白会被rsync忽略)
--include=PATTERN 定义rsync不要排除符合pattern样式的档案
--include-from=FILE 和--include参数相同,只不过把要包含的档案写到某一档案.
--files-from=FILE 把要传送的档案名称都精确的写入某一档案, 让rsync读取.
如: rsync -a --files-from=/tmp/foo /usr remote:/backup
-0 --from0 定义档案所要读取的档案时null字元结尾.
--version 现四版本信息.
--daemon 定义rsync以daemon型态执行
--no-detach 当以daemon形态执行时,不要进行分裂且变成背景程序.
--address=ADDRESS 定义所要连接(bind)的ip位置或者是host名称(daemon限定)
--config=FILE 定义所要读取的设定档rsyncd.conf位置(daemon限定)预设值为 /usr/local/etc/rsyncd.conf
--port=PORT 定义rsyncd(daemon)要旨行的port(预设为tcp 873)
--blocking-io 使用blocking I/O连结远端的shell, 如rsh, remsh
--no-blocking-io 使用non-blocking连结远端的shell, 如ssh(预设值)
--stats 显示档案传送时的资讯状态
--progress 显示传送的进度.(给档案传送时,怕无聊的人用的..)
--log-format=FORMAT 定义log的格式(在rsyncd.conf设定)
--password-file=FILE 从档案读取与远端rsync伺服务连结的密码
--bwlimit=KBPS 定义传输频宽的大小(KBytes/秒)
--write-batch=FILE 把记录资料写入一个档案(给其他相同环境且相同需求的机器试用)
--read-batch=FILE 透过读取记录档案来进行传输.(档案由 --write-batch 参数产生)
--checksum-seed=NUM 定义档案 checksum-seed 的大小(byte)
-4 --ipv4 使用IPv4协定
-6 --ipv6 使用IPv6协定

4、Rsync使用实例
4.1、SSH方式

1、首先在服务端启动ssh服务:
# service sshd start
启动 sshd: [确定]

2、使用rsync进行同步
接下来就可以在客户端使用rsync命令来备份服务端上的数据了,SSH方式是通过系统用户来进行备份的,如下:
# rsync -vzrtopg --progress -e ssh --delete work@172.16.78.192:/www/* /databack/experiment/rsync
work@172.16.78.192's password:
receiving file list ...
5 files to consider
test/
a
0 100% 0.00kB/s 527:35:41 (1, 20.0% of 5)
b
67 100% 65.43kB/s 0:00:00 (2, 40.0% of 5)
c
0 100% 0.00kB/s 527:35:41 (3, 60.0% of 5)
dd
100663296 100% 42.22MB/s 0:00:02 (4, 80.0% of 5)
sent 96 bytes received 98190 bytes 11563.06 bytes/sec
total size is 100663363 speedup is 1024.19
上面的信息描述了整个的备份过程,以及总共备份数据的大小。

4.2 、后台服务方式
1、启动rsync服务
编辑/etc/xinetd.d/rsync文件,将其中的disable=yes改为disable=no,并重启xinetd服务,如下:
# vi /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
}

# /etc/init.d/xinetd restart
停止 xinetd: [确定]
启动 xinetd: [确定]

2、创建配置文件
默认安装好rsync程序后,并不会自动创建rsync的主配置文件,需要手工来创建,其主配置文件为“/etc/rsyncd.conf”,创建该文件并插入如下内容:
# vi /etc/rsyncd.conf
uid=root
gid=root
max connections=4
log file=/var/log/rsyncd.log
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
secrets file=/etc/rsyncd.passwd
hosts deny=172.16.78.0/22

[www]
comment= backup web
path=/www
read only = no
exclude=test
auth users=work

3、创建密码文件
采用这种方式不能使用系统用户对客户端进行认证,所以需要创建一个密码文件,其格式为“username:password”,用户名可以和密码可以随便定义,最好不要和系统帐户一致,同时要把创建的密码文件权限设置为600,这在前面的模块参数做了详细介绍。
# echo "work:abc123" > /etc/rsyncd.passwd
# chmod 600 /etc/rsyncd.passwd

4、备份
完成以上工作,现在就可以对数据进行备份了,如下:
# rsync -avz --progress --delete work@172.16.78.192::www /databack/experiment/rsync
Password:
receiving file list ...
6 files to consider
./ files...
a
0 100% 0.00kB/s 528:20:41 (1, 50.0% of 6)
b
67 100% 65.43kB/s 0:00:00 (2, 66.7% of 6)
c
0 100% 0.00kB/s 528:20:41 (3, 83.3% of 6)
dd
100663296 100% 37.49MB/s 0:00:02 (4, 100.0% of 6)
sent 172 bytes received 98276 bytes 17899.64 bytes/sec
total size is 150995011 speedup is 1533.75

5、恢复
当服务器的数据出现问题时,那么这时就需要通过客户端的数据对服务端进行恢复,但前提是服务端允许客户端有写入权限,否则也不能在客户端直接对服务端进行恢复,使用rsync对数据进行恢复的方法如下:
# rsync -avz --progress /databack/experiment/rsync/ work@172.16.78.192::www
Password:
building file list ...
6 files to consider
./
a
b
67 100% 0.00kB/s 0:00:00 (2, 66.7% of 6)
c
sent 258 bytes received 76 bytes 95.43 bytes/sec
total size is 150995011 speedup is 452080.87

5、示例脚本
这里这些脚本都是rsync网站上的例子:
1)、每隔七天将数据往中心服务器做增量备份

#!/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"
# tridge@linuxcare.com

# 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.

应该是没有以你的用户名登陆导致的问题,试试rsync -a max@192.168.2.36:::test test

Q:如何在终端下连接ipv6地址的rsync服务器(ipv6 addr rsync server)
A:ipv6中的地址中有'::'与rsync-server的模块名会有混淆,因此在写法上要注意。

rsync://root@[2001:4468:f04:1e10::201]:/test3
rsync -hriPtvz6 --port=8773 --bwlimit=199 freeoa@[2608:5531:5000:3fe::2]::freeoa/somedir ./


-----------------------------------------------------
该文章最后由 阿炯 于 2022-10-26 19:26:49 更新,目前是第 2 版。