找回密码
 注册
查看: 4474|回复: 0

Ubuntu下 rsync同步文件实例

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2016-8-29 13:50:37 | 显示全部楼层 |阅读模式
Rsync(remote synchronize) 是一个远程数据同步工具,可以使用“Rsync算法”同步本地和远程主机之间的文件。
' X) S5 c* q9 I1 T' Y- S% grsync的好处是只同步两个文件不同的部分,相同的部分不在传递。类似于增量备份,
  X$ Q5 q" Q4 v' B1 }; k这使的在服务器传递备份文件或者同步文件,比起scp工具要省好多时间。& T  a8 M  X/ o5 K. W1 C) F1 S+ \
OS:ubuntu server 10.04
7 p; z# U* k: R7 R$ B$ s6 j1 nserver:192.168.64.1281 h4 n% W/ g4 u) e6 ~* S
client:192.168.64.145% i+ S# b0 l3 ?2 x  A
server
! L" ?/ [5 }# ~2 v$ D1.ubuntu  server 10.04默认已安装rsync,rsync服务默认不是启动的,我们要修改下面的文件。
$ \& f5 n4 H# W/ v( A7 j+ m$sudo vi /etc/default/rsync- X/ R8 X/ d( T/ j$ r
RSYNC_ENABLE=true   #false改true8 T3 s. r, q: W, S# k9 N
2.修改配置文件* ?6 S, M: j4 T( u! |
$sudo cp /usr/share/doc/rsync/examples/rsyncd.conf /etc   #已默认安装的软件,默认不启动的似乎都要这么做
5 u# W& \0 @. t3 w3 g我们先来查看一下这个文件' R, V3 W5 ?8 R2 Q& Q$ x5 M
$sudo cat /etc/rsyncd.conf9 [' e1 c  [; `; F+ I
. i0 t6 ?# ]6 w: ^
# sample rsyncd.conf configuration file6 V8 q6 c3 w* O& n
$ l! ?/ I! ?7 P$ {1 d7 l
# GLOBAL OPTIONS& P0 e6 w, C; k+ z- l' \! ^
/ P+ L  f! B5 J* O9 Y
#motd file=/etc/motd #登录欢迎信息1 m' d8 B4 \: I, e, i7 \1 q
#log file=/var/log/rsyncd #日志文件8 z% V6 [" i1 X
# for pid file, do not use /var/run/rsync.pid if4 u2 C' L* T% r4 V# i3 D
# you are going to run rsync out of the init.d script.
( [" d7 a6 u, |) M' e3 _" ~$ dpid file=/var/run/rsyncd.pid7 }: S7 Z9 O" k6 \: z; v

8 J) P8 j6 E+ M4 e1 N/ Z#指定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。+ d- n3 O! P% ]4 T' r' N3 T
#syslog facility=daemon6 Z6 [" T( @- \& S+ a

& E% A( q4 V3 i0 u5 l#自定义tcp选项,默认是关闭的
2 r8 ?, V. c/ v. X#socket options=8 r% {4 R# `1 Y# e# A- b) q# S

) \4 L8 b' K4 C. n1 [" J6 M# A#以下是模块信息,我们可以创建多个模块5 Z/ _* @3 D1 O4 y) E" A
# MODULE OPTIONS
' y( {5 c& r0 |* Z" @2 A" x* T1 }% u) I# {3 o% T& u" @
[ftp]
/ I& K! Z" e1 g) j) t  \2 a; i
/ `3 T- ~3 K% r4 ], i  V" H/ K        comment = public archive #模块描述, Q5 I+ }7 @$ ?# @+ B3 o# P
        path = /var/www/pub #需要同步的路径
& J. K7 V& H9 D' }& s" r- k        use chroot = yes #默认是yes|true,如果为true,那么在rsync在传输文件以前首先chroot到path参数指定的目录下。这样做的原因是实现额外的安全 防护,但是缺点是需要root权限,并且不能备份指向外部的符号连接指向的目录文件。, M8 V* j$ y/ w$ P4 P
#       max connections=10 #最大连接数6 T2 W" }. ?1 g: L2 u
        lock file = /var/lock/rsyncd #指定支持max connections参数的锁文件。
, ^3 J7 r; S0 L% B* |7 G4 h# the default for read only is yes...% M3 A" i" W3 x' Y8 u1 ^3 F3 L
        read only = yes #只读选项
8 h- `0 d; S% E) x! y! Z" p- Z        list = yes #客户请求时可用模块时是否列出该模块
# @, T6 D; D3 i3 S4 @' }. `        uid = nobody #设定该模块传输文件时守护进程应该具有的uid5 ]' G! I- r$ \1 ^4 [6 a
        gid = nogroup #设定该模块传输文件时守护进程应具有的gid,此项与uid配合可以确定文件的访问权限
( r- m' _. _0 C% x" s, g6 r# Y#       exclude = #用来指定多个由空格隔开的多个模式列表,并将其添加到exclude列表中。这等同于在客户端命令中使用--exclude来指定模式,不过配置文件中 指定的exlude模式不会传递给客户端,而仅仅应用于服务器。一个模块只能指定一个exlude选项,但是可以在模式前面使用"-"和"+"来指定是 exclude还是include    #这个我的理解是排除目录中不需同步的文件
' U$ z  h7 [' ^  m8 ]2 P#       exclude from = #可以指定一个包含exclude模式定义的文件名1 ~/ V+ v  M& ~2 f
#       include = #与exclude相似2 Y) ~) u1 C' ?" }7 \' K
#       include from = #可以指定一个包含include模式定义的文件名
( I2 k$ l& M+ R( h#       auth users = #该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的 challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)8 |& u; j1 m! f4 h" h
#       secrets file = /etc/rsyncd.secrets #该文件每行包含一个username:password对,以明文方式存储,只有在auth users被定义时,此选项才生效。同时我们需要将此文件权限设置为0600
+ L" t7 K7 h, W! O1 [- N        strict modes = yes #该选项指定是否监测密码文件的权限,如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认值为true
0 X0 O, `+ z8 U* Q! c#       hosts allow = #允许的主机
+ G% ^5 R1 ~' Z) o9 ~#       hosts deny = #拒绝访问的主机
( I- b) v8 T# K( o        ignore errors = no #设定rsync服务器在运行delete操作时是否忽略I/O错误( S# S" t, ]" H# H. \: \
        ignore nonreadable = yes #设定rysnc服务器忽略那些没有访问文件权限的用户; g$ e* t6 t2 _+ B* I0 D& {! ~
        transfer logging = no #使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中
  {4 x0 s) T/ O# p& K( S#       log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes. #设定日志格式
- N2 ^! t7 W! c& R        timeout = 600 #超时设置(秒)1 ^) R: f3 j  U
        refuse options = checksum dry-run #定义一些不允许客户对该模块使用的命令选项列表4 |1 D8 c1 q8 @+ c) c0 K
        dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz #告诉rysnc那些文件在传输前不用压缩,默认已设定压缩包不再进行压缩4 ?- G0 g; g- R! @
# U3 K: |5 \4 H, c6 `
8 W0 u9 q2 p0 @8 z% u
日志格式选项列表:8 O3 j" }; W% {+ j% u
%h:远程主机名& g4 b/ {$ x0 u  g1 T7 O
%a:远程IP地址2 l7 j0 R& |3 v+ u5 d  n
%l:文件长度字符数- l9 S! _5 \. l( Y$ Y# W5 x8 A
%p:该次rsync会话的进程id- o( u: d% C" }/ K5 A/ `
%o:操作类型:"send"或"recv"、”del.”. `1 M! a6 \  b: G) g1 X
%f:文件名% b' ^) \- Y0 Z" D9 A! E: p
%P:模块路径
! H8 h6 \, s, O%m:模块名
3 L7 l! t& @' Z2 q%t:当前时间' q6 o/ E2 d* [4 p+ K
%u:认证的用户名(匿名时是null); ^! [6 a# A- N2 i$ ~6 ]
%b:实际传输的字节数
* H& K& z1 o$ |8 c" M%c:当发送文件时,该字段记录该文件的校验码
2 f" r. L! @% A8 p5 V* X/ r% |& b6 Y  D6 m- e" R( F  A( f# o. g" |
下面我们来定义自己的conf文件& i' o- l- a; G

6 M& F6 C4 b+ j4 n# sample rsyncd.conf configuration file
8 n' W8 V) a. |! b8 h$ ?4 d9 `: ~0 \+ |# GLOBAL OPTIONS
4 S1 k! D4 e( W#motd file=/etc/motd
0 w) [% N4 v. U* T4 B& L. Llog file=/var/log/rsyncd
( t; |1 D1 k/ m0 \' x7 _# i" V# for pid file, do not use /var/run/rsync.pid if6 c. t9 G% M1 a, o" \, J7 p2 e! T
# you are going to run rsync out of the init.d script.0 p. r# j2 z! F* X) q4 f/ S% H3 [  ]
pid file=/var/run/rsyncd.pid
+ d& Q0 A5 R' p* |* tsyslog facility=daemon
! k3 W4 I: m  q7 {, v7 D8 T# F4 H#socket options=
" f; Y0 i2 \4 I: ~# MODULE OPTIONS7 b& K9 D  K) b% M8 E: _* e, e7 j
[my_rsync_bk] #名字可以任意命名,只要客户端的rsync命令一致
  }5 g$ H2 e2 J. k        comment = public archive
2 s+ {1 F8 L6 k5 C. A) y        path = /home/rsync_bk                             #指定路径,如果没有这个目录自己建。) |. u* V+ ]" f0 L5 h
        use chroot = no, C& G" Y# P+ ^& @1 s
#       max connections=10, t% w+ d/ L$ y" M6 Y  d$ Q& \' b
        lock file = /var/lock/rsyncd
. Q+ \1 D( {5 ]/ Z! K4 X0 b# the default for read only is yes...
9 [% t9 J$ f: H7 N% _, j/ g8 K        read only = yes
* l9 h( w" [* \8 ?" f8 S        list = yes/ A$ o/ A0 n  F
        uid = nobody
% q: Z" ?# ?" z  ]3 G  T        gid = nogroup" `, t5 ?6 `8 }2 t4 k
#       exclude = : Q/ C9 P" I$ z# d. H
#       exclude from = ) R4 y- d0 ?: ?7 E2 f1 G
#       include =
& ^3 w( ~- I( `8 Q9 Z; ~/ B2 Y#       include from =
/ s' ~2 u' |( {: a6 l1 d2 O        auth users = liu_rsync              #rsync连接时的用户名,要和客户端rsync的命令一致
) L! h- L. v+ A' S        secrets file = /etc/rsyncd.secrets #这里是保存密码的地方,如果屏蔽掉就不用密码了
. r2 p7 k8 A( P! @        strict modes = yes
1 ?4 ~1 l# ?3 J        hosts allow = 192.168.64.145 #运行的客户端ip. m& |/ ]- }& D
#       hosts deny =- h; z$ m" e4 L; O' G
        ignore errors = yes
% p+ ^& \; ?- `8 K4 Z: C        ignore nonreadable = yes8 A/ A# ]/ j: q5 _
        transfer logging = yes! M4 X2 E: W, e, C6 f* y- G9 q
        log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.% g: \3 i) s1 ^( H# r
        timeout = 600
* ?, m+ w: B9 U# B: s* x        refuse options = checksum dry-run
  T1 ?0 Y! }1 k! Y6 @1 r3 c        dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz5 }# [; m3 E0 W
" u& q2 i0 ?4 r
. d! e: A/ P, Y0 o7 p, V
创建一个密码文件
7 l. Q3 j# i9 g5 d9 j$sudo vi /etc/rsyncd.secrets; J$ L. i! f9 s! D
liu_rsync:1231 |: [) u! ?! x3 N( i
$sudo chmod 0600 /etc/rsyncd.secrets   
3 ]# V2 U1 t5 P3 h$ |* f2 {9 t. u; `. w
启动rsync
9 b* T5 p6 c" |$ b7 g' ]5 U2 _- Q5 qsudo /etc/init.d/rsync start) Q0 f- u" t% ?$ ]" t' D$ @
8 A* N, H* E+ _2 C
client
3 u% c+ u# V2 |4 |* k% ?我们再来看一下客户端的操作,一般客户端不需要进行特殊的配置,直接同步即可
: h, v+ u+ B" T/ L$ l rsync -vzrtopg --progress  liu_rsync@192.168.64.128::my_rsync_bk .  #.为当前目录,在服务端touch一个文件,同步后就会出现,当然你也可以指定一个位置比如/databk,需注意所建立的权限!
6 v: x) e( P, B' E6 x3 A
4 Q( R$ H' C6 R1 s6 ^+ }我们把这个同步工作交给crontab去执行。首先我们要创建一个密码文件; n" z7 A) I) Q" G  q# w, H1 T
$sudo vi /etc/rsync.pwd输入123,保存     #密码要一致
. L7 s$ _7 H" P; \, m9 B
( r- Y+ B- [: U: J# a( p( ?. r0 O!注意:下面这两步操作是必须的,没有足够权限同步就会不成功,ls -l 你所指向的目录
, z0 A) t  C; A9 Z2 E6 Fsudo chmod 0600 /etc/rsync.pwd
$ }3 W# R' d; Z( V' u: b6 xsudo chown 普通用户:普通用户组 /etc/rsync.pwd
( s6 g8 S: {2 ~: z
+ I1 J4 n5 V9 S8 k- d然后我们打开crontab,使它自动同步+ U- f7 I, |. p* @6 d& U' x7 A
$crontab -e
/ g9 _. _9 V  }/ i/ l6 u7 D2 @* * * * * rsync -a --password-file=/etc/rsync.pwd liu_rsync@192.168.64.128::my_rsync_bk /databk   
! H3 h! x8 d6 \5 S$ c% W0 ^1 a6 n0 T' }crontab随机启动  sudo vi /etc/rc.local
$ c* ~. H1 H- B4 w0 H参数说明:) A; \. X$ z+ w6 }& ~
-v verbose,即详细模式, y1 U6 g4 e0 N) s
-z 压缩1 P0 [. M8 f  r) d) ?# @" q
-r recursive 递归" F3 ~, L2 {! [% e
-topg 保持文件原有属性,一般不用加
* r2 W0 {- K% o" T5 ` --progress 用来显示详细进度情况2 i: a* M* F! C" I: h: _9 O7 o( l
--delete 表示如果服务器删除了一个文件,客户端也应对应删除
- Q0 D2 k0 M' \4 Y. t--exclude="*.sh" 表明不包括某些文件
0 b7 }- {% p& c/ k. W8 a0 n--password-file=/etc/rsync.pwd 指定所使用的密码文件1 a2 I% h: \! C5 {1 m/ ?
最后一项是需要同步的目录  " Z: w; L2 H$ i* _
注意指定使用的密码文件中只需要有密码,不要有用户名。
; \- s, H! `- n4 Z/ S) @------------------------------------------------------------------------
: o1 q  D2 m7 [; g  Z2 Q- ~1.在本地机器上对两个目录同步5 l# Y4 U% U6 u# ?' j
$ rsync -zvr filename1 filename2
9 |8 P- ?* t) ^" ?1 t9 R2 c0 A* ~
上述代码是将filename1中的文件与filename2中的文件同步,如果将filename2中的文件同步到filename1中,修改代码为:
  }. U  [) \0 M8 E& z$ rsync -zvr filename2 filename1" h6 q1 r) E0 f7 w) y* ^9 T

1 v2 N% S( ]3 n1 z8 U* S% [9 ~" I2.使用rsync –a 同步保留时间按标记1 E8 f7 _! ]$ M0 u- _: R" C4 J
$ rsync -azv filename1 filename2) _' b; {$ C8 J0 h4 s& p) g

. h. @6 E( Z! y使用上述命令,将filename2中新同步的文件的时间与filename1中的创建的时间相同,+ ~8 `! T( S' R" X# Z9 M2 P
它保留符号链接、权限、时间标记、用户名及组名相同。
+ V$ l3 g! `, b; H: M- g  T. |3.从本地同步文件到远程服务器
4 c- I) q) W$ ~8 j% ?7 X$rsync -avz filename1 ubuntu@192.168.0.1:/home/ubuntu/filename2
$ e# M6 v2 f, X% \' Z% ]) |
& w$ n6 B6 x: @$ f6 w上述命令是将本地的filename1同步到远程192.168.0.1的主机上。5 N9 n8 l$ W0 g& c
注意:如果远程主机的端口不是默认的22端口,假如是3000端口,上述的命令修改为,; E. I" T* x% Y# Y% u% Z
$ rsync -avz '-e ssh -p 4000' filename1 ubuntu@192.168.0.1:/home/ubuntu/filename2
# |) o7 S) c# @, z# o, Y+ l2 K0 j7 u1 D, |
4.将远程服务器的文件同步到本地! U* f3 `$ S* L* j5 ?- V! v" p
与步骤3类似,只是将filename1与远程服务器的位置对换一下,3 R( ?+ S) P( D& f8 s8 ]! P" n/ F* E
$rsync -avz ubuntu@192.168.0.1:/home/ubuntu/filename2 filename16 s. b# B. m" x9 J! G" |

( U7 L5 e% p5 Z5 u: _$ j1 F同理如果端口不是22,使用以下命令
% f) a! F4 T/ ^! i$ rsync -avz '-e ssh -p 4000' ubuntu@192.168.0.1:/home/ubuntu/filename2 filename1 % g/ g; z& ^0 s( K" \8 E3 ?0 O0 s

0 _4 K7 l! w# C6 n8 e% U1 G参考:http://www.eduicc.com/read-24.html
0 N) j  n# c  m6 g" H0 d           http://jordy.easymorse.com/?p=273' p- R: F& W4 ^9 ~2 Q2 t: w
+ r# w% ]4 S( Q3 |) E' Q3 {7 R9 X; M

' M9 P# r, i7 H, ~" ^: T" h! O1 [6 i" m

/ j1 m" t) U  W2 L& D2 x% g# i 服 务器之间常常要保持些文件或目录的一致,比如一些大的软件下载网站,它们通常使用多台服务器来提供下载服务。当一台服务器上的文件更新后,其它的服务器也 需要更新,而且 在更新的时候应该是只对新增或是修改过的文件进行更新,否则会造成网络带宽和时间的浪费。rsync就是能有效的保持文件及目录的一致的 优秀软件。
7 h2 ^. V% `4 E* m: \" [5 s  rsync,remote synchronize
/ |% A6 l' U6 W+ r" r4 q3 @  顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息,而且可以通过ssh方式来传输文件,这样其保密性也非常好,另外它还是免费的软件。rysnc的官方网站:http://rsync.samba.org/,可以从上面得到最新的版本。当然,因为rsync是一款如此有用的软件,所以很多Linux的发行版本都将它收录在内了。你的Linux里并没有安装rsync,你可以按以下的安法自行安装:
/ \( L& z9 C# x( A3 V  Z  一、安装过程
- M9 S6 v& M) ~4 w  1.下载rsync, d1 N# o4 \- l) J6 I/ H" f& ]
  目前(2003年9月)最新的rsync版本是2.5.6,从rysnc的官方网站上下载一个回来:
) m1 X$ h$ H7 w5 x+ u6 R3 B9 O2 p  # wget http://ftp.samba.org/ftp/rsync/rsync-2.5.6.tar.gz , a+ P$ c7 F* D! U1 e: r2 F

) t3 |( N% e, ~9 C! S& g  2.解压
6 y3 K$ r7 l$ m) F$ B5 l# i  # tar -xzpvf rsync-2.5.6.tar.gz4 G) v6 R$ U1 m; ?; d. o
( b& L; ^$ Q0 y+ B& E
  3.编译安装$ z: E. O% z% @2 [
  # cd rsync-2.5.6/
  _8 b8 m; h5 O7 c% U* |! S  # ./configure --prefix=/usr/local/rsync0 g" F6 D% P2 L; J) a) B* B( a2 x
  # make
! x4 \9 w( k! {# Q  # make install
/ I9 ~, _! w* ^0 R  以上过程没有出现的话就安装好了,现在就有rsync命令可以用了,rsync命令放在- P8 _% @6 v# K  H0 {2 Y. k
/usr/local/rsync/bin。用rsync命令可以去运行有rsync服务的服务器上抓取资料。% ^) A" j: O0 b; Z
  如果要把当前的机器变成一台rsync服务器的话,就需要继续进行一些配置了。
6 C# X+ `* N& p/ H3 t0 H, U' Y7 Z1 E
  二、配置rsync服务; N$ J: V8 R9 P2 n# E4 Y" u
  配置一个简单的rsync服务并不复杂,你需要修改或建立一些配置文件。
8 P: b% t$ y1 l) }3 H  1.rsyncd.conf$ p3 x) @  f# o
  # vi /etc/rsyncd.motd/ z4 Z6 l+ Q3 d( x; f( ]
  rsyncd.con是rsync服务的主要配置文件,它控制rsync服务的各种属性,下面给出一个# D3 r2 w- Q. \7 S, x! C$ n$ o5 _
rsyncd.conf文件的例子:4 ]2 v) p* T) G' a
  #先定义整体变量
! |' C# n& h  N5 \; ^  G  secrets file = /etc/rsyncd.secrets
& j; }) T4 g+ Z2 n) G+ ^5 X  motd file = /etc/rsyncd.motd
% F- D9 h( g6 j2 s; Y/ Q- A; |8 s  read only = yes5 _* d# I& h" b4 s0 d* o6 b* S
  list = yes
' W0 i6 S0 R8 z; w  uid = nobody5 g1 u: O$ A- P' Y4 K4 [: D
  gid = nobody
, b* ~" J/ k; Z, J3 k  hosts allow = 192.168.100.90 #哪些电脑可以访问rsync服务
% H! ~& @9 w5 \) w  hosts deny = 192.168.100.0/24 #哪些电脑不可以访问rsync服务
  B, \+ h& q/ w- c, C1 m( W6 W2 g  max connections = 2
: P1 \; P" B  `, j' X  log file = /var/log/rsyncd.log
7 [4 H! N" N5 ?9 i0 ^; D4 N# @  pid file = /var/run/rsyncd.pid( i8 M; G% t7 w# J; f9 `8 Z' A
  lock file = /var/run/rsync.lock
. o" N2 V' V( u5 ?  #再定义要rsync目录
" s# d$ r- x+ t; [  [terry]/ }7 I* R$ `, `  l1 I( Y
  comment = Terry 's directory from 192.168.100.21" e2 P: l( U6 ]% g* O2 x( X, W
  path = /home/terry
; ]& y7 W; a" R4 i  auth users = terry,rsync3 P5 s/ l* T# ~2 p
  [test]" c& w) f+ x0 ~. s  A1 u1 ]
  comment = test rsync& X8 U0 }2 w1 V+ L7 X% x
  path = /home/test7 a3 H+ F) y1 h7 W- Z- ~" T
   在上面的配置文件中,限定了192.168.100.0/24这个子网中,只有192.168.100.90的机器可以来访问这台rsync服务器的 rsync服务。配置文件的后面部分定义了两个rsync的目录,terry目录是只有知道terry、rsync两个账号的人才能使用的,而text目 录是无需账号就可以访问的。rsync在定义目录时还提供了一些其它选项,可以作更严格的控制。% C+ z# D6 L$ o7 i0 ]5 i3 i: F' {

8 p8 C! V$ A2 Q1 B  2.rsyncd.secrets: `4 t  s! c9 B/ @# p
  # vi /etc/rsyncd.secrets' F$ \# f8 T5 a  _
  rsyncd.secrets是存储rsync服务的用户名和密码的,它是一个明文的文本文件,下面给出一个rsyncd.secrets文件的例子:
5 `! N0 b( H2 Q2 w  terry:12345
' _! l% f' f) _8 `$ o- G) l  rsync:abcde
; [- \7 f2 u4 m/ [# A  因为rsyncd.secrets存储了rsync服务的用户名和密码,所以非常重要,因此文件的属性必须
# R( q* i; w4 q% g$ j9 k  I设为600,只有所有者可以读写:
  o5 M. j$ J! N& j' l  c  # chmod 600 /etc/rsyncd.secrets: \1 L4 O, E1 z) z

) N2 E7 S0 N, n  3.rsyncd.motd
- f) t$ t  p+ y  # vi /etc/rsyncd.motd3 w$ |1 q3 p8 X; c" u
  rsyncd.motd记录了rsync服务的欢迎信息,你可以在其中输入任何文本信息,如:
6 S; w4 d. e: e( m  Welcome to use the rsync services!
3 n, d9 Y8 w' D5 @( i1 |8 W* N+ s( G$ e
  4.services; J, o7 K! ?! J# Y% V' E
  # vi /etc/services" ?9 a/ v3 i. Q
  services并不是rsync的配置文件,这一步也可以不做。而修改了services文件的好处就在于
2 n3 o! |  g  O4 u系统知道873端口对就的服务名为rsync。修改services的方法就是确保services中有如下两行,+ Z4 U! u, ^: m& J6 E
没有的话就自行加入:
* w  i( ^; N( l1 b3 f% |  rsync  873/tcp  # rsync
4 D6 ~$ e7 n9 |" \* }5 K7 D  rsync  873/udp  # rsync) k4 q. M) }4 x1 `/ r
  5./etc/xinetd.d/rsync
6 m5 z+ r# R+ a/ ~  |; ]0 c) c+ X  # vi /etc/xinetd.d/rsync
) C# X- J0 k2 I: ]- U  建立一个名为/etc/xinetd.d/rsync文件,输入以下内容:! T' u: T6 z; J5 O
  service rsync
- m/ ^* @+ g4 K' X  {
% y6 V% O( M7 m: M2 _6 S/ m/ D    disable = no( s! Z) F. Q) u
    socket_type  = stream; F/ ?3 F9 Y2 x, z! I2 o% ?) L
    wait      = no. s; V) V) R2 a2 v
    user      = root) q  I8 Q7 s: V+ Q& L4 T: a
    server     = /usr/local/rsync/bin/rsync
