将设为首页浏览此站
开启辅助访问 天气与日历 收藏本站联系我们切换到窄版

易陆发现论坛

 找回密码
 开始注册
查看: 1563|回复: 0
收起左侧

Ubuntu下 rsync同步文件实例

[复制链接]
发表于 2016-8-29 13:50:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?开始注册

x
Rsync(remote synchronize) 是一个远程数据同步工具,可以使用“Rsync算法”同步本地和远程主机之间的文件。
0 g$ `4 O) e/ _$ C1 @rsync的好处是只同步两个文件不同的部分,相同的部分不在传递。类似于增量备份,- T  {# l) t. E  a: N
这使的在服务器传递备份文件或者同步文件,比起scp工具要省好多时间。& @1 }' m5 z& c% J
OS:ubuntu server 10.04
9 l7 Z% z0 Z$ s- Aserver:192.168.64.128
3 A' |: i! }$ q$ Iclient:192.168.64.1457 E# c# r5 o4 D6 E" V
server
, s: m5 z' g6 L( C& Y; K1.ubuntu  server 10.04默认已安装rsync,rsync服务默认不是启动的,我们要修改下面的文件。5 J# p5 i5 y) W( H* k: R6 o- Q
$sudo vi /etc/default/rsync* }  b4 [/ G8 B
RSYNC_ENABLE=true   #false改true$ _# ]! {4 y! i7 @9 U4 O. y" P
2.修改配置文件1 `0 U5 k1 R6 {' E8 D! J
$sudo cp /usr/share/doc/rsync/examples/rsyncd.conf /etc   #已默认安装的软件,默认不启动的似乎都要这么做% W0 [5 o! W: {" [( Z  o
我们先来查看一下这个文件
4 I$ B: a. G  ^" d( m& Q5 [0 x$sudo cat /etc/rsyncd.conf5 B! |1 l8 a6 J0 `* h, ^
. Z! @' }' v7 x2 ], n7 p/ S0 D
# sample rsyncd.conf configuration file
# H$ P3 h+ s  [. H6 {9 ~4 V) a2 X# s6 ~+ |
# GLOBAL OPTIONS
6 l( v) ^, {9 h" p3 R, Y
- v# K+ e- G' m" u7 f: w$ F5 b; S#motd file=/etc/motd #登录欢迎信息
1 R. Y5 `% P+ [#log file=/var/log/rsyncd #日志文件
' ?$ F. Z  K) t; w" f  \: I# for pid file, do not use /var/run/rsync.pid if
2 y( j$ R! w1 i2 X# you are going to run rsync out of the init.d script.
0 _! c6 S$ J5 ?$ ?pid file=/var/run/rsyncd.pid8 g/ V8 T, V8 I9 {& L8 ?4 i; l

2 ?2 d9 r) l( Q5 Z! y8 C" |#指定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。
0 `, H0 x5 N; J, w, Z/ q6 k! ?, B/ f#syslog facility=daemon: W' n& _% P' H: L' g
) @; V* w4 E- U+ q/ p
#自定义tcp选项,默认是关闭的2 u: W  P  I- u
#socket options=3 C  i  K0 q8 x& p- _" L
5 x2 w. t" @" I$ P! a
#以下是模块信息,我们可以创建多个模块* _! F1 r, [# _, b; M
# MODULE OPTIONS0 U2 X2 x3 R' f3 f% t' R# k

. Z0 |6 P4 ]+ }: D[ftp]
+ [; }! k/ N1 W2 W/ D
, w! x: b( ?( C        comment = public archive #模块描述! O' n' Q' c9 W" O
        path = /var/www/pub #需要同步的路径
" A/ x( U9 T  `3 z+ j/ |$ z        use chroot = yes #默认是yes|true,如果为true,那么在rsync在传输文件以前首先chroot到path参数指定的目录下。这样做的原因是实现额外的安全 防护,但是缺点是需要root权限,并且不能备份指向外部的符号连接指向的目录文件。
1 _( a" [# T: v$ r) k, j#       max connections=10 #最大连接数( Y8 L1 L4 @" o; {0 I( b
        lock file = /var/lock/rsyncd #指定支持max connections参数的锁文件。3 n* F3 ]! w1 B" {/ E
# the default for read only is yes...! j$ W1 _. {/ z& B5 p% C
        read only = yes #只读选项' a" K+ O( H2 }7 ^4 b3 w
        list = yes #客户请求时可用模块时是否列出该模块
' o- K! e& D, B* v# }( }        uid = nobody #设定该模块传输文件时守护进程应该具有的uid
8 H/ \9 D3 o$ n        gid = nogroup #设定该模块传输文件时守护进程应具有的gid,此项与uid配合可以确定文件的访问权限' G& a$ |) Y( b) Q
#       exclude = #用来指定多个由空格隔开的多个模式列表,并将其添加到exclude列表中。这等同于在客户端命令中使用--exclude来指定模式,不过配置文件中 指定的exlude模式不会传递给客户端,而仅仅应用于服务器。一个模块只能指定一个exlude选项,但是可以在模式前面使用"-"和"+"来指定是 exclude还是include    #这个我的理解是排除目录中不需同步的文件
' M2 \+ n$ W* m$ T) w" J8 |#       exclude from = #可以指定一个包含exclude模式定义的文件名
2 \4 P4 c, m: A; E5 q% O#       include = #与exclude相似
/ z9 j9 s- ?3 S  p#       include from = #可以指定一个包含include模式定义的文件名
" o+ |: d& `7 w  h& I) j& |( X#       auth users = #该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的 challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)
- g0 d5 g: @7 y, v. m8 E#       secrets file = /etc/rsyncd.secrets #该文件每行包含一个username:password对,以明文方式存储,只有在auth users被定义时,此选项才生效。同时我们需要将此文件权限设置为0600. [! F2 i' h. X2 D) s6 Z7 \1 ?
        strict modes = yes #该选项指定是否监测密码文件的权限,如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认值为true
6 a( k, B, }. G, F#       hosts allow = #允许的主机
$ P8 }; f- S3 S, T% J2 w) A) A#       hosts deny = #拒绝访问的主机) Y' x: ~* ~  p$ [
        ignore errors = no #设定rsync服务器在运行delete操作时是否忽略I/O错误
/ t  M! I% u: R: }7 `        ignore nonreadable = yes #设定rysnc服务器忽略那些没有访问文件权限的用户
, h/ K. {. m/ |* `" \, }9 T4 t        transfer logging = no #使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中
: v* S% k0 R1 v" t# X7 I3 h#       log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes. #设定日志格式3 w- v" ^! B( s, Y4 _' D3 V
        timeout = 600 #超时设置(秒)! f. a( s; i+ [8 K4 O
        refuse options = checksum dry-run #定义一些不允许客户对该模块使用的命令选项列表3 v! W1 E- p' l
        dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz #告诉rysnc那些文件在传输前不用压缩,默认已设定压缩包不再进行压缩! X; W; Q( H$ _: i) K
3 ^- Y( z# T! G: s; }/ I8 v

% N* q( Z- l  x( B日志格式选项列表:0 t+ d2 w6 R  h
%h:远程主机名. k+ w; [* ~8 e2 z
%a:远程IP地址! f" U# z, ^, _
%l:文件长度字符数' W' d/ K- @1 Z- ]3 ^
%p:该次rsync会话的进程id
# v  g$ Y7 S! {7 s%o:操作类型:"send"或"recv"、”del.”
" B- L* C. O, @1 [%f:文件名
$ r% w1 A7 T+ }%P:模块路径5 g1 x6 V+ ?$ I* K$ Y( z8 H
%m:模块名
7 r9 p& _6 z3 z%t:当前时间
( e: t# j% h$ T%u:认证的用户名(匿名时是null)
5 I- s' S" B. `%b:实际传输的字节数- I% h4 K+ b2 A/ L
%c:当发送文件时,该字段记录该文件的校验码6 B- S2 r0 |5 i# n
" d+ m/ ]& d7 g$ `
下面我们来定义自己的conf文件
. Y/ w, K' Y. P( N
! C' |& c) T$ C. R" u# sample rsyncd.conf configuration file
2 N+ [2 |+ s7 ^) h; R# GLOBAL OPTIONS
0 k4 X$ m) M+ s0 `6 d#motd file=/etc/motd5 V+ |) p( G  u' g9 A
log file=/var/log/rsyncd* V. G4 S- C8 u
# for pid file, do not use /var/run/rsync.pid if
) [. a( n" ~6 A9 v# A) I0 l# you are going to run rsync out of the init.d script.
( H! |4 Y/ Y: L; g# K+ C) y) O pid file=/var/run/rsyncd.pid* I/ `  }# G8 m& i6 V8 n- V
syslog facility=daemon
7 ?- t2 e* ~5 d: n( B- F#socket options=
) \: l! M+ i) y7 V* }# MODULE OPTIONS
3 x; B: h8 N2 T[my_rsync_bk] #名字可以任意命名,只要客户端的rsync命令一致
7 T5 B( ~+ H* F. N) ?( Y        comment = public archive
) t  d7 w7 X1 j3 B: z; A        path = /home/rsync_bk                             #指定路径,如果没有这个目录自己建。: w4 ]& A0 _: P- _3 y. f! Y' C
        use chroot = no
# m% I( {- q  L5 b! z, j+ c5 b6 ^3 T#       max connections=10
) H' L- d2 \+ M1 E& L$ B        lock file = /var/lock/rsyncd
: j5 |7 e8 @$ p- t# the default for read only is yes.../ U: ^/ v- T5 t7 b1 a! }
        read only = yes
  j* U/ N9 h+ `$ o9 C        list = yes6 _/ B6 M" h+ V$ C; ?' f+ O. V
        uid = nobody
/ X' k- i; X- _2 X4 u. g        gid = nogroup7 @8 C/ q7 f5 V1 Q; e
#       exclude =
" r+ i; X( v1 `' b#       exclude from =
, F3 W! V5 |$ m#       include =+ G# q4 U: ], e& \) g( s4 s
#       include from =  l4 {6 Q" K4 a$ A# \/ |8 `8 m
        auth users = liu_rsync              #rsync连接时的用户名,要和客户端rsync的命令一致/ l: z* Q( C# ~  N6 ?
        secrets file = /etc/rsyncd.secrets #这里是保存密码的地方,如果屏蔽掉就不用密码了
4 N) k" i' A6 G  b% C) j        strict modes = yes
; I1 _* B6 \( ]/ ^* K+ O5 k        hosts allow = 192.168.64.145 #运行的客户端ip+ E. ]' g3 W2 T) ^. I
#       hosts deny =
5 ?" X, V" U4 K        ignore errors = yes! R+ }1 l: f# n
        ignore nonreadable = yes  w' z& }5 Z& C) P4 p4 r4 F
        transfer logging = yes
