rsync服务器使用配置入门
2012-09-21 10:06:46 阿炯

rsync是个给Unix系统用的应用软件,它使从一个地方到另一个地方的文件与目录同步,并同时恰当的利用差分编码以减少数据传输。rsync的一个大部分类似程序或协议中所未见重要特性是镜像发生在每个方向只需要一次传送。rsync可拷贝/显示目录内容,以及拷贝文件,并可选择性的压缩以及递归拷贝。在常驻模式(daemon mode),rsync监听默认TCP端口873,以本地rsync传输协议或者通过远程shell如RSH或者SSH伺服文件。在后面的SSH情况下,rsync用户端运行程序必须安装在本地和远程机器上。

rsync是自由软件,以GNU通用公共许可证发行。

算法
rsync公用程序利用由澳大利亚计算机程序师安德鲁·垂鸠(Andrew Tridgell)发明的算法,在当接受端计算机已经有相同结构(例如文件)但不同版本时,有效的将结构传输过通信连接。

接受端将文件拷贝打散成固定大小为S的不重叠片段,并对每个片段计算两个校验和:MD4散列函数与一个较弱的轮替校验和(rolling checksum)。它将这些校验和送给发送者。通信协议版本30(与 rsync 版本 3.0.0一并发行)现在使用MD5散列函数以替代MD4。

发送者对位于其版本的文件中每个大小为 S 的片段计算轮替校验和,即使是重叠的片段。这可被有效的计算通过特别知识产权的轮替校验和算法:如果位 n 到 n + S ? 1 的轮替校验和是 R,从位 n + 1 到 n + S 的轮替校验和可从 R,位 n,以及位 n + S 计算出而不需要真正去检验中间的位。因此,如果位 1 到 25 的轮替校验和已被算出,那计算位2到26的轮替校验和可完全依靠之前的校验和与位 1 与位 26 算出。