; C1 ]! f6 _! |    server_args  = --daemon8 |; P2 l5 m: o" D3 K7 K. Q  J
    log_on_failure += USERID, k% W5 b& R+ x. N) {! _' Z0 L
  }
) t* k' O3 k- q+ k4 a  保存后,就可以运行rsync服务了。输入以下命令:7 ?& t; g1 T! t6 ?8 ^
  # /etc/rc.d/init.d/xinetd reload
- A1 J$ |  h- g8 R' ~! n' O3 n6 e  F  这样rsync服务就在这台机器上(192.168.100.21)运行起来了,接下来就是如何来使用它了。
2 ^' i& w! X4 A; _  _
  ?5 K3 q9 n" [9 U' \  三、rsync命令的用法+ s, @* f* k& ^% z1 g2 |  z9 n
  在配置完rsync服务器后,就可以从客户端发出rsync命令来实现各种同步的操作。rsync有很- K- s  f; y' e. {- o/ x7 G. ^* R
多功能选项,下面就对介绍一下常用的选项:8 I5 w. w3 u$ L( g! w
  rsync的命令格式可以为:4 i0 d& W3 n" @. ?& |) h8 I
  1. rsync [OPTION]... SRC [SRC]... [USER@]HOST : DEST]" R& v9 U, U4 _% z
  2. rsync [OPTION]... [USER@]HOST:SRC DEST]