+ L/ ^; `& r5 z; d, @6 [) y1 ?8 j        log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.- _+ U' e, A* f
        timeout = 600
2 P7 G+ X$ i9 `/ z4 E5 n        refuse options = checksum dry-run4 l8 }' J2 `9 c2 J5 P9 m% f
        dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz7 F) `4 Q6 N( h" K; ]
1 T/ L& ?7 _" O. B
. D3 G1 a0 C% L+ M% F7 A: f
创建一个密码文件( K6 p, [2 ~) o( J7 Y7 P/ [
$sudo vi /etc/rsyncd.secrets, K. n0 t% @3 S5 F4 E& x9 H
liu_rsync:123
- n" V4 \) W7 x. P$sudo chmod 0600 /etc/rsyncd.secrets    9 _6 `) f) N+ C; b& D& O

! i6 U& d/ Q9 T3 ~8 s; t+ ]启动rsync
% o% A3 x! I0 Isudo /etc/init.d/rsync start4 S6 ?5 S9 g# q& [2 p) l

" q3 l( [5 u1 w% l9 Sclient* r& s0 z: P% m; [- p8 y
我们再来看一下客户端的操作,一般客户端不需要进行特殊的配置,直接同步即可
  }& N% P7 W( w- [9 Q, s* y' x rsync -vzrtopg --progress  liu_rsync@192.168.64.128::my_rsync_bk .  #.为当前目录,在服务端touch一个文件,同步后就会出现,当然你也可以指定一个位置比如/databk,需注意所建立的权限!9 _  Q6 ^( H. z8 Y  |; t9 P* U! t

  s$ o2 v) g, O/ b: }: r* f我们把这个同步工作交给crontab去执行。首先我们要创建一个密码文件