rsync使用的轮替校验和是根据马克艾德勒(Mark Adler)的alder-32校验和算法。该算法也被用于zlib,而它本身也基于弗莱彻校验和(Fletcher's checksum)算法。

发送者其后以接收者送来的一组轮替校验和比较它自己的轮替校验和以决定是否任何匹配存在。如果是的话,它便通过计算匹配区块的 MD4 校验和与接受端送来的 MD4 校验和比较来验证匹配。

发送者稍后传送给接收者不与接收者方任何区块匹配的文件的那些部分,以及如何合并这些区块到接收者版本的组装指令。在实际上,这产生了与发送者端文件一模一样的拷贝。然而在原则上是可能接收者的拷贝在这一点上不同:这可能发生在当两个文件有不同的区块但有着相同的MD4散列函数与轮替校验和;这种事情发生的机率在现实上极端罕见。

如果发送者与接收者文件版本有许多区段相同,该公用程序只需传送相对小部分的数据以将文件同步。在rsync算法构成rsync应用程序内核并最佳化两台计算机间TCP/IP的传输同时,rsync应用程序也支持其他种显著增进文件传输或备份的重要功能。他们包括在发送端与接收端个别利用zlib进行区块区块间压缩解压缩,以及支持通信协议如ssh。该协议让加密传输兼具压缩与效率,通过rsync算法产生的差分数据变得可能。除ssh以外,stunnel亦可被利用于创造加密通道以保全被传输的数据。

使用
rsync 是撰写来取代rcp与scp的。rsync最早期程序的其中之一是用来实现通过rsync/ssh与标准Unix帐号,从多重Unix客户端镜像或者备份到中央Unix服务器。与如cron类似的调度应用程序配合,任何人皆可调度介于多台计算机与中央服务器间自动加密过、基于rsync的镜像备份。

变种
一个叫做rdiff的公用程序利用rsync的算法产生文件A与文件B间不同的差分文件(与公用程序diff类似,不过不同的差分文件格式)。差分文件可稍后被套用到文件A,转成文件B(类似patch公用程序)。
不像diff,产生差分文件的过程有两步:首先产生文件A的签名档,然后这个(相对较小)的签名档与文件B被用来产生差分档。又与diff相异的是,rdiff可适用于二进制文件。

利用rdiff,自由软件作者们写了一个叫做rdiff-backup的公用程序,它可以跨过网络维护位于另一台服务器某个文件或者目录的备份镜像。rdiff-backup储存备份以及递增的rdiff差分档。这种方式让回溯到任何备份点成为可能。

duplicity是rdiff-backup的一个变种,它利用单一储存服务(像Amazon S3)达成不需要与储存服务器合作的备份。它通过产生预先产生每个区块的散列函数,将它们加密,并送到服务器储存,然后当进行递增备份时取回。剩下的数据为满足保全需求也被加密储存。

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有六种不同的工作模式:

拷贝本地文件;当SRC和DEST路径信息都不包含有单个冒号”:”分隔符时就启动这种工作模式。

使用一个远程shell程序如rsh、ssh来实现将本地机器的内容拷贝到远程机器。当DEST 路径地址包含单个冒号”:”分隔符时启动该模式。

使用一个远程shell程序如rsh、ssh来实现将远程机器的内容拷贝到本地机器。当SRC 地址路径包含单个冒号”:”分隔符时启动该模式。

从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含”::”分隔符时启动该模式。

从本地机器拷贝文件到远程rsync服务器中。当DEST路径信息包含”::”分隔符时启动该模式。

列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。


这6种方式看似复杂,其实只要记住一些常用参数,然后记住一些常用方法就能够将 rsync 利用起来。

可以man rsync 参考 rsync 文档,了解详细的使用方法,下面解析一些参数的使用:


rsyncd.conf
由模块和参数组成.模块由包括在方括号中的模块名开始,直到下一模块的开始为结束.模块的参数格式为 “ name = value “

在参数中,只有第一个等号是最重要的.以#开头的行,被忽略掉。

daemon必需有root权限,绑定端口在1024以下(默认是873),或者设置文件权限.可以通过inetd,或stand-alone daemon,或才通过远程的rsync客户端对其进行访问。

如果使其以stand-alone方式运行,使用命令:rsync --daemon
以inetd方式运行: 在/etc/services文件中添加以下一行:
rsync    873/tcp

在/etc/inetd.conf文件中添加以下一行:
rsync     stream    tcp    nowait    root    /usr/bin/rsync rsyncd --daemon

--------------全局参数-----------------------------
motd file
定义当客户端访问时看到的信息.默认没有.

pid file
定义rsync daemon将其PID写入的文件,如果此文件存在,rsync daemon会终止,而不是覆盖.

port    
定义daemon监听的端口,(默认是873),如果daemon在被inetd启动时加上 –port参数时,会忽略此参数.

address
覆盖daemon默认监听的IP地址.如果daemon是被inetd启动,并且有 –address参数时,会被忽略.这样就可以指定它侦听在那个网络接口上.

socket options
用来防止被人不停的连接.可以设置为所有socket的端口的传输速度:faster or slower.会被在命令行的—sockopts覆盖.

--------------模块参数----------------------------
模块名不能包括斜钱和关闭的方括号.
comment
当客户端取得可用模块列表时,在模块名后进行显示的注示.默认没有.

path   
在这个模块中,daemon可以使用的文件系统.必须配置.

use chroot
如果被设为"true",daemon会在给客户端传输文件前"chroot to the path".

numberic ids
对当前daemon模块,关闭能过名字对users 和groups进行识别.会阻止daemon试图load任何usr/group-related file or libraries.如同客户端使用了 –numeric-ids参数一样.默认在chroot中启用,在non-chroot中关闭.

munge symlinks
使传进来的文件的链接失效,但是可以恢复.只有在use chroot中并且inside-chroot path is "/"时,才会启动,其它时全部失效.

charset
设置模块的文件名的存储编码. 如果客户端使用—icov参数,会被失效.

max connections
设置最大连接数.默认为0,意为无限制.负值为关闭这个模块.

log file
不设会使用syslog

syslog facility
指定syslog 的名字来启示录rsync daemon.

max verbosity
控制信息的最大数量.默认为1,允许客户端请求 one level of verbosity

lock file
指定文件用来支持 "max connections"参数. 默认为/var/run/rsyncd.lock

read only
指定客户端是否可以上传文件.默认对所有模块都为true

write only
不允许下载.

list
是否允许客户端可以查看可用模块列表.默认为可以.

uid
指定用户名或UID取代root.默认为-2,意为nobody.

gid
同上.

fake super
设为yes,使文件的权限不以root权限.

filter
指定filter chain,指定哪些文件可以让客户端进入.

exclude
include会覆盖exclude
exclude from
include from

incoming chmod 指定传入文件的权限

outgoing chmod

auth users
指定以空格或,分隔的用户可以使用些模块.用户不一定要在本地系统中存在.默认所有用户无密码的访问(anonymous rsync)

secrets file
指定用户名和密码.格式  用户名:密码.

strict modes
指定 secrets file的权限是否被检查.true or false.

hosts allow
指定可以联系的客户端用户名和IP.address/mask,a.b.c.d,hostname,hostname pattern using wildcards.

hosts deny
默认没有.

ignore errors
忽略I/P错误.

ignore nonreadable
忽略对用户没有可读的文件.

transfer logging
log format
定义logging file transfers,当transfer logging启用时.
* %a the remote IP address
* %b the number of bytes actually transferred
* %B the permission bits of the file (e.g. rwxrwxrwt)
* %c the total size of the block checksums received for the basis file (only when sending)
* %f the filename (long form on sender; no trailing "/")
* %G the gid of the file (decimal) or "DEFAULT"
* %h the remote host name
* %i an itemized list of what is being updated
* %l the length of the file in bytes
* %L the string " -> SYMLINK", " => HARDLINK", or "" (where SYMLINK or HARDLINK is a filename)
* %m the module name
* %M the last-modified time of the file
* %n the filename (short form; trailing "/" on dir)
* %o the operation, which is "send", "recv", or "del." (the latter includes the trailing period)
* %p the process ID of this rsync session
* %P the module path
* %t the current date time
* %u the authenticated username or an empty string
* %U the uid of the file (decimal)

timeout
默认为0,意no timeout,建议为600(10分钟).

refuse options
daemon拒绝的rsync command line参数.

dont compress
指定文件不被压缩.压缩耗CPU.

pre-xfer exec,post-xfer exec
在传输开始或结束运行的命令.下面是设置的环境变量:
* RSYNC_MODULE_NAME: The name of the module being accessed.
* RSYNC_MODULE_PATH: The path configured for the module.
* RSYNC_HOST_ADDR: The accessing host's IP address.
* RSYNC_HOST_NAME: The accessing host's name.
* RSYNC_USER_NAME: The accessing user's name (empty if no user).
* RSYNC_PID: A unique number for this transfer.
* RSYNC_REQUEST: (pre-xfer only) The module/path info specified by the user(note that the user can specify multiple source files, so the request can be something like "mod/path1 mod/path2", etc.).
* RSYNC_ARG#: (pre-xfer only) The pre-request arguments are set in these  numbered values. RSYNC_ARG0 is always "rsyncd", and the last value contains a single period.
* RSYNC_EXIT_STATUS: (post-xfer only) the server side's exit value. This will be 0 for a successful run, a positive value for an error that the server generated, or a -1 if rsync failed to exit properly. Note that an error that occurs on the client side does not currently get sent to the server side, so this is not the final exit status for the whole transfer.
* RSYNC_RAW_STATUS: (post-xfer only) the raw exit value from waitpid() .

rsync exclude PATTERN 规则实例
 --exclude "*.o"   would exclude all filenames matching *.o
 --exclude "/foo"  would exclude a file in the base directory called foo
 --exclude "foo/"  would exclude any directory called foo.
 --exclude "/foo/*/bar"  would exclude any file called bar two levels below a base directory called foo.
 --exclude "/foo/**/bar" would exclude any file called bar two or more levels below a base directory called foo.
 --include "*/" --include "*.c" --exclude "*" would include all directories and C source files
 --include "foo/" --include "foo/bar.c" --exclude "*" would include only foo/bar.c
(the foo/ directory must be explicitly included or it would be excluded by the "*")

提供一个样例的配置文件:

# GLOBAL OPTIONS

uid = freeoa
gid = freeoa
motd file = /etc/motd.rsyncport=1873
pid file = /var/run/rsyncd.pid
lock file = /var/lock/rsyncd
log file = /var/log/rsyncd
transfer logging = yes
log format = [op]:%o [ip]:%a [module]:%m [path]:%P [file]:%f [size]:%l
syslog facility = daemon
max connections = 10

[freeoa]
comment = "recv data backup from lan"
path = /opt/data/freeoa
list = yes
use chroot = yes
read only = no
write only = no
exclude =
include =
auth users = rsync
secrets file = /etc/rsyncd/rsyncd.secrets
strict modes = yes
hosts allow = 192.168.8.0
hosts deny = *



rsync指令常用的几个参数:

-v  verbose 详细输出
-a 归档模式,递归方式传输文件,并保持链接、权限、用户和组、时间信息
-z  压缩文件传输
-h  human-readable, 输出友好

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 打印版本信息


rsync的六种不同工作模式示例:

拷贝本地文件

当SRC和DES路径信息都不包含有单个冒号”:”分隔符时就启动这种工作模式。

同步文件

rsync -ahvz backup.tar.gz  /backups/  # DESC 不存在时自动创建

将备份文件同步到 /backups/ 目录下。

同步目录

rsync -avzh /home/src /backups/files/

将 /home/src 目录下的文件同步发送到 /backups/files 目录下。记住如果目标地址没有 src 目录,rsync 会自动创建改文件夹。

rsync -avz /home/src/ /backups/files/

SRC 路径末尾的 / 表示不自动创建 DEST 文件夹,在 man rsync 中的解释就是末尾的 / 表示”拷贝当前目录下的文件” ,而不是”拷贝当前的目录“,

远程 shell 拷贝到远程

使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DES路径地址包含单个冒号”:”分隔符时启动该模式。

rsync -avz /local/path/  user@remoteip:/path/to/files/

将本地 /local/path/ 中的文件同步备份到远程 /path/to/files/ 目录。

远程 shell 拷贝到本地

使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号”:”分隔符时启动该模式。

rsync -avz user@remoteip:/home/user/src  ./src

远程 rsync 服务器拷贝到本地

从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含”::”分隔符时启动该模式。

rsync -av user@remoteip::www  /databack

拷贝本地文件到远程

从本地机器拷贝文件到远程rsync服务器中。当DES路径信息包含”::”分隔符时启动该模式。

rsync -av /databack user@remoteip::www

文件列表

列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。

rsync -v rsync://remoteip /www

rsync 使用更改端口

经常遇见的一种情况就是 ssh 更改了默认 22 端口,这个时候使用 -e 参数即可。

rsync有两种常用的认证方式,一种为rsync-daemon方式,另外一种则是ssh。ssh方式比较缺乏灵活性,所以一般为首选,但当远端服务器的ssh默认端口被修改后,rsync时找不到一个合适的方法来输入对方ssh服务端口号。

比如现在向机器 remoteip 传送文件,但此时 remoteip 的 ssh 端口已经不是默认的22 端口。

键入命令

rsync /local/path user@remoteip:/path/to/files/ # 出现错误

rsync中的命令参数 -e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步。

参数的作用是可以使用户自由选择欲使用的shell程序来连接远端服务器,当然也可以设置成使用默认的ssh来连接,但是这样我们就可以加入ssh的参数了。

命令可以这样写:

rsync -avz -e "ssh -p $port" /local/path/ user@remoteip:/path/to/files/

显示同步进度

可以使用 --progress 选项来显示进度

rsync -avzhe ssh --progress /home/files/ root@remoteip:/path/to/files/

限制同步文件最大值

设置 Max size 备份文件

rsync -avzhe ssh --max-size='2000k' /var/lib/rpm/ root@remoteip:/root/freeoarpm    

同步结束后自动删除本地文件

rsync --remove-source-files -zvh backup.tar /tmp/backups/    

设置传输带宽

rsync --bwlimit=100 -avzhe ssh /var/lib/rpm/ root@remoteip:/root/freeoarpm/


不常见应用参考
rsync over ssh
rsync -avz -e ssh dirname user@remote:/desired/path
ssh user@remote rsync -avz -e ssh dirname user@remote2:/desired/path

rsync over different ssh port
rsync --progress -vrae ssh -p5022 ldir user@host:/rdir
rsync --progress -vrae 'ssh -p 5022' ldir user@host:/rdir

该文章最后由 阿炯 于 2019-05-06 11:41:14 更新,目前是第 2 版。