* N" l# _: X% `/ I4 Z& A8 m  3. rsync [OPTION]... SRC [SRC]... DEST]
  g& J# v; n- J/ y  Y, V) ]) M  4. rsync [OPTION]... [USER@]HOST::SRC [DEST]+ G+ Y3 o9 b2 ^4 a& r( [0 [% S
  5. rsync [OPTION]... SRC [SRC]... [USER@]HOST :: DEST]
: s: Z7 S) y2 r- Y# h4 i& m% F  6. rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
$ d5 x: ?: j5 E! d3 {  u, B: C, c
/ \5 [- J. g, A  rsync有六种不同的工作模式:
2 n8 _( a( y( u6 s' O' y  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。
0 `+ \6 M! [' d$ j' P8 W  2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST
4 J3 `) f. s0 t4 ^4 D% B7 w% c5 ]路径地址包含单个冒号":"分隔符时启动该模式。
8 @# {  Q) u  n' H  3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC
" ?/ @$ D, T! X! g6 t# t7 w地址路径包含单个冒号":"分隔符时启动该模式。
* Z- O) Z, U" ^5 l) t  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。1 C. ?6 G5 [# P' ^3 k, Y
  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。
6 y. L* V* u; m! \! L  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。* Q" W7 k9 m6 R( s& C
  下面以实例来说明:
# j5 t! Q1 e' \- m" Q  # rsync -vazu -progress terry@192.168.100.21:/terry/ /home' |! Q+ C# W, S9 ~( o8 P
  v详细提示
- H/ u- d3 c5 c7 y6 f, K4 Q  a以archive模式操作,复制目录、符号连接
8 R; ?4 e4 |1 \% J% |2 S- |  z压缩' V3 i+ Z, U) j- V& A
  u只进行更新,防止本地新文件被重写,注意两者机器的时钟的同时
3 E2 J5 Y8 I5 j3 U4 F3 a, T  -progress指显示/ y. o6 i4 X, O2 K0 I3 C
  以上命令是保持客户机192.168.100.90上的/home/terry目录和rsync服务器上的terry目录同
9 @2 D2 _! B8 j1 a步。该命令执行同步之前会要求你输入terry账号的密码,这个账号是我们前面在rsyncd.secrets
- X/ a0 T; J& ?$ j" e4 q7 J文件中定义的。如果想将这条命令写到一个脚本中,然后定时执行它的话,可以使用--password-file1 {1 _+ W6 V2 X* K9 x
选项,具体命令如下:# x  G3 s$ \. V1 S1 q) L
  # rsync -vazu -progress --password-file=/etc/rsync.secret8 I% K$ j$ e! }& m6 s% c
  terry@192.168.100.21:/terry/ /home( Q! g3 q6 ^" Q3 i& b, X8 r
  要使用--password-file选项,就得先建立一个存放密码的文件,这里指定为/etc/rsync.secret。$ P6 j4 r. Q2 }3 b0 d( Q
其内容很简单,如下:$ h1 i  o; U9 n' P
  terry:12345
/ M0 }+ O- ?" e, i8 G  I  同样要修改文件属性如下:  ?. h1 V1 `/ U2 l' b# ?0 L
  # chmod 600 /etc/rsyncd.secrets; D: Z( b( D" B
$ J( y$ l2 i' `% r5 r, R
  四、利用rsync保持Linux服务器间的文件同步实例. r$ F% Q+ u! l7 F5 u. T
  现在假设有两台Linux服务器A(192.168.100.21)和B(192.168.100.90),服务器A中的% \5 {& b( t' o9 s) ^5 R
/home/terry和服务器B中的/home/terry这两个目录需要保持同步,也就是当服务器A中文件发生
# w" ^# n1 Y9 }/ V+ F改变后,服务器B中的文件也要对应去改变。
) L2 z! q  h3 W. l; w$ n& b  我们按上面的方法,在服务器A上安装rsync,并将其配置为一台rsync服务器,并将/home/terry2 _' u7 u7 p$ |+ x: V
目录配置成rsync共享出的目录。然后在服务器B上安装rsync,因为B只做客户端,所以无需配置。
! w8 B: b1 I" i) U# c! x然后在服务器B,建立以下脚本:' e& E4 r  W5 ^0 |  P
  #!/bin/bash
$ T5 |3 P) i3 R1 C  /usr/loca/rsync/bin/rsync -vazu -progress --delete7 o4 ?( a2 `. z( {* Q& w6 O
  --password-file=/etc/rsync.secret terry@192.168.100.21:/terry/ /home
; B$ Y; \$ ?& k5 b; C5 W  a  P, T  将这个脚本保存为AtoB.sh,并加上可执行属性:* O/ k! N1 }% d/ R# H
  # chmod 755 /root/AtoB.sh
" e' B- g3 ^# `% c4 U/ T  然后,通过crontab设定,让这个脚本每30分钟运行一次。执行命令:
4 \9 l  W% y' E$ r& F  # crontab -e
8 J' T8 N6 u8 }4 [9 k+ c5 N  输入以下一行:4 Z* t! C. {7 Z5 Z- |
  0,30 * * * * /root/AtoB.sh( U; ^2 i% Q4 c* k5 c; J
  保存退出,这样服务器B每个小时的0分和30分时都会自动运行一次AtoB.sh,AtoB.sh是负责) E/ N! _5 `  ]% V0 J' u) @- l7 b0 V
保持服务器B和服务器A同步的。这样就保证了服务器A的所有更新在30钟后,服务器B也一样取
/ J9 d: e0 B% s得了和服务器A一样的最新的资料。; V; l5 X$ l6 t4 w
& a( Z5 G$ I% V
  五、其它应用* p3 |0 @+ M9 _# y1 ~
  rsync除了同步文件及目录之外,还可以利用它来实现对远程网站的远程备份。如果再结合脚本和Crontab就能实现定时自动远程备份。其可以实现与商业化的备份和镜象产品的类似效果,但完全免费。5 R# k$ `3 r3 B

9 F. j% V$ w7 ?0 E! l8 ?4 o         附:rsync有六种不同的工作模式:/ _2 F' K, u4 V. X9 @' h
  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。, o1 ~$ F9 U, M1 g
  2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST- {: L6 I7 Q- O  F# I; K
路径地址包含单个冒号":"分隔符时启动该模式。
  D4 H# I# p" H. P& }, r  3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC
: V; E3 y  Y3 B$ b) ^地址路径包含单个冒号":"分隔符时启动该模式。
) h: p/ ]9 H( Z" y6 Y; P$ |  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
  l9 Y2 s2 O% E5 ]2 M' Q5 N3 W7 |  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。- @4 G' A& O( [  F' B5 x
  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。* X! K6 L3 p1 l1 i4 s  c8 \: }

6 C/ z8 n% l4 q, g5 f. W/ o9 Y5 E4 m

/ `  P( R% t/ b* [1 N" I- n0 u
) X2 d& R: A/ W# g; K
" z0 t5 b/ U% l! ?0 {3 }/ q- w& i2 o( S2 n2 w! j4 t
0 W  w5 Z; L7 d- V

9 C. l# A+ m7 }' G2 p1 C9 C. [6 y0 i; |+ |5 F/ o( S5 r9 ?
  前段日子在网上找rsync daemon的filter等过滤规则的详解,怎么也找不到,哥一怒之下,决定自己动手翻译,于是有了本文…) g' @, `( O/ Q( x* T$ L9 E
    本文内容翻译自rsync的官方文档:http://rsync.samba.org/ftp/rsync/rsync.html,以及http: //rsync.samba.org/ftp/rsync/rsyncd.conf.html,非完整的全文翻译,并且按照我的需要,对原文的相关章节或 条目进行了适当的重新编排。官方文档发布日期:26 Mar 2011。  s1 W: c( @0 b" H' w& V
" ~1 W0 a8 L# D0 Q. l' e
    rsync是Unix/Linux系统中一款优秀高效的镜像同步和远程数据备份工具,它可以把本地文件拷贝到远程主机,或从远程主机拷贝文件到本地,也可以在本地的两个目录之间进行拷贝,但不支持两个远程主机之间的互相拷贝。
# A( U5 }' Q0 d9 o- w: d3 x, J; d* `+ `
4 Q, Y8 k$ u( k$ z, P* w
    关于rsync的工作方式:5 D; v- n6 g8 u2 O  i9 C
    rsync连接远程主机进行同步或备份时有两种途径:使用远程shell程序(如ssh或rsh)进行连接,或使用TCP直接连接rsync daemon。
0 [3 X3 h; _- C7 [7 Y. C% C    当源路径或目的路径的主机名后面包含一个冒号分隔符时,rsync使用远程shell传输;当源路径或目的路径的主机名后面包含两个冒号,或使用rsync://URL时,rsync使用TCP直接连接rsync daemon。
7 F7 F  s+ ]: d/ K3 @    特别的,如果只指定了源路径,而没有指定目的路径,rsync将会显示源路径中的文件列表,类似于使用命令ls -l。6 J- |  u# k% P# g, a4 h' P

- M  D% \8 W, U1 W! G rsync把本地端看作client,把远程端当成server。注意:不要把server与rsync daemon混淆!daemon一定是server,而server却不一定是daemon,也可能是远程shell的衍生进程。
& t0 R5 k3 w* s( F5 c    至于什么是daemon,以及远程shell衍生daemon,下文会有说明。
2 m# ]0 n) s8 i& o6 i$ H/ f% g# }# k3 x9 h) k; _% j: r

% o' I& l! w5 q' O- A7 e    关于rsync的安装:5 P5 p+ J6 r4 `! C" C
    rsync安装方式是最常规的./configure && make && make install,只是要注意:源机器和目标机器都要安装。
' n9 C+ y& Q- H# `- ~0 Q8 Q; w) k: s" j/ }

. a$ Y+ o" j2 O) `$ @) V7 k    关于rsync的启动:, @& ]) y4 d$ L8 H) x) R0 y
    前面说过rsync在进行同步或备份时,有两种途经连接远程主机:使用远程shell,或使用TCP连接远程daemon,可以把它们分别称之为shell模式和daemon模式。只有daemon模式才有启动rsync一说。- J; i& A8 }7 i; z/ q8 s
    如果使用shell模式,rsync安装完成后就可以直接使用了,无所谓启动,也不需要任何配置文件。远程传输时一般使用ssh作为传输工具,当然,也可以使用参数-e来指定一个远程shell。% t# B: [- @4 k2 F8 B
    如果使用daemon模式,就无需远程shell了,但必须在一台机器上启动rsync daemon,默认端口873.# o8 I3 d4 O  A) T% q6 G
3 r! X& j! _" I! v4 O: a
    你可以经由inetd启动daemon,或者作为一个独立进程启动daemon,或者由rsync client通过远程shell启动daemon。
+ m( X% r8 }6 j8 k     1)如果把它作为一个独立进程来启动,只需要运行命令:rsync --daemon即可;+ q, X0 d* r6 H+ ~+ ~5 r/ e" u: G
     2)如果通过inetd来运行,要修改两个文件:/etc/services和/etc/inetd.conf:* m' m6 X& g* f' d( f3 A
      在/etc/services文件中添加如下行:rsync 873/tcp! W9 L7 y% m9 q5 L
      在/etc/inetd.conf中添加:rsync stream tcp nowait root /usr/bin/rsync rsyncd --daemon
0 }& G* ?& p- Z: r) T  注意把/usr/bin/rsync换成你的rsync安装目录!然后重启inetd服务,使配置文件生效。
" h4 G: m" t, w' J% m( o+ Y: e* r1 v3 {- s9 T& P
    关于由client通过远程shell启动daemon,官方文档中有一个条目:USING RSYNC-DAEMON FEATURES VIA A REMOTE-SHELL CONNECTION。
% m  _  a, `! R. ~! x    条目中说,rsync支持这种用法:使用远程shell连接host,然后衍生出一个single-use “daemon”服务器,来读取远程用户家目录下的配置文件。从用户的角度看,通过远程shell连接而启用的daemon传输,它的命令行语法跟正常的 rsync daemon传输是一样的,唯一不同的是,你必须在命令中使用--rsh=COMMAND来明确远程shell程序。如下例:
. s' b% R0 S/ _    rsync -av --rsh=ssh host::module /dest# i: q2 e0 I; h1 `* x* ]
  译者注:虽然官方文档中说这种用法在某些情况下很有用,但我觉得很别扭。
1 Q7 x3 E. P8 R# s; l6 v5 b# g
8 J5 d; f. k" r: Z4 J9 I    当rsync作为daemon运行时,它需要一个用户身份。如果你希望启用chroot,则必须以root的身份来运行daemon,监听端口(1024 以下,默认873),或设定文件属主;如果不启用chroot,也可以不使用root用户来运行daemon,但该用户必须对相应的模块拥有读写数据、日 志和lock file的权限。
3 `8 H) O: K% Q3 f) c5 K    当rsync以daemon模式运行时,它还需要一个配置文件:rsyncd.conf。修改这个配置后不必重启rsync daemon,因为每一次的client连接都会去重新读取该文件。
- j# W: @" v! c& D    译者注:关于配置文件rsyncd.conf的设定,后面会有详细的参数解释。
4 Q- O! N& x7 Q) l* J, K  ^) p2 ~* h* e) K/ N, M
    关于rsync的两种模式:
$ D3 V7 F: Y# M2 j    该部分额外的内容来自IBM官方网站上的一篇文章。该文章把rsync的运行模式扩展成了四种,但我认为rsync官方文档的两种模式的划分更加合理一些。
5 v- y- Y0 o6 V/ J% |4 c    所谓rsync daemon,就是在一台机器上永久运行的rsync进程。在任何一台安装rsync的机器上运行rsync --daemon,则这台机器上运行的rsync就是rsync daemon。我们可以把文件发送给daemon,也可以向daemon请求文件。9 X: ]$ s: A) l4 L- x3 y8 U
    daemon模式非常适合创建中心备份服务器,或项目存储库。
( [6 h8 D7 X1 S. \    两种模式的区别前面已经说过,shell模式在源路径和目的路径中使用一个冒号,而daemon模式使用两个冒号。
7 O8 z3 |* D; F. X8 I. {$ t  d5 ^- R8 ^
& r! i! ]- s$ O& Z% c    关于rsync命令的语法:
9 ~% G. T# Y. f! F5 o# W9 Z# l+ U' \, _8 [3 b
本地拷贝:    rsync [选项] SRC… DEST,在本地进行复制操作 shell模式:    rsync [选项] [user@]Host:SRC… [DEST],拉动作,从远程主机拉文件到本地    rsync [选项] SRC… [user@]Host:DEST,推动作,把本地文件推送到远程主机 daemon模式:    rsync [选项] [user@]Host::SRC… [DEST],拉动作    rsync [选项] rsync://[user@]Host [:port]/SRC… [DEST],仍然是拉动作    rsync [选项] SRC... [user@]Host::DEST,推动作    rsync [选项] SRC...rsync://[user@]Host [:port]/DEST,仍然是推动作4 y, D% P0 V! }, @% K
    官方文档的举例:8 Y5 q7 N+ d# h# g' Y7 L: M
    1)rsync -t *.c foo:src/6 Y1 y% g5 C# c* L4 }( r- I& s. m
        把当前目录中所有以.c结尾的文件传输到机器名为foo的src目录中。如果某些文件已经在远程主机中存在,则跳过该文件。$ i1 E3 C" R' C/ k! G" D% J
    2)rsync -avz foo:src/bar /data/tmp# @" m5 r3 Z7 \
         从机器名为foo的远程主机上把/src/bar目录及其下所有文件传输到本地机器的/data/tmp目录中。注意:源路径src/bar的最后没有斜杠”/”!! ?  A$ Z5 \4 a; y7 [0 g/ L4 \8 i# _4 l
        源路径的最后是否有斜杠有不同的含义:有斜杠,只是复制目录中的文件;没有斜杠的话,不但要复制目录中的文件,还要复制目录本身!
" V* Q5 Y, E9 p3 o        目的路径的最后有没有斜杠,对传输没有影响。. {# [3 `1 J2 z4 P7 c3 p  K( M
    3)rsync -av host:file1 :file2 host:file{3,4} /dest/
& E$ \0 |! D! w         rsync -av host::mod/file{1,2} host::mod/file3 /dest/4 C  }0 |, a6 x" b. A
         rsync -av host::mod/file1 ::mod/file{3,4}
" i9 J; L2 z9 ^0 i( E        这个例子是rsync更高级一点的用法,使用rsync同时传输多个指定文件。
: `7 S0 e* h1 |    rsync可以一次传输多个指定的文件,方法是添加多个远程主机参数,或忽略主机名。如上例。
/ e1 ^$ h/ ~. p
9 i' l3 y: p8 u: ?4 V" X    关于rsync命令中的选项:
. @/ E( T# g1 H$ g: z    上面例子中提到了一些选项,rsync的选项有很多,请参考官方文档。常用的选项如下:( k% w/ p. K: C- X3 e
3 ?: E9 Z. e! s) W" b- {: k( g
-a:归档模式,保持文件的所有属性,相当于-rlptgoD -r:递归模式 -e:指定一个远程shell -z:文件传输时进行压缩处理 --delete:镜像中常用,删除DEST中那些SRC中不存在的文件
, b/ }4 a5 }" R, I  w daemon也有一些常用选项,下面会有介绍。3 k3 ^* z: ?9 Q  ~* l
, ], r! @3 l. J4 L+ ~% [1 t
    client如何连接rsync daemon:
3 X& I9 i  A$ P    上面第3个例子已经给出了client连接daemon的语法示例。但是官方文档又把本条目单独列了出来,提醒我们在连接rsync daemon时要注意的几点:1 ?; f6 b5 f* a( V) _1 g: I
    1) daemon模式中的源路径,即SRC,实际上是模块的名称
1 R7 E" p, y( ?  u9 k' q2 ^( u% K    2) 如果未在双冒号::后面指定源路径,则rsync会列出daemon上所有可能的模块5 \" ~! F! x5 y" k# G& T3 _2 O
    3) 不要使用--rsh(-e)参数
! c6 G- Y1 r+ q4 i# _% T    4) 有些模块可能需要密码认证,你可以使用--password-file选项,来指定密码文件# P1 r8 w, U, k8 ?& O
9 ]4 x+ t5 i, \2 M; `
    启用一个rsync daemon来接受client的连接:
, c  b# e  K% A: w4 p    除--daemon外,rsync daemon启动时还有其它一些常用选项:
8 _3 c- Q2 f3 m+ @4 J    --daemon:
$ o0 a7 W" h) A1 X      使rsync作为一个daemon运行。daemon有两种启动方式,前面已经说过。对client发出的每一次连接请求,daemon会读取配置文件rsyncd.conf,然后做出相应的回应。
7 s* b) ~/ _; a0 d5 r2 y3 {    --bwlimit=KBPS:. x- |) N2 o& M/ @9 Y$ F/ v
      指定daemon每秒传输的最大千字节。client在请求连接时也可以指定一个--bwlimit值,但该值不能大于daemon端的设置。$ f+ j  R1 Z- R' j: t- ~, j7 D9 g  T) G
    --config=FILE:; P& w% X7 q! u; r1 w
      指定daemon的配置文件。只有当rsync以daemon模式运行的时候,该选项才有效。默认的配置文件为/etc/rsyncd.conf,除非 daemon是通过远程shell运行,并且远程user非超级用户,这种情况下,配置文件rsyncd.conf默认存在于当前目录(在$HOME目录 中比较典型)。关于通过远程shell启用daemon,见上文。+ Q$ y0 M% R0 X2 b+ ?
    --port=PORT:
+ p. p3 d) ?0 C" d" c7 t      指定daemon监听的端口。
' Z; X, d  \: J; _6 b& A0 C" i! k/ ?$ V    --log-file=FILE:$ O; i; E9 ?9 ~- G. \
      该选项告诉daemon不要使用rsyncd.conf中指定的log文件,而要使用此处指定的文件。此选项很少用到4 `$ h0 e/ C. C( h4 i/ b1 S

6 c- ]) z" r0 u% ~7 n7 i  K
3 W$ `7 j$ U( B. P5 ~7 {5 J2 K4 C, h5 j* x% c* `; o, E8 Y9 h$ j5 T2 K
rsync 远程数据同步工具详解. _) a% |3 f- C" R: B

! P+ s+ a; t/ |rysnc(remote synchronize)在CentOS系统默认安装在/usr/bin,此外rysnc在windows平台下也有相应版本。主页地址为: http://rsync.samba.org/
. F& i$ j* y" p% x/ v( Y/ i6 j( c# X
rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远 程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。
! B( r; e8 j2 f- U9 X+ T7 H; c
# M5 `0 s; `7 h7 b9 h- F/ ursync本来是用于替代rcp的一个工具,目前由rsync.samba.org维护,所以rsync.conf文件的格式类似于samba的主配 置文件。rsync可以通过rsh或ssh使用,也能以daemon模式去运行,在以daemon方式运行时rsync server会打开一个873端口,等待客户端去连接。连接时,rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份。
9 A; E4 n7 O/ S, Q* h7 |) C$ t8 I4 B4 [* X1 @! e
------------------------------------------------------------------------------------------------------------------------------------------------------------: S" Z9 {) U4 x; b: Q! j

- _1 c7 D8 {) \$ S4 crsync的命令格式可以为以下六种: ; M( a$ b) W; X. P& U3 Y4 L
. w$ e5 r+ Q4 B9 I
  rsync [OPTION]... SRC DEST
+ W7 p% X6 T9 ]  rsync [OPTION]... SRC [USER@]HOST:DEST/ B/ C& \% W) I7 c) T
  rsync [OPTION]... [USER@]HOST:SRC DEST