6 g9 e  M  p4 M, u$sudo vi /etc/rsync.pwd输入123,保存     #密码要一致4 X4 v& E# z8 h" D. a& J/ ]2 [
( M& H; o$ t7 n4 S) q
!注意:下面这两步操作是必须的,没有足够权限同步就会不成功,ls -l 你所指向的目录
8 m" u4 R  z! M0 z) z2 }& Wsudo chmod 0600 /etc/rsync.pwd
2 K" U/ m' `5 [( {! Ysudo chown 普通用户:普通用户组 /etc/rsync.pwd
6 d3 |+ P; W$ _8 e" J5 G: q- a
8 |# t  T$ P% D& B2 F然后我们打开crontab,使它自动同步
) T" ]3 Y8 q. o, ]+ V& a3 M5 d$crontab -e
8 L# a! N9 B; L  D* * * * * rsync -a --password-file=/etc/rsync.pwd liu_rsync@192.168.64.128::my_rsync_bk /databk   " N% u/ L) V/ v/ t
crontab随机启动  sudo vi /etc/rc.local8 L8 ~8 P8 z+ W( `
参数说明:: X) u! g. M, K, g; `$ i3 a7 L
-v verbose,即详细模式
# a' L! `* m) }# U1 w5 ]# u-z 压缩+ Z" N; }/ P3 I/ @
-r recursive 递归
: s3 p/ k  A0 U4 O' _" p. x' M, \3 u-topg 保持文件原有属性,一般不用加
8 U3 r* h, u( w" \- I6 X& k --progress 用来显示详细进度情况6 ]8 S0 E( @9 P- q4 X8 ], E& L  v
--delete 表示如果服务器删除了一个文件,客户端也应对应删除3 ?  T. |- A+ o5 C) b2 Z( h% j" \" O; K
--exclude="*.sh" 表明不包括某些文件0 e% s0 o) g4 l* O
--password-file=/etc/rsync.pwd 指定所使用的密码文件
; n) l2 m& L" Y1 l- t' m1 B" o最后一项是需要同步的目录  
5 ~8 f. T% B1 v0 @3 W9 W9 W注意指定使用的密码文件中只需要有密码,不要有用户名。5 @* \5 u5 Z4 r, @( {5 C
------------------------------------------------------------------------* j2 e& M8 @, I# |) u8 i2 c
1.在本地机器上对两个目录同步# W0 N9 v* b9 g  E
$ rsync -zvr filename1 filename2
1 r) ?$ m1 ~7 h! C! @, ~- M; Z! c; p) g# e
上述代码是将filename1中的文件与filename2中的文件同步,如果将filename2中的文件同步到filename1中,修改代码为:5 Y; n% o1 Z0 U8 h% t
$ rsync -zvr filename2 filename1
1 }- I: X9 R  T; i2 i2 D  c# N/ a% H) l
2.使用rsync –a 同步保留时间按标记& l, k9 I& u6 ?) n+ w
$ rsync -azv filename1 filename2
5 m1 J6 M0 M/ h  G
( l2 ]$ |# N/ _& G* ?6 ^9 U/ n: p使用上述命令,将filename2中新同步的文件的时间与filename1中的创建的时间相同,* R% i2 S) O6 g
它保留符号链接、权限、时间标记、用户名及组名相同。8 o5 _" b# H5 F( b7 H8 ~# d
3.从本地同步文件到远程服务器! y0 Z# m6 n. u% L
$rsync -avz filename1 ubuntu@192.168.0.1:/home/ubuntu/filename2+ }5 j' ~" l8 [, ^
; y) @; Y5 I# f* C! B4 b4 C
上述命令是将本地的filename1同步到远程192.168.0.1的主机上。
+ O" [; P: a/ [% T% S  X& _  b" p注意:如果远程主机的端口不是默认的22端口,假如是3000端口,上述的命令修改为,
7 L6 [; i5 c: ]/ C8 ]$ rsync -avz '-e ssh -p 4000' filename1 ubuntu@192.168.0.1:/home/ubuntu/filename2
: w2 ?) a+ O% r9 \7 @% N) J# R7 O% ?; R' O0 Z$ b
4.将远程服务器的文件同步到本地3 n4 [- A  \- J" {+ T4 N: V
与步骤3类似,只是将filename1与远程服务器的位置对换一下,: s, O- ^6 T3 I* Y
$rsync -avz ubuntu@192.168.0.1:/home/ubuntu/filename2 filename10 G7 f% p3 z/ Q/ k2 j5 ~9 @
3 E0 Y1 [& P6 T/ D4 b" A
同理如果端口不是22,使用以下命令/ t& s' A8 _3 @% [7 ^5 Y
$ rsync -avz '-e ssh -p 4000' ubuntu@192.168.0.1:/home/ubuntu/filename2 filename1
. S- M: B  j7 f. x  k  F; U$ v  j, Z: V+ r# l9 R' B. l0 s
参考:http://www.eduicc.com/read-24.html# C7 V' g% ~- p
           http://jordy.easymorse.com/?p=2736 s2 }2 T3 r0 }3 b

* M3 j( f4 p  r  t7 Q0 X/ I1 d! B; q! R# V/ G) e- q6 r1 l% M& P* M
  D9 A5 o0 y0 f5 ^

- J2 w: l3 m( Y( a4 S! D3 Q 服 务器之间常常要保持些文件或目录的一致,比如一些大的软件下载网站,它们通常使用多台服务器来提供下载服务。当一台服务器上的文件更新后,其它的服务器也 需要更新,而且 在更新的时候应该是只对新增或是修改过的文件进行更新,否则会造成网络带宽和时间的浪费。rsync就是能有效的保持文件及目录的一致的 优秀软件。
& X: q& U7 w6 y4 X' E  rsync,remote synchronize& U: G9 N( i$ c4 u' T8 e
  顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息,而且可以通过ssh方式来传输文件,这样其保密性也非常好,另外它还是免费的软件。rysnc的官方网站:http://rsync.samba.org/,可以从上面得到最新的版本。当然,因为rsync是一款如此有用的软件,所以很多Linux的发行版本都将它收录在内了。你的Linux里并没有安装rsync,你可以按以下的安法自行安装:
4 m: s$ F1 r5 J6 U: `/ |6 h$ H# x  一、安装过程
9 p$ n) T% B' G. S( _& @: j  1.下载rsync
% G: F) x; s! w, D; z  D; [  目前(2003年9月)最新的rsync版本是2.5.6,从rysnc的官方网站上下载一个回来:; i4 b9 }9 E' v5 N
  # wget http://ftp.samba.org/ftp/rsync/rsync-2.5.6.tar.gz   i3 c% z' q1 z' P2 ~9 v

6 h: C3 O0 C' E" G, N' v/ `" z$ Q  2.解压
; \+ j  }' _" A; C  # tar -xzpvf rsync-2.5.6.tar.gz
4 X1 i/ U6 q) ~8 o) \3 q! M' S" r+ P0 n3 H( F
  3.编译安装
9 X) U- K/ ?* [. c  # cd rsync-2.5.6/
' c0 b, j$ X, N( h  # ./configure --prefix=/usr/local/rsync
, R( b4 W! M8 t$ F  # make5 e) h7 x: p0 Y7 R6 Q
  # make install* q, A0 l: }0 {7 u* `& z4 t
  以上过程没有出现的话就安装好了,现在就有rsync命令可以用了,rsync命令放在! e1 O: e9 k" ]" H9 G  f/ R) t
/usr/local/rsync/bin。用rsync命令可以去运行有rsync服务的服务器上抓取资料。6 \" g' N! O* E) n7 ~
  如果要把当前的机器变成一台rsync服务器的话,就需要继续进行一些配置了。
( t3 g; a9 E6 R8 S  E# U( K
7 @; t1 P( e( I9 U- V  二、配置rsync服务
$ l2 z+ \" r' {) E6 \! g  配置一个简单的rsync服务并不复杂,你需要修改或建立一些配置文件。
4 ~7 d: [' Q0 y4 L  1.rsyncd.conf2 ^( f8 k& T) X' ]4 ~3 _
  # vi /etc/rsyncd.motd2 ^2 C3 X7 y& h$ ?9 j9 Z
  rsyncd.con是rsync服务的主要配置文件,它控制rsync服务的各种属性,下面给出一个
+ u. m2 {4 |1 ]5 X+ Arsyncd.conf文件的例子:& _1 y: H. s% n! s/ I; r
  #先定义整体变量
  F% w6 D/ M2 ?4 f- X% R& l  secrets file = /etc/rsyncd.secrets  G$ c2 s6 H; Y2 [. F+ }' J' H
  motd file = /etc/rsyncd.motd$ t9 X: Q7 I, ^" o8 n+ {! s9 d2 M
  read only = yes
; i  _8 u' Z/ U9 o6 v0 u( \6 n  list = yes
' g8 V$ j* f& @" g3 o) h  uid = nobody! v4 }! k' @8 \  C
  gid = nobody
  M9 J" V5 ^: y* H  hosts allow = 192.168.100.90 #哪些电脑可以访问rsync服务3 m0 `8 G  f! j6 w* n: m
  hosts deny = 192.168.100.0/24 #哪些电脑不可以访问rsync服务# B1 w, L; g( l- b# H6 a$ u
  max connections = 2
* k4 p& J/ n# L3 K2 ?  log file = /var/log/rsyncd.log9 G0 ]5 W1 S4 a) N6 D' S0 r4 g
  pid file = /var/run/rsyncd.pid
9 W! ]7 Y$ r- v. c  lock file = /var/run/rsync.lock; _- H7 H1 p! O5 @# S
  #再定义要rsync目录
* x" `+ S) m2 z. b) j: x  q* _  [terry]. X# T5 h3 z) i, r9 V
  comment = Terry 's directory from 192.168.100.213 U9 x1 k) U0 I- A* W
  path = /home/terry; e) P$ _  w. K$ L6 \0 B& ~
  auth users = terry,rsync
4 u* Z' J: q+ w1 y% K  [test]4 X( d1 O$ i% N$ U8 _
  comment = test rsync  w' O1 c! t# B9 I( k
  path = /home/test7 b6 a: {+ A+ ^
   在上面的配置文件中,限定了192.168.100.0/24这个子网中,只有192.168.100.90的机器可以来访问这台rsync服务器的 rsync服务。配置文件的后面部分定义了两个rsync的目录,terry目录是只有知道terry、rsync两个账号的人才能使用的,而text目 录是无需账号就可以访问的。rsync在定义目录时还提供了一些其它选项,可以作更严格的控制。, T/ z3 ]/ a8 d# x

% e2 v& k$ q% N* o0 ?  @1 l  2.rsyncd.secrets- J) j0 S  r3 o8 S
  # vi /etc/rsyncd.secrets
, T# C' q9 d% o% O# f  K6 X  rsyncd.secrets是存储rsync服务的用户名和密码的,它是一个明文的文本文件,下面给出一个rsyncd.secrets文件的例子:
% Q: |8 O+ T9 z- r5 o  terry:12345; V/ l/ d; r- N: N. C* a! ^- u
  rsync:abcde# _, y2 i1 A' h
  因为rsyncd.secrets存储了rsync服务的用户名和密码,所以非常重要,因此文件的属性必须: Z+ h$ ?; t* ]+ ^' d' G
设为600,只有所有者可以读写:  I% Z) N" [4 p) X
  # chmod 600 /etc/rsyncd.secrets
