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

Ubuntu下 rsync同步文件实例

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2016-8-29 13:50:37 | 显示全部楼层 |阅读模式
Rsync(remote synchronize) 是一个远程数据同步工具,可以使用“Rsync算法”同步本地和远程主机之间的文件。
" Q! w4 G( z! f! Y" V( A/ A# S7 y7 wrsync的好处是只同步两个文件不同的部分,相同的部分不在传递。类似于增量备份,
8 Z: p% d, }# L) _这使的在服务器传递备份文件或者同步文件,比起scp工具要省好多时间。4 z% v1 x" C6 P% F
OS:ubuntu server 10.04) h  T$ G/ V9 M9 Z( o" i9 p* O3 m" k
server:192.168.64.128
2 l7 f4 l- n3 r% B  Fclient:192.168.64.1455 n) I  ]" M) F8 S7 Y
server! s2 Z; o# O. p
1.ubuntu  server 10.04默认已安装rsync,rsync服务默认不是启动的,我们要修改下面的文件。
& N) G0 H  [  w/ T! [$sudo vi /etc/default/rsync: X/ g- H* Q9 P. K
RSYNC_ENABLE=true   #false改true
6 @* x4 K% T. Q& E2.修改配置文件
- _7 L6 I1 Y9 b' [4 N- h" F$sudo cp /usr/share/doc/rsync/examples/rsyncd.conf /etc   #已默认安装的软件,默认不启动的似乎都要这么做
" i% `  @. U; |我们先来查看一下这个文件5 F6 G$ Z' Y% n+ G' I
$sudo cat /etc/rsyncd.conf6 ~3 @3 |3 L7 |0 T2 ~' y3 j- P9 ?
5 `; X( P- o1 F
# sample rsyncd.conf configuration file/ p/ |+ n5 v4 i6 H
+ w6 i9 _* e: |' l
# GLOBAL OPTIONS' T' _  p6 X9 ^$ r# X

  [& N' Z  n+ N) r( y. B#motd file=/etc/motd #登录欢迎信息
, w: n4 U# ?9 Z) K+ g- Z0 x5 r5 ?1 S#log file=/var/log/rsyncd #日志文件9 E$ p! {" P1 O  N" p: O1 J( u
# for pid file, do not use /var/run/rsync.pid if4 {" o4 e) N6 P5 l$ o- \
# you are going to run rsync out of the init.d script.
& h7 Y" [. k, r# O3 fpid file=/var/run/rsyncd.pid1 z6 l5 C; t9 i. K, d7 F8 T

2 N) ?, E5 D% j4 \. s$ _9 x#指定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。4 Z9 R" l; i* O: N& i; S6 H* O8 {
#syslog facility=daemon
  G  H% N/ q5 t5 z0 ^+ G
  D4 U3 b$ u* K) Y/ \9 y#自定义tcp选项,默认是关闭的  ?3 S0 K/ I* s. [. l/ e
#socket options=1 N" C9 O1 Y/ `/ W

$ T6 f7 A1 y' Y7 J#以下是模块信息,我们可以创建多个模块
) s& d% A0 A% w/ P2 J* V$ H7 z; J# MODULE OPTIONS% k7 e( S0 ^6 E& x4 c+ {
7 i+ x; U& n7 s. G, }
[ftp]
% H2 C' c% F5 h1 X
3 K% C) Q, C; j2 H: y  K/ _5 V9 `        comment = public archive #模块描述' p( v) |& S( |) w
        path = /var/www/pub #需要同步的路径
  l) o& p4 W# ?! _# C, K% q, ?        use chroot = yes #默认是yes|true,如果为true,那么在rsync在传输文件以前首先chroot到path参数指定的目录下。这样做的原因是实现额外的安全 防护,但是缺点是需要root权限,并且不能备份指向外部的符号连接指向的目录文件。
* X  [5 B2 O9 [#       max connections=10 #最大连接数" E7 Q9 i" _/ d6 `, g. h
        lock file = /var/lock/rsyncd #指定支持max connections参数的锁文件。