! W8 e3 [  ]5 K! g  rsync [OPTION]... [USER@]HOST::SRC DEST
' T: m# e8 Q5 b  {8 z/ w  rsync [OPTION]... SRC [USER@]HOST::DEST
+ T* N- j6 \* o7 K! G: t3 y  rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST] $ L& f$ V* p" o9 O$ A" q1 b

$ q% {% d' L3 c) w3 V  对应于以上六种命令格式,rsync有六种不同的工作模式:  u4 S' w+ h% n3 v% i

. \( H8 v, Y8 B& A  1、拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。如:rsync -a /data /backup& c0 g  I6 g  y- |* K* A- x
  2、使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。如:rsync -avz *.c foo:src4 x0 M3 |9 `3 a- o& s
  3、使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。如:rsync -avz foo:src/bar /data
# ~, M$ J1 B# j7 q, ], e! k  4、从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。如:rsync -av root@172.16.78.192::www /databack
: e1 V$ A( {5 n) b; p) E: l  5、从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。如:rsync -av /databack root@172.16.78.192::www6 P* D( w8 P  G, i' ?! h# M& I
  6、列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。如:rsync -v rsync://172.16.78.192/www# t' L5 W9 M& @4 n, N: D2 g
+ ?6 u; b  e" N- D$ D1 o
rsync 命令常用参数 & l8 w' m" [, m  F) i
-a 递归方式传输文件,并保持文件属性,等价-rlptgoD不包含-H
# u# F9 y( z+ i; O' t-r 子目录以递归模式处理
# W" d+ H! R. J3 P6 Y; r-l 保持符号链接文件
/ W3 ^: K. t9 [-H 保持硬链接文件
) s. Z, Q& k* \. W6 L-p 保持文件权限
5 p; Z2 d4 ]) q+ y-t 保持文件时间信息& C) g9 t, P- h& Z
-g 保持文件归属组信息  M1 g, l8 W) B  Q) @2 Y
-o 保持文件归属用户信息
$ `7 g. c( |/ p7 d9 Y: Q-D 保持设备文件和特殊文件
( U" P4 d1 B) K-z 在传输文件时进行压缩处理$ U# E+ s6 _$ J, C0 K0 ?
--exclude=PATTERN 指定排除一个不需要传输文件匹配模式. b- c' J) b' k- Y
--exclude-from=FILE 从FILE中读取排除规则  g0 ?' T2 d0 ]- r! D( [8 ?
--include=PATTERN 指定需要传输的文件匹配模式1 O6 d& o& Y) Y) B
--include-from=FILE 从FILE中读取匹配规则
% L6 ?! l  W" l! I% l" \* S--copy-unsafe-links 复制指向复制源路径目录以外的链接文件) E+ y9 G4 H# y0 s6 C
--safe-links 忽略指向复制源路径目录以外的链接文件(默认)
2 _# b' [8 D; h! y9 N! e--existing 仅更新那些已经存在于接收端的文件,而不复制新创建文件
$ H& W3 E8 b( m4 O) ?+ \- P--ignore-existing 忽略那些已经存在于接收端的文件,只复制新创建文件
5 o5 X- I: B8 B- y! g-b 当有变化时,对目标目录中的旧文件进行备份9 \2 S# V+ o& l( E% _( Y8 U$ @
--backup-dir=DIR 与-b结合使用,指定备份路径$ j3 k, X. K4 @# M3 _* N- s
--link-dest=DIR 当文件未改变时在指定路径创建硬链接文件
) g3 o) |! \, G- s* z% y, g  Q3 J; I--delete 删除接收端还存在而保存端不存在的文件* C3 W" g0 L: ]# l
--delete-before 接收端在传输之前进行删除操作(默认)* c: N( i7 {7 s' c0 g- @2 k
--delete-during 接收端在传输过程中进行删除操作4 \, l' R  o: J
--delete-after 接收端在传输之后进行删除操作; ^" y+ j  d' E% M* y6 s: ~9 J9 ~
--delete-excluded 接收端在传输同时进行删除操作
# j" S1 a, t# e) x3 g--e,--rsh=COMMAND 指定代替rsh的shell程序,例如可以指定为ssh* l8 m* [' e2 _& V
--ignore-erros 即使出现I/O错误也要进行删除
5 u, b) @0 O2 t3 S' T--partial 保留因故没有完全传输的文件,以加快随后的再次传输6 ?$ u2 i- N# b; ?
--progress 在传输时显示传输过程, t: P# h. g3 i2 R5 c
-p 等价于—partial—progress# P, m- u7 V/ X! Q( m2 W% y& o
--delay-updates 将正在更新的文件先保存到.~tmp~临时目录,待传输完毕再更新目标文件
+ Y! g# q9 Y: p-v,--verbose 详细输出模式
( R' i; Y. P+ ^7 a9 Y. V7 z-q,--quiet 精简输出模式
+ u4 i! Q+ @. x1 F1 W: a-h,--human-readable 输出文件大小, H" d7 ]  h+ x$ k: @" ]
-n,--dry-run 显示那些文件将要被传输7 `2 b* [& B( }/ u. `
--list-only 仅列出文件而不进行复制
( o# I# Y+ z! T7 w8 U/ |6 H+ [--rsync-path=PROGRAM 指定远程服务器上的rsync命令所在路径
+ i" N3 N1 }* C2 n) v1 u--password-file=FILE 指定从FILE中读取口令,避免在终端中输入口令
$ P. ^# \. @4 o-4,-6 使用IPv4或者IPv6/ \3 s% o, ]8 q% J3 V! |
--version 打印版本信息
! l0 v0 ^3 C& h! t--help 显示帮组信息# {1 O7 g- b. {. C- @
: P3 B* R: P0 ~0 }
/ e- i3 F* w9 s9 i* S0 O. Z
注意: 若用普通用户身份运行rsync命令,同步后的文件的属主将改变为这个普通用户身份;若用超级用户身份运行rsync命令同步后文件属性保持原来用户身份不变。若指定-tg但目标计算机没有指定用户和组,则复制的文件归入501用户 501组
* g, w0 D" o# U, n! n; b' |1 A
: \+ b4 u* B: K  P8 Y: u------------------------------------------------------------------------------------------------------------------------------------------------------------
6 ]" Y* o. p; X- y) U: q1 d0 I: M# m. |! C- z) c( Y( r
启动 rsync 服务
/ }9 x* A* n- i" d2 w启动 rsync 服务 ; U  C4 U/ u  F9 @7 f
vi /etc/xinetd.d/rsync  把disable = YES改成NO) ]" [  J6 Y( z) k, S
service rsync# h9 w: l' W) j  T( x
{% A6 Y  A' ]3 A( w* U: {1 @6 e' s
        disable = no
. P5 m+ ?) n* G. J5 \        socket_type     = stream+ R+ f5 s  n/ K+ N1 \5 m4 L" Q5 P9 u
        wait            = no/ E5 F/ C+ W. ^* s7 J" ~1 Y$ z
        user            = root$ `( o. V; b0 ~% K( B1 L
        server          = /usr/bin/rsync
1 R9 Y; `2 Q% [( v0 B7 {0 U        server_args     = --daemon
: k1 i( d3 `( g6 w& A& }        log_on_failure  += USERID3 H" c1 E8 r4 H- Z' X9 c
}9 b" |3 v# ]0 N" q

7 W+ V3 C- P6 S2 P+ ?
8 P- y2 a) a$ b: r1 F6 k! |) J4 K4 N9 ~0 X+ n
配置服务端 rsync - m' W5 H3 i1 U. x
rsync 服务器可以独立运行也可以由xinetd运行,CentOS默认以xinetd运行,同时默认监听873端口。需要创建rsync配置文件 vi /etc/rsyncd.conf
# {! i. m: ?  \( l  c在文件中[module]之外的所有配置行都是全局参数,也可以在全局参数部分定义模块参数,模块参数主要功能定义哪个目录要被同步,可以根据需要来定义多个模块 uid = root 7 V9 W$ X: G/ n# j" z
gid = root
# a8 \; X! A4 W6 h7 ymax connections = 10  N1 g0 T$ W+ ^4 w1 G5 t+ n
use chroot = no ) h. b$ p& `  e3 m
log file = /var/log/rsyncd.log / L( o& p- _, E
pid file = /var/run/rsyncd.pid
& D/ o% y/ p* H' [" W6 }; tlock file = /var/run/rsyncd.lock
- i7 @( G6 D* d4 L+ f! y
4 l9 w0 A4 ?% m& s[tongbu]
. X" i9 h. W* D0 L9 c- ?path = /opt/tongbu
, ?5 t$ A9 j) o* B0 i$ [8 o/ @/ Icomment = hello world 8 _7 h+ I+ c' d4 a$ k: ]
ignore errors = yes
. \7 \8 V6 ]$ z' s5 a' }read only = no 1 l" T$ p4 `2 l1 V
hosts allow = 192.168.1.125 * `3 i3 P! d7 {1 X# T! y: o5 w6 Q
hosts deny = *8 ^5 a" q$ p3 \  f2 L7 b9 b
(可以匿名连接,不安全,详细参考以下)% \5 Z5 C( w9 S/ j) V& V; Y
启动并设置随系统启动 rsync,要求 服务端和客户端都启动 ,否则使用的时候报错Connection refused
  Y; X1 q( f2 z  e: h& {
2 u0 P8 |7 t, j% k% U
' [% W* s0 [; ursync --daemon –-config=/etc/rsyncd.conf
/ a7 Z4 v) U: h$ Wchkconfig rsync on  ^4 N8 Z2 A; _  J( Y) T; {! x

% s$ V! |. K- S" X9 p6 `; ~7 q) U0 L
------------------------------------------------------------------------------------------------------------------------------------------------------------
, {& y  ]) B+ E( S3 L" R$ i; ~
2 d- H- R2 p: {5 h/ r5 v; x! y全局参数
: U  x0 k3 B  e; f( Daddress 指定的服务器运行的IP地址。由xinetd运行时将忽略此参数
/ _" V6 c" c! `9 h/ M! o# L" ^port 指定rsync守护进程监听端口号(默认873)。由xinetd运行时将忽略此参数! y; `& W& Y0 i0 q% O* m
motd file 指定一个消息文件,当客户连接服务器时该文件内容将显示给客户9 c; @; k4 F: \/ W  E3 H1 F
pid file rsync的守护进程将其PID写入指定的文件
/ R- M+ a2 e) {; k; T+ d- hlog file 指定守护进程的日志文件,而不将日志发给syslog
8 B2 e% M1 Q# n+ _% ]; f: Csyslog facility 指定发送日志消息给syslog时的消息级别7 U" [3 G  s# c4 b
socket options 自定义tcp选项$ }) `/ L6 z0 O: Y0 d- ^( Y
9 J# U- R+ N/ e: t
基本模块参数
! r/ G* ^. Z* C  rpath 指定当前模块在rsync服务器上的同步路径,必须指定& i: x1 l0 z8 ]4 p( d, A
comment 给模块指定一个描述
/ N+ V; g, v& r0 G4 M( K" D控制模块参数4 N+ I3 O5 }' m# |6 m8 E5 ~
use 默认为true,传输文件之前先chroot到path参数所指定的目录下,这样做实现额外的安全防护,但缺点需要root权限,并且不能备份指向path外部的符号链接所指向的目录文件/ H9 R% ?# a1 A" @7 _
uid 制定该模块已指定的UID传输文件
" k0 J/ B4 M2 F0 q3 Qgid 指定该模块已指定的GID文件# Q  n2 h+ G4 p6 @6 j. N0 d
max connections 限制最大连接并发数以保护服务器,超过限制则提示稍后操作
- Z5 F9 V5 P- c5 g8 |! hlock file 指定支持max connections参数的锁文件,默认/etc/run/rsyncd.lock
" P4 S$ V5 Q3 b; S4 |8 |9 ^list 指定当客户请求列出可以使用的模块列表时(默认ture),该模块是否被列出。如果false,可以创建隐藏的模块7 H4 A8 i' _8 ?* l; L7 g; V/ l
read only 是否也许客户上传文件,默认ture则不也许上传。为false并且服务器目录具有读写权限则允许上传# M: O( y, Q7 Z; q7 w: A6 g
write only 是否也许客户上传文件,默认ture则不也许下载。为false并且服务器目录具有读写权限则允许下载2 v( d. |2 t0 n
ignore errors 指定rsync服务器在运行delete操作时是否忽略I/O错误
! \  Q" Z) n8 g% lignore nonreadable 指定rysnc服务器忽略那些没有访问文件权限的用户( A# Z. [. k" p) K& \( M( X2 R: `
timeout 设定连接超时时间,单位为秒! A4 y$ Z; O# H
dont compress 告诉rysnc那些文件在传输前不用压缩,默认已设定压缩包不再进行压缩
: n/ d! b* A+ V* w5 Y6 Urefuse options 定义一些不允许客户对该模块使用的命令选项列表
4 B/ `* y3 M6 i8 S0 ]; J/ w) {/ E文件筛选模块参数 7 d# \- t- K  B7 M
exclude 指定排除的多个文件或目录,由空格隔开
, O2 e+ y$ Z# texclude from 从指定文件中读取排除规则, \8 H& N! P* [: c9 `, l& ]+ t2 R
include 指定包含复制多个文件或者目录,由空格隔开3 @3 n8 [* N5 ]+ V+ F
include from 从指定文件中读取包含规则
7 M$ g2 T5 t9 O/ l; q& @' C5 ?用户认证模块参数 - z$ A& Q& B$ G: y0 J$ {! Y( J
auth users 指定用户才允许连接该模块8 l7 o" F0 @3 C4 x3 {
secrets file 指定一个口令认证文件,格式是 用户:密码,即指定用户和密码连接匹配才行,不匹配的话会提示ERROR: auth failed on module,不设置该参数则可以匿名连接。 % r; i- A3 O0 ?; w4 Q0 l7 C. @
strict modes 指定是否检测口令文件权限。rsync认证口令文件权限一定是6001 W2 v1 h* V1 ~2 t" F
访问控制参数 5 X/ e5 Z/ e9 M. e$ t
hosts allow 指定哪些IP可以访问该模块
. G' \4 ^7 R/ J5 D+ O% q: a: A1 {hosts deny 指定哪些IP不可以访问该模块,*表示全部2 W. p) w! u1 b' O& S1 Z9 s

; ?5 X$ R6 q9 ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 01:58 , Processed in 0.024408 second(s), 24 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表