% X5 T  m, A5 ~! q8 ^; d- T
. |# y3 X5 }, d3 [& m  3.rsyncd.motd
) C3 x; [( T% K  F& ?: L  # vi /etc/rsyncd.motd! q; z8 S; B, ]5 U' D. Q3 J! V
  rsyncd.motd记录了rsync服务的欢迎信息,你可以在其中输入任何文本信息,如:
' f! b9 W" M6 R# t* P7 X  Welcome to use the rsync services!+ R5 r# N" O1 M$ w2 v  w( B

6 S8 B, w! `4 C" K. C  4.services% R0 G& h3 q0 ]2 T  Q) w' b% D
  # vi /etc/services
$ g# l3 j- D1 y3 i, A6 c" ~! o  services并不是rsync的配置文件,这一步也可以不做。而修改了services文件的好处就在于
9 w/ `7 A! x2 v+ U2 S0 H系统知道873端口对就的服务名为rsync。修改services的方法就是确保services中有如下两行,
" q0 H6 m; Z% |5 b4 q, }1 X没有的话就自行加入:+ E- q1 b  R" I% L: a1 w  O: `' y
  rsync  873/tcp  # rsync
5 q& m$ U* D8 C0 _% n" ?$ B7 p  rsync  873/udp  # rsync7 @; C' W' {. u( @
  5./etc/xinetd.d/rsync# e+ z7 s1 Y, S) G1 K( x5 m% F
  # vi /etc/xinetd.d/rsync
! w6 @; t; X! I1 ]5 k1 n" r  建立一个名为/etc/xinetd.d/rsync文件,输入以下内容:. l2 _  p0 Y4 I; H
  service rsync9 ^& B, q( ?0 a3 A( C2 w  d/ q
  {
$ [7 I- ?0 x+ e0 D    disable = no
; |" p* D) k& R6 @; j3 o& x8 ?/ O    socket_type  = stream9 u% w5 x. a2 h
    wait      = no
# B1 A* z* q  R" ]: Z2 o/ F    user      = root  ~2 r1 J6 y, w
    server     = /usr/local/rsync/bin/rsync
" m8 {# i; \8 s5 F    server_args  = --daemon, |5 |; g& @- Z4 x
    log_on_failure += USERID
( ?+ H/ |- }8 ^% T  }
: {( B" k0 J- H: z: B  保存后,就可以运行rsync服务了。输入以下命令:. v7 r6 ?. S4 p0 W7 Y% }
  # /etc/rc.d/init.d/xinetd reload( g$ k2 S0 M2 [- u/ z5 O, v$ ~
  这样rsync服务就在这台机器上(192.168.100.21)运行起来了,接下来就是如何来使用它了。& b- t- Q: M0 S( l5 C! S* C

" _1 j! W# i% I( H/ c  三、rsync命令的用法
: G* ^: Q( w# a1 n* r8 r  在配置完rsync服务器后,就可以从客户端发出rsync命令来实现各种同步的操作。rsync有很
3 M1 O* ?$ m/ Z多功能选项,下面就对介绍一下常用的选项:% `" Q& Z* j- H& y% G6 z
  rsync的命令格式可以为:
6 L6 d1 D8 e( ?# N3 u$ s9 g  1. rsync [OPTION]... SRC [SRC]... [USER@]HOST : DEST]/ x& s  h6 b' w! \6 U/ E8 q4 l
  2. rsync [OPTION]... [USER@]HOST:SRC DEST]
0 J: @  I2 ~9 j1 d. p  3. rsync [OPTION]... SRC [SRC]... DEST]" W4 U5 P% S" w  O" P: k& _& O3 N
  4. rsync [OPTION]... [USER@]HOST::SRC [DEST]
& Y! Q) f9 F; c% c  5. rsync [OPTION]... SRC [SRC]... [USER@]HOST :: DEST]( B7 n3 N( B( k" g1 J3 @! G- Y
  6. rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]& p  o% R- \" N2 f  f# u+ R
1 L2 c8 ~& ?5 ~; J: h5 p9 m
  rsync有六种不同的工作模式:* r0 ?) ~/ S2 O0 H+ T
  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。
. D5 ^2 ~8 h: H8 K. y/ a  2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST
' V6 y% @7 [- ^; l8 k2 b. f/ O2 R路径地址包含单个冒号":"分隔符时启动该模式。, h1 _# e- v4 i: r2 }; X* ^/ W
  3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC
9 W0 A8 I1 f) G7 d地址路径包含单个冒号":"分隔符时启动该模式。+ c( D% f6 I3 P' m
  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。- k% ?: |& j8 J- s& N+ B
  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。$ c8 p5 L! f+ `* S/ O
  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。6 ^* N5 t) w2 G8 s, t4 y3 \" H
  下面以实例来说明:
' ?5 l/ J; }$ v2 k- n7 w8 V& y$ Q  # rsync -vazu -progress terry@192.168.100.21:/terry/ /home8 ^  y2 O$ v: p( e
  v详细提示6 y5 u- R# _* ]' W
  a以archive模式操作,复制目录、符号连接
/ N9 u/ O5 ]8 ~! p4 [  z压缩: T$ N& q" i1 J( P( b
  u只进行更新,防止本地新文件被重写,注意两者机器的时钟的同时9 \0 t* }5 J" ?( u! ]
  -progress指显示
. |9 z& K* K( r1 x& k6 _& e  以上命令是保持客户机192.168.100.90上的/home/terry目录和rsync服务器上的terry目录同
/ W! A6 q5 O. j6 F3 _4 H; ]- f步。该命令执行同步之前会要求你输入terry账号的密码,这个账号是我们前面在rsyncd.secrets- G# I2 J1 m. v0 c, X. U+ b- c; [  s
文件中定义的。如果想将这条命令写到一个脚本中,然后定时执行它的话,可以使用--password-file
& Z1 |5 q+ d: o  t# L& X选项,具体命令如下:
$ w/ \! Z  c; a8 U0 }1 ^0 o  # rsync -vazu -progress --password-file=/etc/rsync.secret
6 n0 n4 K. h. j# a/ ]+ T4 P1 \  terry@192.168.100.21:/terry/ /home! g! P* Z2 h, Z6 W3 B" R
  要使用--password-file选项,就得先建立一个存放密码的文件,这里指定为/etc/rsync.secret。% L3 o0 P+ ~$ ^" b" ?6 d/ t
其内容很简单,如下:
  z% ]" R& P. W  j0 J  terry:12345
! X* p4 f5 @3 M! Q" z  同样要修改文件属性如下:, r  o8 b# s/ I3 J/ I( \
  # chmod 600 /etc/rsyncd.secrets8 H& @1 t; X2 [* Y  x! p8 j
- U0 }6 D- m9 d  A
  四、利用rsync保持Linux服务器间的文件同步实例
6 P+ f, D8 D0 y0 u2 M  p  现在假设有两台Linux服务器A(192.168.100.21)和B(192.168.100.90),服务器A中的9 O6 w. X1 R" }
/home/terry和服务器B中的/home/terry这两个目录需要保持同步,也就是当服务器A中文件发生
! t. s7 K: P; ~$ l& ^0 w改变后,服务器B中的文件也要对应去改变。, H5 r/ ^1 t6 t) Q6 a; S
  我们按上面的方法,在服务器A上安装rsync,并将其配置为一台rsync服务器,并将/home/terry
. H9 u; F7 W9 P* a  F! n# K目录配置成rsync共享出的目录。然后在服务器B上安装rsync,因为B只做客户端,所以无需配置。6 G2 y: k0 s3 @; ?+ ~' D' v
然后在服务器B,建立以下脚本:
# w: I, v& f! l2 I  #!/bin/bash
" ^; [" C& h; f2 V2 s  /usr/loca/rsync/bin/rsync -vazu -progress --delete
9 }" d7 g5 \' f9 V5 O  --password-file=/etc/rsync.secret terry@192.168.100.21:/terry/ /home# p# r+ k: P4 y
  将这个脚本保存为AtoB.sh,并加上可执行属性:) p) u: ~% w9 h5 ~
  # chmod 755 /root/AtoB.sh# e) T% C9 x% P- G! F1 Q5 B
  然后,通过crontab设定,让这个脚本每30分钟运行一次。执行命令:
% h$ z" S, I7 y. X; f" M9 Q7 c  # crontab -e, X' G# Z  k! q
  输入以下一行:
, x# V+ P" h5 b8 s- \  0,30 * * * * /root/AtoB.sh
) Q4 |- y: z# E0 z; e& u  L  保存退出,这样服务器B每个小时的0分和30分时都会自动运行一次AtoB.sh,AtoB.sh是负责3 y) p4 a/ A+ l5 X3 {3 b. d/ i3 L3 J& b
保持服务器B和服务器A同步的。这样就保证了服务器A的所有更新在30钟后,服务器B也一样取
+ o- o1 j, O2 V! |" w5 b# W得了和服务器A一样的最新的资料。
8 o; n% Z% b2 w5 d$ A$ w. ~3 H# W  }/ k* ?
  五、其它应用
6 [7 v, D* N2 l* p( v  rsync除了同步文件及目录之外,还可以利用它来实现对远程网站的远程备份。如果再结合脚本和Crontab就能实现定时自动远程备份。其可以实现与商业化的备份和镜象产品的类似效果,但完全免费。
; X  b: b& U  Y: S6 n9 m7 S3 D
* E7 z9 v; v% {/ @! g8 W, O, G/ A         附:rsync有六种不同的工作模式:4 E! c- o0 ]/ }& R* y- F
  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。
' m* V# k, x; Q8 \9 S  Y  2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST
5 u8 T8 w$ e, U" i. H- }. b3 I- Z路径地址包含单个冒号":"分隔符时启动该模式。
4 n; H  ?- O3 O) l+ o& l  3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC
3 _9 M( e* e1 R/ t, S0 z* s, e地址路径包含单个冒号":"分隔符时启动该模式。
  d& F# K7 i* A4 c9 J  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
( n# K' o1 L7 H  z5 [  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。' ^9 i% F' _) [- {; F$ G+ P
  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
5 r/ z' o0 \# p3 ?
# D4 [: b) _+ ]0 |) [# j8 y7 B0 t1 }2 j3 ]  V" M1 d. O1 C

- E3 D! |+ S  o* Y) ~& g& i8 A- i) O5 b2 F1 g* J4 R0 v

! T. W' z+ {" @$ u, h& c: t- \8 d: [' U3 M% |- n3 }

4 w( B/ @6 ]/ i& `7 ^# Q# p0 J5 v! Q1 d2 a* l0 H2 p: z
3 w/ _) m/ [% P; [' ^# q) P
  前段日子在网上找rsync daemon的filter等过滤规则的详解,怎么也找不到,哥一怒之下,决定自己动手翻译,于是有了本文…
4 o, q8 V  Y+ w- T    本文内容翻译自rsync的官方文档:http://rsync.samba.org/ftp/rsync/rsync.html,以及http: //rsync.samba.org/ftp/rsync/rsyncd.conf.html,非完整的全文翻译,并且按照我的需要,对原文的相关章节或 条目进行了适当的重新编排。官方文档发布日期:26 Mar 2011。
! A# O9 ]) Y- Y) i7 }6 L* V9 y( N* W; R% C" @0 H7 j
    rsync是Unix/Linux系统中一款优秀高效的镜像同步和远程数据备份工具,它可以把本地文件拷贝到远程主机,或从远程主机拷贝文件到本地,也可以在本地的两个目录之间进行拷贝,但不支持两个远程主机之间的互相拷贝。
( ?6 I7 [. u: W5 N: L
! ~5 |  B2 d; ], m5 i6 q
2 T, l. R6 z+ s, @    关于rsync的工作方式:/ v! e% m6 m- @8 N# \
    rsync连接远程主机进行同步或备份时有两种途径:使用远程shell程序(如ssh或rsh)进行连接,或使用TCP直接连接rsync daemon。
3 D! P2 l( \: L7 _  ]( [9 e5 n    当源路径或目的路径的主机名后面包含一个冒号分隔符时,rsync使用远程shell传输;当源路径或目的路径的主机名后面包含两个冒号,或使用rsync://URL时,rsync使用TCP直接连接rsync daemon。8 |7 S9 f  i2 }0 z+ `( s5 o
    特别的,如果只指定了源路径,而没有指定目的路径,rsync将会显示源路径中的文件列表,类似于使用命令ls -l。
" c+ t5 V3 u. j9 w9 l
  Q6 F" y* v* v9 t. F0 j: X; b& q rsync把本地端看作client,把远程端当成server。注意:不要把server与rsync daemon混淆!daemon一定是server,而server却不一定是daemon,也可能是远程shell的衍生进程。5 a* n* ?0 @# u2 f7 N* h& |
    至于什么是daemon,以及远程shell衍生daemon,下文会有说明。4 `" J6 ^6 r7 N) X

# q$ w2 h3 w2 @) B2 r/ e. C" d( R
4 k, T- n$ l$ V+ E4 h6 T    关于rsync的安装:
/ C& A7 v7 t) M+ K9 B0 E  `) A+ E, m" K    rsync安装方式是最常规的./configure && make && make install,只是要注意:源机器和目标机器都要安装。( R# R; t" s( ]# }# r

; v9 U+ F+ u- M: }) K3 [$ t
, K5 b9 S: @2 [) x, Q4 j    关于rsync的启动:8 O+ ~! o4 `' a. x9 B+ p+ p0 r5 X
    前面说过rsync在进行同步或备份时,有两种途经连接远程主机:使用远程shell,或使用TCP连接远程daemon,可以把它们分别称之为shell模式和daemon模式。只有daemon模式才有启动rsync一说。
% Y2 V" y8 T* K/ R8 O( A2 Z( G    如果使用shell模式,rsync安装完成后就可以直接使用了,无所谓启动,也不需要任何配置文件。远程传输时一般使用ssh作为传输工具,当然,也可以使用参数-e来指定一个远程shell。
2 @1 C0 O5 J" a( P9 u5 ~    如果使用daemon模式,就无需远程shell了,但必须在一台机器上启动rsync daemon,默认端口873.% _3 G, V, ~& T( d3 n6 H* D

# ]: O! _; I' N, k    你可以经由inetd启动daemon,或者作为一个独立进程启动daemon,或者由rsync client通过远程shell启动daemon。' y. O- D( n* [+ B
     1)如果把它作为一个独立进程来启动,只需要运行命令:rsync --daemon即可;" f( [/ m8 T' N4 d$ n
     2)如果通过inetd来运行,要修改两个文件:/etc/services和/etc/inetd.conf:$ [4 D% I# G6 `8 P
      在/etc/services文件中添加如下行:rsync 873/tcp
* P3 C3 x. [; R6 W. S! t      在/etc/inetd.conf中添加:rsync stream tcp nowait root /usr/bin/rsync rsyncd --daemon, T  v8 N. [: r5 U6 Q+ d7 [5 d3 u
  注意把/usr/bin/rsync换成你的rsync安装目录!然后重启inetd服务,使配置文件生效。4 h) o; j4 W" e! Q3 a

4 [" b0 S9 R# r- a: J1 c: q5 v    关于由client通过远程shell启动daemon,官方文档中有一个条目:USING RSYNC-DAEMON FEATURES VIA A REMOTE-SHELL CONNECTION。
  ^: L. Y; @1 o0 e3 S1 y. Y    条目中说,rsync支持这种用法:使用远程shell连接host,然后衍生出一个single-use “daemon”服务器,来读取远程用户家目录下的配置文件。从用户的角度看,通过远程shell连接而启用的daemon传输,它的命令行语法跟正常的 rsync daemon传输是一样的,唯一不同的是,你必须在命令中使用--rsh=COMMAND来明确远程shell程序。如下例:
  W( H1 T" ?8 e. |: D6 w- B    rsync -av --rsh=ssh host::module /dest
5 J% f4 Y- c% U; R  译者注:虽然官方文档中说这种用法在某些情况下很有用,但我觉得很别扭。
' ]3 u2 B) ?* _; C$ I# t9 w0 g: |! z# x
    当rsync作为daemon运行时,它需要一个用户身份。如果你希望启用chroot,则必须以root的身份来运行daemon,监听端口(1024 以下,默认873),或设定文件属主;如果不启用chroot,也可以不使用root用户来运行daemon,但该用户必须对相应的模块拥有读写数据、日 志和lock file的权限。9 n# H! n% c8 f
    当rsync以daemon模式运行时,它还需要一个配置文件:rsyncd.conf。修改这个配置后不必重启rsync daemon,因为每一次的client连接都会去重新读取该文件。% ?0 L/ u6 W( K# D
    译者注:关于配置文件rsyncd.conf的设定,后面会有详细的参数解释。
- O* M! p/ L7 ^% E! Z9 @, G& n  a
    关于rsync的两种模式:$ X" Q; h0 g6 c) F
    该部分额外的内容来自IBM官方网站上的一篇文章。该文章把rsync的运行模式扩展成了四种,但我认为rsync官方文档的两种模式的划分更加合理一些。. R) ]6 T+ a7 N# n+ a. x/ u
    所谓rsync daemon,就是在一台机器上永久运行的rsync进程。在任何一台安装rsync的机器上运行rsync --daemon,则这台机器上运行的rsync就是rsync daemon。我们可以把文件发送给daemon,也可以向daemon请求文件。) y! j! r8 b6 L& j/ C
    daemon模式非常适合创建中心备份服务器,或项目存储库。) X: k2 }" s$ G5 O  g
    两种模式的区别前面已经说过,shell模式在源路径和目的路径中使用一个冒号,而daemon模式使用两个冒号。, j# O2 A9 K" y0 t$ I/ Q  u

0 b* Y* ^0 R5 i2 M# H* Z5 v    关于rsync命令的语法:' k2 z! I: y+ [5 n4 P" P
1 \* {, q$ Z3 F1 k
本地拷贝:    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,仍然是推动作5 J0 u- u7 T. |
    官方文档的举例:
" l$ D9 @7 I3 D6 ~+ w3 F    1)rsync -t *.c foo:src/' C* ]& k2 d  O" A, }9 K
        把当前目录中所有以.c结尾的文件传输到机器名为foo的src目录中。如果某些文件已经在远程主机中存在,则跳过该文件。0 z* E# i) [# F8 B3 d. w
    2)rsync -avz foo:src/bar /data/tmp
# k) V9 ], i3 F         从机器名为foo的远程主机上把/src/bar目录及其下所有文件传输到本地机器的/data/tmp目录中。注意:源路径src/bar的最后没有斜杠”/”!
! \- @6 \. ?' _8 P) _1 e( m. }4 q        源路径的最后是否有斜杠有不同的含义:有斜杠,只是复制目录中的文件;没有斜杠的话,不但要复制目录中的文件,还要复制目录本身!7 ^4 E7 R& |9 f) {& F1 G
        目的路径的最后有没有斜杠,对传输没有影响。
# f! d( ]. ?  a; E% L, `" l% z" c    3)rsync -av host:file1 :file2 host:file{3,4} /dest/7 a( C$ r( X. R' N
         rsync -av host::mod/file{1,2} host::mod/file3 /dest/  L; H; D+ ]4 {# ]5 ^2 C: d
         rsync -av host::mod/file1 ::mod/file{3,4}  d( F: b* A6 R6 {
        这个例子是rsync更高级一点的用法,使用rsync同时传输多个指定文件。
7 U9 }! O5 a; c0 D3 O    rsync可以一次传输多个指定的文件,方法是添加多个远程主机参数,或忽略主机名。如上例。
: |: C; l3 D7 u' B! k2 o" q$ p  N
    关于rsync命令中的选项:
5 b. v' G8 z" v    上面例子中提到了一些选项,rsync的选项有很多,请参考官方文档。常用的选项如下:
7 \( S% ?7 ?6 C5 T
6 ~  @9 L' H7 k  f- ^, x% o-a:归档模式,保持文件的所有属性,相当于-rlptgoD -r:递归模式 -e:指定一个远程shell -z:文件传输时进行压缩处理 --delete:镜像中常用,删除DEST中那些SRC中不存在的文件$ R5 n7 J5 U3 T# X- L
 daemon也有一些常用选项,下面会有介绍。
1 P# u: b5 f: M6 F6 c+ F. H) Q3 |7 {7 o# f& P& D7 ]
    client如何连接rsync daemon:
. \  W$ r) p! X& K$ I; k( Q    上面第3个例子已经给出了client连接daemon的语法示例。但是官方文档又把本条目单独列了出来,提醒我们在连接rsync daemon时要注意的几点:
: F9 T7 b. a" b" F$ E    1) daemon模式中的源路径,即SRC,实际上是模块的名称4 i3 C4 P9 f& Y  O
    2) 如果未在双冒号::后面指定源路径,则rsync会列出daemon上所有可能的模块* y# i. N" y5 q
    3) 不要使用--rsh(-e)参数
2 s9 P6 D( T- y7 z    4) 有些模块可能需要密码认证,你可以使用--password-file选项,来指定密码文件
8 F/ h4 P  p1 \( P' J5 s. P1 T+ v; M7 b! C4 k: h0 C" Y& R7 B
    启用一个rsync daemon来接受client的连接:
7 V( X: `; }/ ^3 j8 v    除--daemon外,rsync daemon启动时还有其它一些常用选项:
7 B6 o) b; D# Y; F    --daemon:
. q; S9 X6 l+ ]! l& r4 f      使rsync作为一个daemon运行。daemon有两种启动方式,前面已经说过。对client发出的每一次连接请求,daemon会读取配置文件rsyncd.conf,然后做出相应的回应。5 R) H0 A* \3 Y, W+ C
    --bwlimit=KBPS:! R0 U3 d/ ^, ]2 b
      指定daemon每秒传输的最大千字节。client在请求连接时也可以指定一个--bwlimit值,但该值不能大于daemon端的设置。+ E7 h* A. _# W  o
    --config=FILE:
9 f# J# ]1 C7 u, T. x, |      指定daemon的配置文件。只有当rsync以daemon模式运行的时候,该选项才有效。默认的配置文件为/etc/rsyncd.conf,除非 daemon是通过远程shell运行,并且远程user非超级用户,这种情况下,配置文件rsyncd.conf默认存在于当前目录(在$HOME目录 中比较典型)。关于通过远程shell启用daemon,见上文。/ q, x) r% o" r3 ?+ |( |
    --port=PORT:
$ _- S9 f* o- q2 P) f7 Q      指定daemon监听的端口。1 h: D5 |  X4 {' a4 Y
    --log-file=FILE:
% D  s5 s* r  m% H5 ^  K; j      该选项告诉daemon不要使用rsyncd.conf中指定的log文件,而要使用此处指定的文件。此选项很少用到
, e( S- i2 g! ]$ w$ q: |* J" O7 }# V2 [& D

/ z. ^+ [9 O0 A8 N: y3 \
' A% T' I' B0 A9 Xrsync 远程数据同步工具详解' u1 A5 j4 F6 W0 \: S
( t. y4 {+ _1 A1 Y
rysnc(remote synchronize)在CentOS系统默认安装在/usr/bin,此外rysnc在windows平台下也有相应版本。主页地址为: http://rsync.samba.org/
' n, O) F8 V+ Z1 H4 M! Z9 b6 S/ u# r2 a$ ]8 B! _! p, j
rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远 程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。2 p3 G$ M1 g  d: E
8 I) g1 e0 x4 `2 u0 p4 b& @
rsync本来是用于替代rcp的一个工具,目前由rsync.samba.org维护,所以rsync.conf文件的格式类似于samba的主配 置文件。rsync可以通过rsh或ssh使用,也能以daemon模式去运行,在以daemon方式运行时rsync server会打开一个873端口,等待客户端去连接。连接时,rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份。
: V( p2 n9 A' l2 V( k, J/ ?; {0 G2 T, r, B4 E0 Q
------------------------------------------------------------------------------------------------------------------------------------------------------------' z* j" y% i# P: d

$ H/ @8 E8 b  I1 n* E$ K+ R/ u; H. Yrsync的命令格式可以为以下六种: * P8 j$ `. }4 a! K
' Q' U* x" P3 }9 |
  rsync [OPTION]... SRC DEST
# B" E% L, H+ J  o" b5 K  rsync [OPTION]... SRC [USER@]HOST:DEST& i3 z% a+ f( s; T
  rsync [OPTION]... [USER@]HOST:SRC DEST: Q* s0 H5 z4 v, [4 b# i5 T3 H7 a7 y
  rsync [OPTION]... [USER@]HOST::SRC DEST
! N. [& O. X4 B1 o: ?0 E  rsync [OPTION]... SRC [USER@]HOST::DEST: B( f$ |5 ^2 o* N! [( c' p2 h
  rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST] 6 |  b% S5 K2 f( J- a. t# O' O. n% c

6 l5 [, C/ V+ Q4 H  [) ^1 }  对应于以上六种命令格式,rsync有六种不同的工作模式:
# Q* \& R! {% A
5 f7 c( t; m' S8 p, [. U, }  1、拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。如:rsync -a /data /backup7 R9 c) T) w) Y+ U) K! A
  2、使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。如:rsync -avz *.c foo:src
) f3 o- r8 g6 l( x; [* o  3、使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。如:rsync -avz foo:src/bar /data
: L; B2 Q/ }% P# [  4、从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。如:rsync -av root@172.16.78.192::www /databack
/ F  a7 P3 ^1 O6 K# X  5、从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。如:rsync -av /databack root@172.16.78.192::www
9 o. `* {* R- D& A3 \. C  6、列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。如:rsync -v rsync://172.16.78.192/www1 V7 r# n9 J' p. n

* J/ K& v- N( o4 grsync 命令常用参数
7 S' A% x- p# y/ W# T' x9 S-a 递归方式传输文件,并保持文件属性,等价-rlptgoD不包含-H
0 C- k5 x* x' J( `: h-r 子目录以递归模式处理8 m  a0 o3 t+ g& L2 @" o4 L
-l 保持符号链接文件
  ]: M( A  A: p) m: }5 t-H 保持硬链接文件, z* Q0 `' e, g: J8 `6 M
-p 保持文件权限
; L  Q1 E( Q* N-t 保持文件时间信息
! @# g$ G1 e# _9 ~- X-g 保持文件归属组信息: Q8 B! H. z/ ?, W5 n$ Q
-o 保持文件归属用户信息( j. m; A5 b& L  z5 E  `* O
-D 保持设备文件和特殊文件
/ R/ C* y" n+ `0 q" g- b-z 在传输文件时进行压缩处理
# Y- W: r. {1 x4 r5 S+ ^--exclude=PATTERN 指定排除一个不需要传输文件匹配模式' T% m# d+ T; Y
--exclude-from=FILE 从FILE中读取排除规则
) C; I5 ]2 n$ g' I1 i--include=PATTERN 指定需要传输的文件匹配模式% C1 I& N$ X' T! o
--include-from=FILE 从FILE中读取匹配规则
0 J  f$ m7 l& t# S( O) A--copy-unsafe-links 复制指向复制源路径目录以外的链接文件) |$ Y: c& e' o( C, k$ P0 {
--safe-links 忽略指向复制源路径目录以外的链接文件(默认)
3 m2 f! W' b) Q! p" r4 f1 _' i--existing 仅更新那些已经存在于接收端的文件,而不复制新创建文件% x6 E/ p: s+ {8 w. J2 ~
--ignore-existing 忽略那些已经存在于接收端的文件,只复制新创建文件
! a8 G5 {4 n. D. B- a-b 当有变化时,对目标目录中的旧文件进行备份
; i. p$ V$ _3 _. ?- ~--backup-dir=DIR 与-b结合使用,指定备份路径" l) e( E0 P5 H+ T% u
--link-dest=DIR 当文件未改变时在指定路径创建硬链接文件, X. _) F0 M; @9 q3 k3 p
--delete 删除接收端还存在而保存端不存在的文件
) X$ g3 _' h& x4 C% X. ^" s  q--delete-before 接收端在传输之前进行删除操作(默认)% R! S9 ^$ j+ t8 j: o
--delete-during 接收端在传输过程中进行删除操作! ?2 t  S+ w3 Z/ O' [
--delete-after 接收端在传输之后进行删除操作
9 F. _/ a8 P5 a6 J* q--delete-excluded 接收端在传输同时进行删除操作
5 o  U% v8 C2 k" p0 {# r--e,--rsh=COMMAND 指定代替rsh的shell程序,例如可以指定为ssh5 Z  D: `# |4 p2 D/ Y. D: }
--ignore-erros 即使出现I/O错误也要进行删除, s; G9 `$ n# k1 U& k
--partial 保留因故没有完全传输的文件,以加快随后的再次传输
* E5 u( }3 Y3 R; s5 n' V! N! B( z--progress 在传输时显示传输过程& f4 {% B! |8 O' E, ~3 A* K
-p 等价于—partial—progress0 q; V: L; ]1 C+ v' B/ B0 F5 P$ z
--delay-updates 将正在更新的文件先保存到.~tmp~临时目录,待传输完毕再更新目标文件+ D2 \/ B/ }7 a8 _
-v,--verbose 详细输出模式
' r; R0 g. C  Z% F! Z-q,--quiet 精简输出模式9 k- S6 ?2 s+ ]' {4 {
-h,--human-readable 输出文件大小
; B9 l5 U* V7 G/ z) @-n,--dry-run 显示那些文件将要被传输' V/ L0 {, y/ f
--list-only 仅列出文件而不进行复制! Y. [5 p% ?8 z4 e3 p( T7 X
--rsync-path=PROGRAM 指定远程服务器上的rsync命令所在路径
8 ]2 v1 o: P% L* {, P+ `- X--password-file=FILE 指定从FILE中读取口令,避免在终端中输入口令
8 M3 }$ P0 K1 Z-4,-6 使用IPv4或者IPv6
6 L- p2 ^' w7 I2 x1 D2 k( K" r--version 打印版本信息6 y% A  V7 D8 d: D0 w
--help 显示帮组信息
) @. N7 X. F: @! x, S' G  U# b
! K. W  E/ ], S0 i' W  J
9 @, Q6 L' g" V3 J3 A- c; Y注意: 若用普通用户身份运行rsync命令,同步后的文件的属主将改变为这个普通用户身份;若用超级用户身份运行rsync命令同步后文件属性保持原来用户身份不变。若指定-tg但目标计算机没有指定用户和组,则复制的文件归入501用户 501组
  D5 v0 K. }: ?6 h: n! o2 g9 X6 P: H, A8 E; V/ b+ t. k, r( ^; ]$ V. `
------------------------------------------------------------------------------------------------------------------------------------------------------------8 s5 a1 J# d( T/ D. [6 D

$ K1 y* P: t4 }9 V0 m$ V: ]2 C启动 rsync 服务 5 K$ u. J( H, [  i8 M9 y- m* ]
启动 rsync 服务
, t/ D2 R5 j3 [/ [vi /etc/xinetd.d/rsync  把disable = YES改成NO) q0 X* b' t) g. v8 d
service rsync
' X& M' I5 `2 [: F: _" U% q{, _7 p+ D# z3 R- Q' y, Y+ @4 u* S
        disable = no
# [! I5 }9 ]4 x+ S: B7 |        socket_type     = stream
  x9 G& R+ J# V1 i7 W: P        wait            = no
. I) u- q& P/ {5 X# j& `0 v        user            = root
7 ~, l% }3 \& y        server          = /usr/bin/rsync1 l$ F. m. C# }6 J; e! [1 U& F5 l
        server_args     = --daemon