( F1 y8 q6 s% U4 s7 V$ `, m# the default for read only is yes...
( G  U7 i/ P% h: U# M2 |        read only = yes #只读选项& w  `0 a5 |0 `
        list = yes #客户请求时可用模块时是否列出该模块+ E) m/ r+ e0 ^3 N* B# M: P; W
        uid = nobody #设定该模块传输文件时守护进程应该具有的uid
- w$ t  G; b2 k. o9 Q7 S, D( c  `        gid = nogroup #设定该模块传输文件时守护进程应具有的gid,此项与uid配合可以确定文件的访问权限
8 k( Y3 {# }, q: i& I. Q#       exclude = #用来指定多个由空格隔开的多个模式列表,并将其添加到exclude列表中。这等同于在客户端命令中使用--exclude来指定模式,不过配置文件中 指定的exlude模式不会传递给客户端,而仅仅应用于服务器。一个模块只能指定一个exlude选项,但是可以在模式前面使用"-"和"+"来指定是 exclude还是include    #这个我的理解是排除目录中不需同步的文件# f7 |+ H: d0 Z, A/ q' f7 L% ]
#       exclude from = #可以指定一个包含exclude模式定义的文件名9 F! w# |$ n5 A% F4 a& a
#       include = #与exclude相似
# {/ ?) a& S9 g- r3 c7 `* Q% X#       include from = #可以指定一个包含include模式定义的文件名
2 z# k# i: ?  R  [! y#       auth users = #该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的 challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)
* l7 P% W( z2 M7 ?4 v#       secrets file = /etc/rsyncd.secrets #该文件每行包含一个username:password对,以明文方式存储,只有在auth users被定义时,此选项才生效。同时我们需要将此文件权限设置为0600' h# h, O; f0 V+ m
        strict modes = yes #该选项指定是否监测密码文件的权限,如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认值为true
2 [; D! x" u$ j  Q) {#       hosts allow = #允许的主机
' }" j% m. h7 |+ ~# a; U* a#       hosts deny = #拒绝访问的主机
# h: R5 a( S/ x* J9 z1 V        ignore errors = no #设定rsync服务器在运行delete操作时是否忽略I/O错误
* V$ A& n, _% }3 ?( [5 y/ h        ignore nonreadable = yes #设定rysnc服务器忽略那些没有访问文件权限的用户
" O. S! h3 S9 A. c        transfer logging = no #使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中+ r% @! J2 F$ ?, E
#       log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes. #设定日志格式
& @* ^, }5 X; x! w        timeout = 600 #超时设置(秒)3 @6 R+ b% F  j3 x* Z8 E
        refuse options = checksum dry-run #定义一些不允许客户对该模块使用的命令选项列表) o4 B/ Q" i* j
        dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz #告诉rysnc那些文件在传输前不用压缩,默认已设定压缩包不再进行压缩
' i7 U# p  E+ w: Y, X# J
$ j& _+ }. E& _% ~, l9 h% ?3 f
$ k. n8 I/ i8 l( d' t5 D4 J日志格式选项列表:" C4 x/ E9 E$ M; O
%h:远程主机名  W5 a: n, Y5 ^6 n* y0 o
%a:远程IP地址
, N4 X; x: d: L- B3 A+ m% t%l:文件长度字符数
0 _9 Y5 ~( X6 Q9 r: m# p) a, q* R%p:该次rsync会话的进程id' h6 T0 u( p" v1 s% z" t
%o:操作类型:"send"或"recv"、”del.”
9 W1 L& H' r; ]: d) p%f:文件名
! w, l% ^* a1 A4 y# i%P:模块路径  J% c. d, ?- @  r7 u
%m:模块名( Y' a; I) z; G4 T- V2 L
%t:当前时间' F$ D* U2 u& Y
%u:认证的用户名(匿名时是null)) }1 l8 O# f1 d  l" o
%b:实际传输的字节数
" V  R$ k) r( N4 @6 g%c:当发送文件时,该字段记录该文件的校验码# p7 J6 M) Q0 u6 B4 O( p  H. d

) L( j# Y+ B$ j+ ]! ?: U) Q5 \下面我们来定义自己的conf文件" y0 m# {* q% T, U
2 D$ f4 X) Z* ?; e7 _, w/ ?$ P
# sample rsyncd.conf configuration file
$ K. s! K( f( ^6 E4 q" U, I# GLOBAL OPTIONS
/ W. A+ M, p: K4 V* Z' e& r#motd file=/etc/motd" b7 n5 E* H3 T: B) G- r
log file=/var/log/rsyncd# w- V' i- d% W, s8 A5 `
# for pid file, do not use /var/run/rsync.pid if% i5 H# K4 T( d) ]
# you are going to run rsync out of the init.d script.' u( P. U" [- Q) y
pid file=/var/run/rsyncd.pid
6 s' I& [" e$ `syslog facility=daemon' \9 {) M% b2 h' N, g
#socket options=
! A9 m; \0 L8 H# MODULE OPTIONS# h1 K3 f3 F6 M* V% m. Q
[my_rsync_bk] #名字可以任意命名,只要客户端的rsync命令一致
; K7 V0 ?8 m+ E! ^8 u        comment = public archive, L3 e& H$ I/ E$ ^
        path = /home/rsync_bk                             #指定路径,如果没有这个目录自己建。4 l/ ?+ \6 T& N
        use chroot = no
- L' f4 ?% m6 `9 B# ]6 h) v#       max connections=10- |; ]4 ?% D! J
        lock file = /var/lock/rsyncd
5 m: ]. k9 }/ C' g; v8 j. D5 w# the default for read only is yes...& k# z7 k. U  a
        read only = yes
  ~, S/ a+ B, I0 C        list = yes. s/ Q: u: H  D9 X
        uid = nobody9 I6 J9 Y0 f* d
        gid = nogroup4 n, K1 [  ~" A" Z8 w
#       exclude =
' U, p$ {7 T. Q; c! T#       exclude from =
  V3 u3 j% X  o9 B6 ?5 d9 O6 u#       include =
* Y/ Z4 h  f, W! [#       include from =% t2 _4 X* D. x. V9 p
        auth users = liu_rsync              #rsync连接时的用户名,要和客户端rsync的命令一致! a8 Y. P! g5 F: q* \8 C6 o0 n
        secrets file = /etc/rsyncd.secrets #这里是保存密码的地方,如果屏蔽掉就不用密码了
3 q& k( p+ ~7 W1 _& e- i9 [        strict modes = yes5 @- D2 C3 h) g
        hosts allow = 192.168.64.145 #运行的客户端ip/ l( t5 ?7 _) N& n9 P& o' `
#       hosts deny =. C0 B  l: ]2 V" N9 i* |
        ignore errors = yes( m" K% r: h- l8 Q; y( e
        ignore nonreadable = yes
% H! u% Y9 o' A) ~1 |. B        transfer logging = yes
; U/ ?% g' F4 B% z7 a        log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.
; u' P& |. A: D3 u* W: _- j        timeout = 600  I2 v) Q) F# K  \9 v6 J. |
        refuse options = checksum dry-run
, l* h4 z& c5 L. @        dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz
; r0 n  F' o2 i5 @/ K  P3 g& S# p: q/ z- x
% l' R0 Z  t4 `* D) a. s( Q
创建一个密码文件. m$ I$ C9 v3 k5 ^/ z8 D& |  x& x
$sudo vi /etc/rsyncd.secrets4 ?7 g  P; z6 ]8 d$ b9 B
liu_rsync:123
7 Z8 J4 s6 H8 ~( y( L6 O+ t* O: \$sudo chmod 0600 /etc/rsyncd.secrets    : l6 I( c! I5 b/ w8 p* F( \

  W$ q7 C4 z+ }启动rsync1 H0 i9 k, k, p' z( V: Q% d
sudo /etc/init.d/rsync start5 W$ O5 J: f8 y' S' B1 L
% r3 M8 A/ V# l' k& |
client
  n8 D( c* S- n* r+ Z( B我们再来看一下客户端的操作,一般客户端不需要进行特殊的配置,直接同步即可1 K; V" a2 U% C3 u
rsync -vzrtopg --progress  liu_rsync@192.168.64.128::my_rsync_bk .  #.为当前目录,在服务端touch一个文件,同步后就会出现,当然你也可以指定一个位置比如/databk,需注意所建立的权限!9 r% d: }! A7 y" z
. N. }  ?1 M& {
我们把这个同步工作交给crontab去执行。首先我们要创建一个密码文件
8 h! q4 ^4 B- Q$sudo vi /etc/rsync.pwd输入123,保存     #密码要一致
5 s; |+ f0 x4 I% g+ A1 }; Z$ b  j$ T+ F) V- ~  R- K
!注意:下面这两步操作是必须的,没有足够权限同步就会不成功,ls -l 你所指向的目录
/ s- M' f' h4 g6 ~5 N& xsudo chmod 0600 /etc/rsync.pwd
- a) W% R- o: F0 K8 V! F8 V7 D' Asudo chown 普通用户:普通用户组 /etc/rsync.pwd
: |6 @  q. J+ S
% `" _) E! \, n1 B1 {- r! z然后我们打开crontab,使它自动同步
3 ^5 M' }) a) v3 r6 X$crontab -e! A% c2 L* e/ x
* * * * * rsync -a --password-file=/etc/rsync.pwd liu_rsync@192.168.64.128::my_rsync_bk /databk   
! U# S2 J- S4 \# z9 r% hcrontab随机启动  sudo vi /etc/rc.local2 Q0 p! w6 i/ F$ i3 ~4 Q
参数说明:1 V0 o" ?- e9 ]8 p- J
-v verbose,即详细模式
7 w$ b* W" S4 G: ^9 t-z 压缩! L, Q% Q& D' A+ q7 M" m0 R+ h
-r recursive 递归7 |( R9 s2 T+ r$ b$ A$ }$ L+ v9 k
-topg 保持文件原有属性,一般不用加* w0 d; e2 v$ I" v
--progress 用来显示详细进度情况1 p; j1 L% H7 C* x
--delete 表示如果服务器删除了一个文件,客户端也应对应删除
5 a1 p8 w, b0 Q$ E, L! u--exclude="*.sh" 表明不包括某些文件
& d- D4 d/ F9 H: J4 x6 O--password-file=/etc/rsync.pwd 指定所使用的密码文件
4 Q* Q( t; ^  l. ?6 Y8 ]& U最后一项是需要同步的目录  
* I# J, b0 c# j& `% Y  c3 D+ }$ Y注意指定使用的密码文件中只需要有密码,不要有用户名。
- a, X# E9 X6 ], \: B------------------------------------------------------------------------$ @  F* \, A1 n$ W1 O: b6 I% ?" d9 P
1.在本地机器上对两个目录同步" M* @5 |# }8 \5 [
$ rsync -zvr filename1 filename2
, r3 B8 \1 P  T8 s5 [' e+ B
% }' q# u/ f5 i1 b上述代码是将filename1中的文件与filename2中的文件同步,如果将filename2中的文件同步到filename1中,修改代码为:
: _8 p0 I% N6 |6 ]1 d# P$ rsync -zvr filename2 filename12 Q% _9 D3 R; {
  E5 u8 M3 Z5 n& ?  m
2.使用rsync –a 同步保留时间按标记
: r* W& g# ^7 D  B  H% K$ rsync -azv filename1 filename2
- i$ ]; R( {- E2 G! f( ~+ @
; ^5 s4 K# k2 O+ A# R* i使用上述命令,将filename2中新同步的文件的时间与filename1中的创建的时间相同,
: D* Y1 H( c1 Z- y  c. S. d它保留符号链接、权限、时间标记、用户名及组名相同。+ L( q% H5 w2 ]2 ~$ t9 t
3.从本地同步文件到远程服务器
8 r2 F% V: h7 x/ X# Y+ p4 j3 p$rsync -avz filename1 ubuntu@192.168.0.1:/home/ubuntu/filename2
3 X# H- v* S1 m3 E! }  o0 W0 G' A. `
上述命令是将本地的filename1同步到远程192.168.0.1的主机上。8 \1 O! s6 @* J6 u
注意:如果远程主机的端口不是默认的22端口,假如是3000端口,上述的命令修改为,
. y  x, R% f- [" B$ rsync -avz '-e ssh -p 4000' filename1 ubuntu@192.168.0.1:/home/ubuntu/filename25 l; l' u* c5 d9 m1 r. H
  V# X9 t/ P% P
4.将远程服务器的文件同步到本地: S- L! G6 i. J2 u6 y3 V8 B9 ]
与步骤3类似,只是将filename1与远程服务器的位置对换一下,& Z6 U/ T1 L. B, p6 h
$rsync -avz ubuntu@192.168.0.1:/home/ubuntu/filename2 filename1
+ _+ k: D( y; b( i2 A! l4 h. x) `. ~
同理如果端口不是22,使用以下命令4 x  ?( Y; d% k4 ]# {. M
$ rsync -avz '-e ssh -p 4000' ubuntu@192.168.0.1:/home/ubuntu/filename2 filename1
$ _: z! y1 v6 m/ M  W* n4 R$ V+ t) S8 Z9 f2 V5 d; L
参考:http://www.eduicc.com/read-24.html
" G  Q9 G- S, a% G# K           http://jordy.easymorse.com/?p=273
* \3 s+ T, r* w5 ~( v! E. _3 M9 m& E" {
( _; G# }5 {/ Y7 h0 r3 M" O+ d
  C( W& D" s2 p
# o0 D' v) U0 J' U
服 务器之间常常要保持些文件或目录的一致,比如一些大的软件下载网站,它们通常使用多台服务器来提供下载服务。当一台服务器上的文件更新后,其它的服务器也 需要更新,而且 在更新的时候应该是只对新增或是修改过的文件进行更新,否则会造成网络带宽和时间的浪费。rsync就是能有效的保持文件及目录的一致的 优秀软件。
+ h" s5 I2 g1 f6 c' Y  rsync,remote synchronize
# A6 H! c- h7 F7 B/ o" T7 W* N! e  顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息,而且可以通过ssh方式来传输文件,这样其保密性也非常好,另外它还是免费的软件。rysnc的官方网站:http://rsync.samba.org/,可以从上面得到最新的版本。当然,因为rsync是一款如此有用的软件,所以很多Linux的发行版本都将它收录在内了。你的Linux里并没有安装rsync,你可以按以下的安法自行安装: 0 }' Y2 a3 d  m; u
  一、安装过程* z% W: N0 Y& a  Q3 S) O8 ^
  1.下载rsync
+ ^2 L( [3 j/ G6 [: y/ J5 u  目前(2003年9月)最新的rsync版本是2.5.6,从rysnc的官方网站上下载一个回来:
' U3 ~! O2 _5 ^# P& y  # wget http://ftp.samba.org/ftp/rsync/rsync-2.5.6.tar.gz
- {: o1 ~) T  |9 o% y- m# F4 p* X" @, @0 B" |7 G
  2.解压3 E: M" Z# Y* G' ^8 |3 S  l
  # tar -xzpvf rsync-2.5.6.tar.gz: P! y% S. F. z3 [3 e
: \/ S5 L6 X3 U7 @3 q/ y% h5 V
  3.编译安装
+ \# r$ N$ r) d3 \# h  # cd rsync-2.5.6/  v0 ~* C9 U; M' j) M
  # ./configure --prefix=/usr/local/rsync! s" R( _: k$ n7 g- p
  # make; u, `: P5 D1 C, ?. ?
  # make install
9 a+ }# {- u8 t' f8 L  以上过程没有出现的话就安装好了,现在就有rsync命令可以用了,rsync命令放在
6 {0 k0 e/ t6 Y7 n! V# o; Y/usr/local/rsync/bin。用rsync命令可以去运行有rsync服务的服务器上抓取资料。
' F1 b# {! ?$ f% Y  如果要把当前的机器变成一台rsync服务器的话,就需要继续进行一些配置了。
. w- z4 D4 O2 N7 p5 \' I6 @0 F0 |# A  G1 t  }+ f
  二、配置rsync服务
! s2 k5 O1 e- ]/ J, E6 C  配置一个简单的rsync服务并不复杂,你需要修改或建立一些配置文件。
5 U: ^% l: w, b3 r3 G  1.rsyncd.conf7 ~# v; k: [. c! |# i' @: {+ Z
  # vi /etc/rsyncd.motd
/ i; B9 R" C3 _+ U& ?5 q, c  rsyncd.con是rsync服务的主要配置文件,它控制rsync服务的各种属性,下面给出一个2 w) |5 f/ z* @4 {/ V; b
rsyncd.conf文件的例子:
+ ]4 \- u9 _3 S  #先定义整体变量
, m: o% h% o5 r  Q  secrets file = /etc/rsyncd.secrets
1 y- e2 o! I' y4 c, o  motd file = /etc/rsyncd.motd
3 ~7 s' I, _3 U. S. j  read only = yes: v2 D/ L+ @+ H8 b+ X
  list = yes
9 Q1 y: W7 B+ L6 Z* q+ \9 |  uid = nobody
' j- `8 Z' k4 l. b! R) z6 V! I  gid = nobody
2 r0 b) v! f: G2 r  hosts allow = 192.168.100.90 #哪些电脑可以访问rsync服务8 p# I. ]* t- E; C
  hosts deny = 192.168.100.0/24 #哪些电脑不可以访问rsync服务
% S. ?1 g: t" {6 M  max connections = 2
- j4 ^( E; g. }+ t1 o8 v  log file = /var/log/rsyncd.log$ K: A( K" V1 f% @: ]; c
  pid file = /var/run/rsyncd.pid
- e; L' i: b# _+ O, t2 o, A  lock file = /var/run/rsync.lock
" P! p2 k# s4 E5 V/ D. m$ |* Q& d  #再定义要rsync目录
& J* _3 F' s  S5 {  [terry]) q  p" R& T7 q. w: ~% [
  comment = Terry 's directory from 192.168.100.21, o7 t! E1 ]; ^5 S& {* m0 e
  path = /home/terry
* @! {1 v* h/ ]- L  auth users = terry,rsync
0 Z6 h( P  K% Y( a! k4 [4 Q9 `5 O/ n  [test]( [% ^/ ^7 g  |  p- g& e& y
  comment = test rsync1 l3 S# @5 |2 N& d* F0 j4 F- P
  path = /home/test
) `6 Z9 C% E( Y: p+ S' Z; [   在上面的配置文件中,限定了192.168.100.0/24这个子网中,只有192.168.100.90的机器可以来访问这台rsync服务器的 rsync服务。配置文件的后面部分定义了两个rsync的目录,terry目录是只有知道terry、rsync两个账号的人才能使用的,而text目 录是无需账号就可以访问的。rsync在定义目录时还提供了一些其它选项,可以作更严格的控制。
8 H7 g2 r, e1 A1 [! I8 z9 ?+ z  M* E) V$ v
  2.rsyncd.secrets
9 m+ w' g$ n. E9 i2 w3 p4 R  # vi /etc/rsyncd.secrets& |  n  O! A1 s" p
  rsyncd.secrets是存储rsync服务的用户名和密码的,它是一个明文的文本文件,下面给出一个rsyncd.secrets文件的例子:
" P2 P; u/ B) h  k: v2 m% v  terry:12345
* b& z* v( Q: d! x( Y) Q& \  rsync:abcde
  m' O5 ~$ k5 G# i7 @* ^7 R+ R6 }4 {  因为rsyncd.secrets存储了rsync服务的用户名和密码,所以非常重要,因此文件的属性必须
" \: X. ^4 y. |4 I设为600,只有所有者可以读写:
; @! [2 G: z/ h( K& A  # chmod 600 /etc/rsyncd.secrets
3 f, F, Q1 s) E+ u$ {& G, K/ u9 S$ D. T! D2 @8 g! w
  3.rsyncd.motd
9 m: T3 X* U- x! A9 E' G% W  # vi /etc/rsyncd.motd+ \# m# k) g0 }4 V4 O& u5 o
  rsyncd.motd记录了rsync服务的欢迎信息,你可以在其中输入任何文本信息,如:
/ @2 M5 ~* q2 u0 |4 T9 Z, O  Welcome to use the rsync services!
1 I3 c# z% p8 K2 `! l/ J
  i: B) h' q$ r7 D  4.services8 H0 \( W8 }4 A+ p2 a
  # vi /etc/services7 J% M  G. B  J* k: E
  services并不是rsync的配置文件,这一步也可以不做。而修改了services文件的好处就在于
, d- E7 O. U! q/ l, W系统知道873端口对就的服务名为rsync。修改services的方法就是确保services中有如下两行,8 I) t, t1 W  }
没有的话就自行加入:- r0 ]) m, N  n- |4 B
  rsync  873/tcp  # rsync3 B& f. P% Z/ Y7 u% ~
  rsync  873/udp  # rsync
; h4 r# c. }+ e  5./etc/xinetd.d/rsync
0 Q; D+ K8 A1 {9 {. `  # vi /etc/xinetd.d/rsync: S( }# m, i% U
  建立一个名为/etc/xinetd.d/rsync文件,输入以下内容:
4 v9 V2 F7 y5 l7 V  service rsync
6 V1 u& ^' O1 {/ ~* c5 l1 H  {6 H; q0 f. }' t5 r3 U0 F
    disable = no
: X! I- g$ d! t+ S    socket_type  = stream) l3 R1 h, [5 r& }8 u: _+ O9 Y
    wait      = no6 R4 J9 }/ l8 y* A# v& M
    user      = root
6 n7 U  M0 n9 T1 l# G    server     = /usr/local/rsync/bin/rsync
" J+ t: m2 u3 \4 X    server_args  = --daemon
% ~* N# I2 a! n4 G* L% m5 z    log_on_failure += USERID
- e6 W2 J3 A3 I! \6 p/ n1 r  }3 |5 i3 e6 c6 i% Y. \
  保存后,就可以运行rsync服务了。输入以下命令:5 b3 K1 z# d( }* ^; J  P4 N; v) m
  # /etc/rc.d/init.d/xinetd reload
; d5 J! V% V3 R0 m+ P0 `- r# G  这样rsync服务就在这台机器上(192.168.100.21)运行起来了,接下来就是如何来使用它了。
7 U5 \7 h! K. _5 A
" ^* H+ Y$ \& |  三、rsync命令的用法
( C- L+ s# P. D6 ?* j: X  在配置完rsync服务器后,就可以从客户端发出rsync命令来实现各种同步的操作。rsync有很. d# _1 Q8 W6 x7 s
多功能选项,下面就对介绍一下常用的选项:. [, L, V8 P$ \/ {% G7 _
  rsync的命令格式可以为:) y, V  G' x# K
  1. rsync [OPTION]... SRC [SRC]... [USER@]HOST : DEST]
9 i3 ]9 u& ]: T. B! l* ~  2. rsync [OPTION]... [USER@]HOST:SRC DEST]
+ o3 R' _7 k& I4 M6 V  3. rsync [OPTION]... SRC [SRC]... DEST]
* h- o: y/ c. w$ \+ [8 L: p! f0 L  4. rsync [OPTION]... [USER@]HOST::SRC [DEST]2 Z  J1 ?/ p( [/ S& ?" M& L
  5. rsync [OPTION]... SRC [SRC]... [USER@]HOST :: DEST]
) b7 l' ^6 v6 F2 O, G9 G9 v0 r4 B  6. rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]. t' p; N5 ~: p/ i+ D) m

- k3 L9 q4 C* h6 u# B$ P  rsync有六种不同的工作模式:* ?* _4 Q6 C' @0 v5 p
  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。! d+ f" Z3 o7 q+ o
  2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST! @$ B  Z+ d% v, \- H
路径地址包含单个冒号":"分隔符时启动该模式。
* t2 E- Q0 m8 o/ G& |  3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC+ f! s/ e0 P( [3 t* w
地址路径包含单个冒号":"分隔符时启动该模式。
3 y+ E: f* r' C- k  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
; B, T6 X8 {: f) }6 K# G! G4 b  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。# b9 U0 p" i7 H# l5 @. R
  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。# M8 [7 w2 Z- \6 F- S
  下面以实例来说明:" p) _' F: P" P; G
  # rsync -vazu -progress terry@192.168.100.21:/terry/ /home
1 K$ S9 c4 e2 k  v详细提示3 L/ a, Y, B. R
  a以archive模式操作,复制目录、符号连接
6 D  ?/ `( W) j! l+ r' X1 F# ]  z压缩
# c( p! B6 D, r  u只进行更新,防止本地新文件被重写,注意两者机器的时钟的同时# S" ^2 E7 w: k- @% t- h
  -progress指显示
& Z, U3 q& \9 Y$ o9 V' r  以上命令是保持客户机192.168.100.90上的/home/terry目录和rsync服务器上的terry目录同
% h  ?' y% w0 ?! b# k9 Q' I步。该命令执行同步之前会要求你输入terry账号的密码,这个账号是我们前面在rsyncd.secrets
- r7 I. _9 a( E* I文件中定义的。如果想将这条命令写到一个脚本中,然后定时执行它的话,可以使用--password-file
; n# h$ z; H1 @; [  D选项,具体命令如下:
" r7 a( s1 }, Q' ]/ t  i' `  P# V& L8 F  # rsync -vazu -progress --password-file=/etc/rsync.secret  e+ H3 s. \) n
  terry@192.168.100.21:/terry/ /home# z6 a( _) a4 d9 m2 z, ~0 t3 o
  要使用--password-file选项,就得先建立一个存放密码的文件,这里指定为/etc/rsync.secret。
, C; f. R- C+ i: W: c! l8 i$ E其内容很简单,如下:$ b: x) R- V* Y# o2 \
  terry:12345; ^8 p2 a* t% @% g
  同样要修改文件属性如下:# K, ?3 K) d! }( f0 E$ B/ c" ~! ]  ]
  # chmod 600 /etc/rsyncd.secrets
% Q4 f5 @8 G- {7 m( o6 d7 P5 U, w  K/ ?  ^/ p
  四、利用rsync保持Linux服务器间的文件同步实例
! S- }6 Q4 j3 @  r8 T* s- p  现在假设有两台Linux服务器A(192.168.100.21)和B(192.168.100.90),服务器A中的
; @2 K# K/ B) U" N& n5 I/home/terry和服务器B中的/home/terry这两个目录需要保持同步,也就是当服务器A中文件发生( E. _; r* ~# Z
改变后,服务器B中的文件也要对应去改变。& E8 X: g! Y$ a. O
  我们按上面的方法,在服务器A上安装rsync,并将其配置为一台rsync服务器,并将/home/terry1 g' S$ y/ n& d8 i, _7 e
目录配置成rsync共享出的目录。然后在服务器B上安装rsync,因为B只做客户端,所以无需配置。
4 V& j% c" d& @$ Y然后在服务器B,建立以下脚本:
1 ~% C' }! s6 G0 C/ f5 l/ p7 K  #!/bin/bash
/ D5 ~. V, B0 g# ^3 A$ I" u  /usr/loca/rsync/bin/rsync -vazu -progress --delete
# s# f8 b+ |2 y. P0 X  --password-file=/etc/rsync.secret terry@192.168.100.21:/terry/ /home
8 [# Y1 p- X7 d$ _5 a- @; y# ~  将这个脚本保存为AtoB.sh,并加上可执行属性:
* s  E$ u& T4 X3 l  # chmod 755 /root/AtoB.sh  a$ c3 B( d+ ^
  然后,通过crontab设定,让这个脚本每30分钟运行一次。执行命令:
+ d8 y3 \* o) t/ [) j3 m& P! E$ ^  # crontab -e
6 [8 [% S& i) b$ J8 r; S3 U, n  输入以下一行:
) G3 {6 b. Q0 ^; f  0,30 * * * * /root/AtoB.sh
; l, D! q. P/ [2 U* B+ O+ @  保存退出,这样服务器B每个小时的0分和30分时都会自动运行一次AtoB.sh,AtoB.sh是负责
; H) `) Z) M/ b* u0 N保持服务器B和服务器A同步的。这样就保证了服务器A的所有更新在30钟后,服务器B也一样取
. T8 t9 Y' X1 V$ I得了和服务器A一样的最新的资料。5 E, g6 t; U6 z. H

; b1 |! o# C8 i% }9 G0 ^' r  五、其它应用
/ p4 N5 C1 }. V- M( U& R  rsync除了同步文件及目录之外,还可以利用它来实现对远程网站的远程备份。如果再结合脚本和Crontab就能实现定时自动远程备份。其可以实现与商业化的备份和镜象产品的类似效果,但完全免费。* \0 z; u! J6 M' |0 L2 T! Z/ p; ?
( E& m! V' W2 ~
         附:rsync有六种不同的工作模式:. J1 |8 F4 u4 _3 r
  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。& T( Z. u1 [3 P) ~4 \! B- \
  2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST9 `& M7 o& ?$ Z9 S$ S
路径地址包含单个冒号":"分隔符时启动该模式。% v. a& A# |" w
  3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC
7 s7 r" a$ u9 W! s3 b3 R5 ]地址路径包含单个冒号":"分隔符时启动该模式。
( i2 L& h& e! k$ l0 I# D5 ]  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。* ~# |8 t- n5 B% c2 \5 E  P, y
  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。
* O0 ~/ ^# L1 T* w% t$ _  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
8 W% b& L1 H0 {, J* Y, ~9 S5 Y9 \4 R$ H$ ^) e% \( ?5 ]

& b( Y* w6 V. f; c' Q& }, x
9 a9 G2 u7 {0 g8 L( u) ^
& v7 T4 f. I* w$ o3 i& F
8 g+ b3 f- ~; w1 x7 r9 c5 ]* J
9 H& u' }; N1 p9 h0 Z/ P  F' I9 G9 ?' t5 d- l1 X1 l* F

' w" x$ M$ p$ C; B, l' l5 C" Z( W
  前段日子在网上找rsync daemon的filter等过滤规则的详解,怎么也找不到,哥一怒之下,决定自己动手翻译,于是有了本文…3 F) h. g! O9 Q" R
    本文内容翻译自rsync的官方文档:http://rsync.samba.org/ftp/rsync/rsync.html,以及http: //rsync.samba.org/ftp/rsync/rsyncd.conf.html,非完整的全文翻译,并且按照我的需要,对原文的相关章节或 条目进行了适当的重新编排。官方文档发布日期:26 Mar 2011。4 x" a/ L: W; c3 m
; S7 m# B. q, A; F: _
    rsync是Unix/Linux系统中一款优秀高效的镜像同步和远程数据备份工具,它可以把本地文件拷贝到远程主机,或从远程主机拷贝文件到本地,也可以在本地的两个目录之间进行拷贝,但不支持两个远程主机之间的互相拷贝。
0 Q: `% }: D- o: p: Z, Z& J; r, n, M
2 I/ W+ g8 A: a+ y" R
    关于rsync的工作方式:& i& ?2 F3 ?" W6 T# `, K
    rsync连接远程主机进行同步或备份时有两种途径:使用远程shell程序(如ssh或rsh)进行连接,或使用TCP直接连接rsync daemon。5 o1 l: X4 e% K" a* M+ D
    当源路径或目的路径的主机名后面包含一个冒号分隔符时,rsync使用远程shell传输;当源路径或目的路径的主机名后面包含两个冒号,或使用rsync://URL时,rsync使用TCP直接连接rsync daemon。
2 i8 l+ a" u5 G0 h  O    特别的,如果只指定了源路径,而没有指定目的路径,rsync将会显示源路径中的文件列表,类似于使用命令ls -l。! m8 F6 Y: X, U- K

* J; s4 I0 t0 o+ h# _0 H0 f3 |7 `* u rsync把本地端看作client,把远程端当成server。注意:不要把server与rsync daemon混淆!daemon一定是server,而server却不一定是daemon,也可能是远程shell的衍生进程。
9 t6 w6 k3 H1 e- y/ Y4 N/ P( X    至于什么是daemon,以及远程shell衍生daemon,下文会有说明。
' Q4 |% W# h! M2 v8 ]  U: c" z0 H1 t! V1 W2 I1 f$ ]9 X7 K: r& a
5 M" n8 o( Z5 F( w4 x
    关于rsync的安装:
. L+ e% Z$ _( e+ h5 |0 ^7 [    rsync安装方式是最常规的./configure && make && make install,只是要注意:源机器和目标机器都要安装。
( X9 S) e* [# R0 m$ u
- W. x* v, e" K. X$ e2 O' C8 A! z. b+ `: f
    关于rsync的启动:
7 h- E7 t  S' }, j$ U) X    前面说过rsync在进行同步或备份时,有两种途经连接远程主机:使用远程shell,或使用TCP连接远程daemon,可以把它们分别称之为shell模式和daemon模式。只有daemon模式才有启动rsync一说。
. b' Z8 x0 C3 s1 ~  {% s1 G) A  _- L    如果使用shell模式,rsync安装完成后就可以直接使用了,无所谓启动,也不需要任何配置文件。远程传输时一般使用ssh作为传输工具,当然,也可以使用参数-e来指定一个远程shell。
9 p$ a+ X: B/ V2 l: M# Z/ t    如果使用daemon模式,就无需远程shell了,但必须在一台机器上启动rsync daemon,默认端口873." P0 R5 [  x: W/ _( ~( @. O3 q4 s

! `2 V7 y4 o. i% t7 z  i    你可以经由inetd启动daemon,或者作为一个独立进程启动daemon,或者由rsync client通过远程shell启动daemon。
4 X5 H. h, Q' K) U8 W     1)如果把它作为一个独立进程来启动,只需要运行命令:rsync --daemon即可;" u. I& ~- ?5 G5 }7 q) o' n# v
     2)如果通过inetd来运行,要修改两个文件:/etc/services和/etc/inetd.conf:- c6 U9 h( k6 d
      在/etc/services文件中添加如下行:rsync 873/tcp
6 L+ f9 D8 w( k+ L      在/etc/inetd.conf中添加:rsync stream tcp nowait root /usr/bin/rsync rsyncd --daemon
2 n% ~+ m7 ]# ^+ Q  i, o1 `  注意把/usr/bin/rsync换成你的rsync安装目录!然后重启inetd服务,使配置文件生效。
3 ~* v7 A6 ^& Z4 u# q8 f. P! U- i$ R
2 G. {, ?* o2 `6 [% q8 Y    关于由client通过远程shell启动daemon,官方文档中有一个条目:USING RSYNC-DAEMON FEATURES VIA A REMOTE-SHELL CONNECTION。
# s( ^3 h+ a: O: a( Y    条目中说,rsync支持这种用法:使用远程shell连接host,然后衍生出一个single-use “daemon”服务器,来读取远程用户家目录下的配置文件。从用户的角度看,通过远程shell连接而启用的daemon传输,它的命令行语法跟正常的 rsync daemon传输是一样的,唯一不同的是,你必须在命令中使用--rsh=COMMAND来明确远程shell程序。如下例:- e5 j0 m0 e/ N. H0 v3 e
    rsync -av --rsh=ssh host::module /dest3 x  ?$ u  g; [, s7 R
  译者注:虽然官方文档中说这种用法在某些情况下很有用,但我觉得很别扭。1 O2 T; W* g: ]& ]5 S2 ^

1 t' X- v1 ^  _2 ~  j/ Q* r    当rsync作为daemon运行时,它需要一个用户身份。如果你希望启用chroot,则必须以root的身份来运行daemon,监听端口(1024 以下,默认873),或设定文件属主;如果不启用chroot,也可以不使用root用户来运行daemon,但该用户必须对相应的模块拥有读写数据、日 志和lock file的权限。
8 N* S' X# k+ g6 t5 r    当rsync以daemon模式运行时,它还需要一个配置文件:rsyncd.conf。修改这个配置后不必重启rsync daemon,因为每一次的client连接都会去重新读取该文件。2 G/ i- ?8 [! u! n, n
    译者注:关于配置文件rsyncd.conf的设定,后面会有详细的参数解释。' G, r. s+ p- V. E; ], h" v% V
5 n, {& x0 k3 c9 V2 r% e, v
    关于rsync的两种模式:# w6 G% T! T8 i6 g9 F0 @" \
    该部分额外的内容来自IBM官方网站上的一篇文章。该文章把rsync的运行模式扩展成了四种,但我认为rsync官方文档的两种模式的划分更加合理一些。5 K' U9 E/ ^- e& }+ X
    所谓rsync daemon,就是在一台机器上永久运行的rsync进程。在任何一台安装rsync的机器上运行rsync --daemon,则这台机器上运行的rsync就是rsync daemon。我们可以把文件发送给daemon,也可以向daemon请求文件。
" `! h  m4 w9 P/ i6 U- H  D; f    daemon模式非常适合创建中心备份服务器,或项目存储库。
% E% X" Y+ N. h- o+ m" {; |- |    两种模式的区别前面已经说过,shell模式在源路径和目的路径中使用一个冒号,而daemon模式使用两个冒号。
9 W2 I# x! Z, ~# r% B
9 R8 c: N5 t0 \* R6 A    关于rsync命令的语法:' V7 k1 a8 p. p6 V, D

/ d/ A4 V  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,仍然是推动作0 K1 }! [& @6 z) `+ C/ y
    官方文档的举例:
# \1 M# ~: j: E& A8 \8 N    1)rsync -t *.c foo:src/! Y; Q1 a1 g' b& u
        把当前目录中所有以.c结尾的文件传输到机器名为foo的src目录中。如果某些文件已经在远程主机中存在,则跳过该文件。) C1 s( k; h, Z6 k- _
    2)rsync -avz foo:src/bar /data/tmp
# U* F* w5 Q) H" l% V         从机器名为foo的远程主机上把/src/bar目录及其下所有文件传输到本地机器的/data/tmp目录中。注意:源路径src/bar的最后没有斜杠”/”!
3 O7 @! Y' `+ A, K6 Y% `( U" M        源路径的最后是否有斜杠有不同的含义:有斜杠,只是复制目录中的文件;没有斜杠的话,不但要复制目录中的文件,还要复制目录本身!
/ Q% Z! W1 c) }( Q- {        目的路径的最后有没有斜杠,对传输没有影响。0 v( i! e; G# ]* _1 m5 ~( @
    3)rsync -av host:file1 :file2 host:file{3,4} /dest/
4 y4 n) ~! i- i7 R, F8 r& l+ x9 x# O% ~         rsync -av host::mod/file{1,2} host::mod/file3 /dest/  n8 e: ?0 r) `% I$ p
         rsync -av host::mod/file1 ::mod/file{3,4}
4 a# b  T# Y  h* e  I        这个例子是rsync更高级一点的用法,使用rsync同时传输多个指定文件。
4 ]5 w9 ~0 H  U$ d    rsync可以一次传输多个指定的文件,方法是添加多个远程主机参数,或忽略主机名。如上例。* X  L) F+ E/ {# ?

& _4 c% W. D& ~+ H    关于rsync命令中的选项:
+ n3 u: ]/ w" P/ J  X, W7 h    上面例子中提到了一些选项,rsync的选项有很多,请参考官方文档。常用的选项如下:7 p3 j! X2 ?  j: H5 D- n

+ ~" Z- u& w' j-a:归档模式,保持文件的所有属性,相当于-rlptgoD -r:递归模式 -e:指定一个远程shell -z:文件传输时进行压缩处理 --delete:镜像中常用,删除DEST中那些SRC中不存在的文件
+ _$ \8 [3 I3 Y. h! R2 ~ daemon也有一些常用选项,下面会有介绍。
9 e, u* k/ s* Y. b5 z' N+ K0 e. o0 i" p9 ]3 |2 y8 ]' a  w
    client如何连接rsync daemon:
2 x& s6 [5 q- X0 L+ v    上面第3个例子已经给出了client连接daemon的语法示例。但是官方文档又把本条目单独列了出来,提醒我们在连接rsync daemon时要注意的几点:6 q/ R  Q, l5 m% z% X! \
    1) daemon模式中的源路径,即SRC,实际上是模块的名称0 w$ |" }! Y& M# G9 W7 Y! r
    2) 如果未在双冒号::后面指定源路径,则rsync会列出daemon上所有可能的模块
7 N$ g' ^( m% C( J* ~    3) 不要使用--rsh(-e)参数
: \  `# R5 x9 N9 F0 C7 F    4) 有些模块可能需要密码认证,你可以使用--password-file选项,来指定密码文件
( E, G+ N/ M  c, c
' t2 `. }- a1 l% X    启用一个rsync daemon来接受client的连接:
. t* W, N, P+ A$ @' [* Z% B    除--daemon外,rsync daemon启动时还有其它一些常用选项:
% ~* K+ C0 u! p  {. E& J    --daemon:  D4 k5 w0 n, b+ j! N
      使rsync作为一个daemon运行。daemon有两种启动方式,前面已经说过。对client发出的每一次连接请求,daemon会读取配置文件rsyncd.conf,然后做出相应的回应。. e9 H% ~9 n0 z) c" g
    --bwlimit=KBPS:
/ L* b0 Y. k# z' s5 W      指定daemon每秒传输的最大千字节。client在请求连接时也可以指定一个--bwlimit值,但该值不能大于daemon端的设置。" D0 I: m$ F: I/ {+ S
    --config=FILE:% C  {* |  z- Z* F
      指定daemon的配置文件。只有当rsync以daemon模式运行的时候,该选项才有效。默认的配置文件为/etc/rsyncd.conf,除非 daemon是通过远程shell运行,并且远程user非超级用户,这种情况下,配置文件rsyncd.conf默认存在于当前目录(在$HOME目录 中比较典型)。关于通过远程shell启用daemon,见上文。! W7 X5 M) v7 N9 z% f* @2 I
    --port=PORT:
! @- Y6 `: {! }) C: S) U* V& R      指定daemon监听的端口。2 c& W) B* i7 t
    --log-file=FILE:2 T; J2 s5 Q, y' K% f- P
      该选项告诉daemon不要使用rsyncd.conf中指定的log文件,而要使用此处指定的文件。此选项很少用到
- z5 @9 G( G) C# I. V0 O
& x5 k# l. R5 p9 ~1 R( U4 ?* Y3 R- i' m; e
* L& L3 \0 ?) p$ A
rsync 远程数据同步工具详解# B  \7 @7 u8 G: j, X9 f

5 }* @# m- a# M7 Y( h5 h6 ~rysnc(remote synchronize)在CentOS系统默认安装在/usr/bin,此外rysnc在windows平台下也有相应版本。主页地址为: http://rsync.samba.org/1 d5 }/ F7 R; @' u* G+ R9 {
+ {1 G6 {9 x/ U1 s7 p. P
rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远 程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。
4 \/ Z  ^2 {6 h; R; U/ N* z" i$ w8 ?' S9 L4 U
rsync本来是用于替代rcp的一个工具,目前由rsync.samba.org维护,所以rsync.conf文件的格式类似于samba的主配 置文件。rsync可以通过rsh或ssh使用,也能以daemon模式去运行,在以daemon方式运行时rsync server会打开一个873端口,等待客户端去连接。连接时,rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份。( a# ?1 C6 T4 v) r0 f2 p/ f

$ I/ N& @& U+ e2 _4 c! `------------------------------------------------------------------------------------------------------------------------------------------------------------
& q, B9 ]$ H/ S# t% u* o
% e* n4 {$ K  Y7 ?5 Drsync的命令格式可以为以下六种:
" P& N. N$ T# I: R. a/ s$ s' Q/ ]3 e9 |( Y4 k) V
  rsync [OPTION]... SRC DEST
) E7 I4 U1 W4 B. I/ C  rsync [OPTION]... SRC [USER@]HOST:DEST
, D& c3 b+ E$ Y+ P  rsync [OPTION]... [USER@]HOST:SRC DEST+ }  y6 j# f7 x) X
  rsync [OPTION]... [USER@]HOST::SRC DEST9 p) G) n5 K$ u3 o0 T9 {: j
  rsync [OPTION]... SRC [USER@]HOST::DEST& {$ ^8 R. J1 r" |# Y+ V0 x7 ]; s
  rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST] # K& E" t: c' E( [, g- U2 b$ r3 G

. I( s% @  D% n9 p( f  对应于以上六种命令格式,rsync有六种不同的工作模式:, z7 W$ w5 r& Z+ o6 ~

7 t2 r( t$ a) K8 B, h. r) x$ S  1、拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。如:rsync -a /data /backup
. v; p/ s9 g. x# d9 ~! s7 J  2、使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。如:rsync -avz *.c foo:src- {8 T" b0 r/ [; j
  3、使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。如:rsync -avz foo:src/bar /data5 z/ Y+ A; `+ y/ _, t, w2 }
  4、从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。如:rsync -av root@172.16.78.192::www /databack+ e! E% t3 m: u, T5 s0 T4 _
  5、从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。如:rsync -av /databack root@172.16.78.192::www! _2 D+ Q! z0 b, h
  6、列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。如:rsync -v rsync://172.16.78.192/www
( f5 M# B4 B# j; }0 N' x* D( P% r( m  A9 ~
rsync 命令常用参数
% A' x, a. E6 D0 S-a 递归方式传输文件,并保持文件属性,等价-rlptgoD不包含-H
  D, t( u# y" ?, ]+ O' @' p; O-r 子目录以递归模式处理
' c' x. [2 e2 Z2 r-l 保持符号链接文件. G7 E* d: a/ M3 v; ~/ H; l3 E
-H 保持硬链接文件6 w2 I' x! K0 |% q. h
-p 保持文件权限1 J5 K( Z5 Z$ p, a" E/ d
-t 保持文件时间信息
5 c. ^; F" j4 h* Y! P. k0 |-g 保持文件归属组信息
) a; ~; `8 U5 F" H& F: M-o 保持文件归属用户信息
- X, W+ S# j; U: w$ R8 D) E-D 保持设备文件和特殊文件) b0 v& P3 y( s3 C' p# Z
-z 在传输文件时进行压缩处理& V/ N+ f! b2 x  ]; D6 o# t
--exclude=PATTERN 指定排除一个不需要传输文件匹配模式
1 z9 i, Q$ k9 V0 D/ D: i/ Y--exclude-from=FILE 从FILE中读取排除规则- |, o4 {  O  W2 |8 c
--include=PATTERN 指定需要传输的文件匹配模式
6 E7 a+ ^2 ~( ^1 |--include-from=FILE 从FILE中读取匹配规则
" U# H1 l% J  {1 k/ p! @--copy-unsafe-links 复制指向复制源路径目录以外的链接文件
) X0 w1 ?* }9 U- f- {8 u" L--safe-links 忽略指向复制源路径目录以外的链接文件(默认)) w5 c1 l5 s' _% Z1 n( H& _6 O
--existing 仅更新那些已经存在于接收端的文件,而不复制新创建文件
/ {- @/ p1 K0 Z1 O--ignore-existing 忽略那些已经存在于接收端的文件,只复制新创建文件
& ]& @+ q6 I  U-b 当有变化时,对目标目录中的旧文件进行备份
4 ]0 B# ], R) k# L; G1 ?' p--backup-dir=DIR 与-b结合使用,指定备份路径
; S  l0 E1 ~/ L0 C; N/ ~* u--link-dest=DIR 当文件未改变时在指定路径创建硬链接文件. k+ V: m" f3 K4 v% o) I8 X6 Y; y; a  l
--delete 删除接收端还存在而保存端不存在的文件
! Y( E0 j- K  H7 U+ n) ]--delete-before 接收端在传输之前进行删除操作(默认)# x( K  V4 U4 `
--delete-during 接收端在传输过程中进行删除操作
. J+ ?+ R0 Q0 H# V--delete-after 接收端在传输之后进行删除操作
" C  z# a% \, \  t--delete-excluded 接收端在传输同时进行删除操作
& [  U$ y/ B' \" B  t5 ^- c--e,--rsh=COMMAND 指定代替rsh的shell程序,例如可以指定为ssh
0 z( `/ c! `: h+ T& _( w2 E6 Z--ignore-erros 即使出现I/O错误也要进行删除: a+ J* {5 G4 g3 `4 G
--partial 保留因故没有完全传输的文件,以加快随后的再次传输, t; B: M5 k; U$ \  A; z7 |+ _
--progress 在传输时显示传输过程
% q+ S. E& [& Z# H$ B, k-p 等价于—partial—progress
* g7 x# H. y3 z6 s+ c--delay-updates 将正在更新的文件先保存到.~tmp~临时目录,待传输完毕再更新目标文件, r) b0 x6 j( t6 n
-v,--verbose 详细输出模式
& C* I1 }' E6 r# S-q,--quiet 精简输出模式
% W5 s: o, l; w8 B% j-h,--human-readable 输出文件大小& _5 @8 {' Y% @% T9 q" @8 G
-n,--dry-run 显示那些文件将要被传输
  K& w* u' l6 y# C* e8 G! D. [--list-only 仅列出文件而不进行复制
+ |# I: z. a) D0 P2 P--rsync-path=PROGRAM 指定远程服务器上的rsync命令所在路径
. i  S& K. `. X, }. q* s--password-file=FILE 指定从FILE中读取口令,避免在终端中输入口令
* i5 J: R* x/ L3 a' s7 g$ J-4,-6 使用IPv4或者IPv6
3 x) K6 q1 K2 h; U2 z2 D+ j--version 打印版本信息
* r" z' \% T% F, s--help 显示帮组信息
8 l6 c+ z- ^: c2 e6 j3 @) b2 a# H7 J8 c  J: L/ T

, l7 A- T9 q3 G) P. P6 V注意: 若用普通用户身份运行rsync命令,同步后的文件的属主将改变为这个普通用户身份;若用超级用户身份运行rsync命令同步后文件属性保持原来用户身份不变。若指定-tg但目标计算机没有指定用户和组,则复制的文件归入501用户 501组6 b7 z: |- y2 O7 N  Q" T
8 V" m' y9 j+ o
------------------------------------------------------------------------------------------------------------------------------------------------------------1 d- d/ R4 J% M0 m
4 D+ v# d- B2 y! _; J6 j6 B+ n
启动 rsync 服务
# F! B/ n8 G0 T8 m! w启动 rsync 服务 ! k' d, |$ b. i7 |
vi /etc/xinetd.d/rsync  把disable = YES改成NO
2 p5 w) d% u' T2 m0 {' Z0 h* l, ?8 rservice rsync
  S# ^8 D" `8 I9 r6 z{& n# @- A2 }, m/ N/ p
        disable = no- H& C  {" c) I( N9 E
        socket_type     = stream2 u0 m( J! n& p4 O+ [+ F
        wait            = no0 i6 ?1 `) H0 E. ~  N
        user            = root% H9 {$ K- o# z. i
        server          = /usr/bin/rsync, y/ |# _( a# T
        server_args     = --daemon; G8 h+ S" C. L4 j+ h
        log_on_failure  += USERID
  m, ]$ ~& r* @( K, |}/ {  i) y) e, n: e% a
( x8 ?7 }! I1 V* R7 x& r* H
- j! }* ^  q  j' x$ b: G

$ V* w7 I" \6 V4 ?- e配置服务端 rsync
* I+ l* V$ p; m4 I% r' i9 a4 Z# Ersync 服务器可以独立运行也可以由xinetd运行,CentOS默认以xinetd运行,同时默认监听873端口。需要创建rsync配置文件 vi /etc/rsyncd.conf6 g6 i/ H$ y4 B( q; Z1 t
在文件中[module]之外的所有配置行都是全局参数,也可以在全局参数部分定义模块参数,模块参数主要功能定义哪个目录要被同步,可以根据需要来定义多个模块 uid = root / h1 N1 }: Y; G+ I
gid = root ; r- k4 r6 I+ T. X
max connections = 10& c( x" j0 f1 q1 u: W4 V: \  ~
use chroot = no
; P# H% t7 n' B. l7 S- [log file = /var/log/rsyncd.log 9 G/ K! |. S' u) z4 H6 m
pid file = /var/run/rsyncd.pid
: M) ?, b7 [% r; z6 B( z' h! ^lock file = /var/run/rsyncd.lock   T- O+ }* Z/ n) e4 \& d2 o
# E: ?$ J( T3 _9 t7 Z& C
[tongbu]
$ }" X: x7 `- e3 Xpath = /opt/tongbu
3 @# t1 J! R0 ?, Q( Icomment = hello world & D' x; y/ j- Q5 E  a( c
ignore errors = yes + q6 d+ D/ G  w8 |2 f1 J2 m
read only = no - g. N5 w6 S' v$ C+ |
hosts allow = 192.168.1.125
* s/ n* m& H& ^) qhosts deny = *+ a4 r7 y- F1 W  m
(可以匿名连接,不安全,详细参考以下)
3 E) |* [- |) b* s' e启动并设置随系统启动 rsync,要求 服务端和客户端都启动 ,否则使用的时候报错Connection refused4 |$ _! S2 _; d0 U5 k

1 U5 }8 B, g. E8 }. D
6 M$ O3 P9 j; E# I5 s% k3 {rsync --daemon –-config=/etc/rsyncd.conf
" v8 ^4 M: k: W0 I" [4 d! k4 gchkconfig rsync on  D; t) C3 k9 h; T% D4 _

. C& l6 s. J! T5 e$ u* ~, g& b6 p$ \) k3 Q3 M( |& d
------------------------------------------------------------------------------------------------------------------------------------------------------------
* w  u5 ?( X* _2 N
1 V! b0 M7 R2 O% H# s! S全局参数
7 a* R7 _  L  _3 P2 eaddress 指定的服务器运行的IP地址。由xinetd运行时将忽略此参数; y: K) W+ {5 M* p: X: H  n: p1 L
port 指定rsync守护进程监听端口号(默认873)。由xinetd运行时将忽略此参数
; W. f( f* K) m: T/ n4 w: q5 {motd file 指定一个消息文件,当客户连接服务器时该文件内容将显示给客户
" K/ w& E7 ^) R2 `6 s! Z. vpid file rsync的守护进程将其PID写入指定的文件! {7 h0 G) p0 ]/ m
log file 指定守护进程的日志文件,而不将日志发给syslog' _3 t3 p1 v/ G( F
syslog facility 指定发送日志消息给syslog时的消息级别- R6 J2 w5 k7 u1 w8 y- b! m& V
socket options 自定义tcp选项6 l% B5 c0 t' f  l, v7 ]5 e; S
8 p5 e3 p3 ^6 j( @- m' ~4 A
基本模块参数
- p8 R+ c$ u3 ~1 W  }# L1 @path 指定当前模块在rsync服务器上的同步路径,必须指定
, j, b- L; n% {2 Mcomment 给模块指定一个描述7 X' `' A- j& g2 y4 G% a
控制模块参数
; F2 L9 d( K8 ^) E+ @* T" Puse 默认为true,传输文件之前先chroot到path参数所指定的目录下,这样做实现额外的安全防护,但缺点需要root权限,并且不能备份指向path外部的符号链接所指向的目录文件
5 u. E7 c7 {+ H' }- E! [uid 制定该模块已指定的UID传输文件
7 j( s/ f7 |" |gid 指定该模块已指定的GID文件+ X) g' i6 Z2 p) m- f
max connections 限制最大连接并发数以保护服务器,超过限制则提示稍后操作
# ]! }& `) Q4 C( X7 ]) ilock file 指定支持max connections参数的锁文件,默认/etc/run/rsyncd.lock, \9 z' i1 Z' D* {- {6 K, V, N3 u/ X
list 指定当客户请求列出可以使用的模块列表时(默认ture),该模块是否被列出。如果false,可以创建隐藏的模块5 r! P  v0 m* ?
read only 是否也许客户上传文件,默认ture则不也许上传。为false并且服务器目录具有读写权限则允许上传3 U2 k. t( W' O% M
write only 是否也许客户上传文件,默认ture则不也许下载。为false并且服务器目录具有读写权限则允许下载
/ p1 Z7 Y( w5 {' Nignore errors 指定rsync服务器在运行delete操作时是否忽略I/O错误
3 B3 o8 C8 {- E1 p% s. e6 Kignore nonreadable 指定rysnc服务器忽略那些没有访问文件权限的用户
5 ?% `  U; u7 p7 t+ }1 q& d) n( ttimeout 设定连接超时时间,单位为秒
9 a$ \) s4 P5 ]3 q% x$ Z' fdont compress 告诉rysnc那些文件在传输前不用压缩,默认已设定压缩包不再进行压缩
$ V7 g2 B/ i: g: k1 frefuse options 定义一些不允许客户对该模块使用的命令选项列表' J9 a" _. E8 N. m* H2 M
文件筛选模块参数 0 p/ ]$ [% c" o& ?& `6 d2 E& b
exclude 指定排除的多个文件或目录,由空格隔开! K% n- s# N- E: n
exclude from 从指定文件中读取排除规则
# _( ^: F# v) u4 zinclude 指定包含复制多个文件或者目录,由空格隔开" o/ Y! E6 P5 K5 s
include from 从指定文件中读取包含规则  m$ o: i7 H2 C$ m! P8 N
用户认证模块参数
% [: w6 H, E9 o+ f) p  zauth users 指定用户才允许连接该模块
* u" ~) f6 o% A; A9 O/ v( Ssecrets file 指定一个口令认证文件,格式是 用户:密码,即指定用户和密码连接匹配才行,不匹配的话会提示ERROR: auth failed on module,不设置该参数则可以匿名连接。   E& `, ~% o4 ^' l) W2 c
strict modes 指定是否检测口令文件权限。rsync认证口令文件权限一定是600! G1 k. T0 D- C
访问控制参数 ( r7 p2 v  J2 e& }
hosts allow 指定哪些IP可以访问该模块
4 A6 f2 T6 I' N2 S: Phosts deny 指定哪些IP不可以访问该模块,*表示全部
* a( J5 o# j$ m
" U+ Y9 Z% y/ f8 _
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 01:55 , Processed in 0.031014 second(s), 26 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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