* D0 Z# I" B$ H- A, x# Y- ^& v) g        log_on_failure  += USERID, k0 A, m* q8 z+ I9 L# |
}
1 [9 K. F% b3 c% b4 I- I
. p4 ?, I& \  r* d; ^: ]) h  ~- `* W$ y! P& n: N  E* h5 Z" M
4 R  ~- A, y, s2 Q  D9 }$ G7 F
配置服务端 rsync
; n$ q) x! [- i! srsync 服务器可以独立运行也可以由xinetd运行,CentOS默认以xinetd运行,同时默认监听873端口。需要创建rsync配置文件 vi /etc/rsyncd.conf' ]1 r' Y! z" |( \
在文件中[module]之外的所有配置行都是全局参数,也可以在全局参数部分定义模块参数,模块参数主要功能定义哪个目录要被同步,可以根据需要来定义多个模块 uid = root ; y! X5 \* a4 h0 M' k/ {9 i+ _/ t
gid = root , W& h' E% n* t6 g& G, g
max connections = 10
5 Q% z6 v1 v9 r! `) Muse chroot = no 9 y( ?' m, d# `7 U, K
log file = /var/log/rsyncd.log
+ A4 C# }& j% N6 i7 M0 x8 Opid file = /var/run/rsyncd.pid 6 J0 u4 Q4 {. {
lock file = /var/run/rsyncd.lock ( L) z" j6 |1 {# Q* U
& ~  \0 [9 L+ W3 f& g  h
[tongbu]
& @  A9 V+ ?2 j6 c( S1 Ppath = /opt/tongbu . N9 B  o. f, g- J8 W+ f
comment = hello world * S9 i  L1 K1 T* r, V! `
ignore errors = yes
9 C. P1 A/ O5 q0 q' pread only = no
* P8 A9 \. {5 R2 g# |. c- ]4 U* Rhosts allow = 192.168.1.125
, _3 Z- g! D( E+ Q- P; H3 |$ Thosts deny = *, K! V/ C- s/ U# ~6 [& _6 B
(可以匿名连接,不安全,详细参考以下)
% b* S) M1 i/ h8 \% C启动并设置随系统启动 rsync,要求 服务端和客户端都启动 ,否则使用的时候报错Connection refused
8 Y: X; n0 y. [# ^
9 e6 _% }" `! ~8 t9 A4 b2 Z: u& L* v
rsync --daemon –-config=/etc/rsyncd.conf * z6 i6 b4 Z9 P  ^
chkconfig rsync on
' R  C+ J. V, q" S$ ~- V! G
+ p3 i* ?$ m/ b; W8 i4 \( R2 Z  {: ?* s' c- Q# g; n$ G1 S
------------------------------------------------------------------------------------------------------------------------------------------------------------
* U3 R! `, q0 [9 n9 m
: N# [& r1 |, d5 z全局参数
' P- B# U3 Z. Z0 @address 指定的服务器运行的IP地址。由xinetd运行时将忽略此参数
: t5 e) y  J7 ^. L" Fport 指定rsync守护进程监听端口号(默认873)。由xinetd运行时将忽略此参数
. \6 ]& v# g/ _# {6 w" Omotd file 指定一个消息文件,当客户连接服务器时该文件内容将显示给客户; |: r! z& v) v+ u) c; z
pid file rsync的守护进程将其PID写入指定的文件
3 Q" R- E) @, d2 y) d; Z  Q3 F" ^log file 指定守护进程的日志文件,而不将日志发给syslog
* P( A! C6 y8 x- s2 b, csyslog facility 指定发送日志消息给syslog时的消息级别- v: m* T: C: L/ {. b1 e  g
socket options 自定义tcp选项
/ {# Q7 W* R2 C
& Y1 V3 n- A% Q3 Y" Y) b基本模块参数
. [) z$ H  f( }( R- h: Z( Epath 指定当前模块在rsync服务器上的同步路径,必须指定
7 z6 g0 |  r6 V" kcomment 给模块指定一个描述
( g. ~& n1 o+ }. F控制模块参数0 w# o; A  c4 l
use 默认为true,传输文件之前先chroot到path参数所指定的目录下,这样做实现额外的安全防护,但缺点需要root权限,并且不能备份指向path外部的符号链接所指向的目录文件
5 y9 O/ W4 Y' Q2 E" luid 制定该模块已指定的UID传输文件
2 C' i6 T) i! l  fgid 指定该模块已指定的GID文件9 D* N: _# D# O
max connections 限制最大连接并发数以保护服务器,超过限制则提示稍后操作; Q  w7 \5 K8 y0 ^+ |- T
lock file 指定支持max connections参数的锁文件,默认/etc/run/rsyncd.lock
5 N; A' o9 L. d- e  X# ?: c+ ylist 指定当客户请求列出可以使用的模块列表时(默认ture),该模块是否被列出。如果false,可以创建隐藏的模块8 @" j. r2 S. ]. Y( [
read only 是否也许客户上传文件,默认ture则不也许上传。为false并且服务器目录具有读写权限则允许上传
# a3 k$ s) s! {  w" V2 twrite only 是否也许客户上传文件,默认ture则不也许下载。为false并且服务器目录具有读写权限则允许下载
8 z7 b; ]6 y* Dignore errors 指定rsync服务器在运行delete操作时是否忽略I/O错误7 C. ?1 V% o! m7 Y, h: F3 u/ K
ignore nonreadable 指定rysnc服务器忽略那些没有访问文件权限的用户# B: p* Z! |+ i0 ~6 A3 s
timeout 设定连接超时时间,单位为秒; V8 b; m# P' a6 t- d" A
dont compress 告诉rysnc那些文件在传输前不用压缩,默认已设定压缩包不再进行压缩
5 I7 ]/ O: k5 ]refuse options 定义一些不允许客户对该模块使用的命令选项列表* N( }9 a' d: Q1 B6 Y9 x/ b
文件筛选模块参数 2 ?5 r( E/ V( d  J$ L+ I
exclude 指定排除的多个文件或目录,由空格隔开
( G: W9 @7 y, D/ I5 vexclude from 从指定文件中读取排除规则( K- w! j; G6 ?; ^$ b9 H
include 指定包含复制多个文件或者目录,由空格隔开
( ]. q4 b* T( N2 U7 Uinclude from 从指定文件中读取包含规则! ~. o6 X% K$ J6 ^
用户认证模块参数
. Y0 p! z, i+ i: }0 K, F. P" Jauth users 指定用户才允许连接该模块, b1 e4 U" u7 P* }0 Y6 R
secrets file 指定一个口令认证文件,格式是 用户:密码,即指定用户和密码连接匹配才行,不匹配的话会提示ERROR: auth failed on module,不设置该参数则可以匿名连接。
, y/ X% h( h. {" j: \/ D2 Q' vstrict modes 指定是否检测口令文件权限。rsync认证口令文件权限一定是6001 |) \1 }5 r7 @( i) W6 h
访问控制参数 $ @& t7 x0 s' h; G9 e
hosts allow 指定哪些IP可以访问该模块- S  j. u0 {8 c; H6 H
hosts deny 指定哪些IP不可以访问该模块,*表示全部
( a% O9 E* J$ B1 G( N, ~% N' x6 J+ G/ [* d7 e
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

如有购买积分卡请联系497906712

QQ|返回首页|Archiver|手机版|小黑屋|易陆发现 点击这里给我发消息

GMT+8, 2020-6-1 06:14 , Processed in 0.097756 second(s), 26 queries .

Powered by 龙睿 bbs168x X3.2

© 2001-2020 Comsenz Inc.

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