易陆发现互联网技术论坛

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

Ubuntu下 rsync同步文件实例

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

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

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

x
Rsync(remote synchronize) 是一个远程数据同步工具,可以使用“Rsync算法”同步本地和远程主机之间的文件。" A: Z9 O: k0 J' Y* T
rsync的好处是只同步两个文件不同的部分,相同的部分不在传递。类似于增量备份,
8 O# L! W( ~. k这使的在服务器传递备份文件或者同步文件,比起scp工具要省好多时间。
4 G) m0 d/ J2 K0 ?  X: d6 [OS:ubuntu server 10.04
# `1 i4 o0 k+ cserver:192.168.64.128
+ e, r' r6 \  G8 |" s5 Z% Uclient:192.168.64.145
; H& o& s5 t9 C( Cserver! K9 N# t! L6 x" P0 \6 {( K
1.ubuntu  server 10.04默认已安装rsync,rsync服务默认不是启动的,我们要修改下面的文件。. c$ x: J1 j1 i2 A
$sudo vi /etc/default/rsync
9 z8 [0 b; w$ Q5 c) Y6 zRSYNC_ENABLE=true   #false改true
, u' w$ s* B: k3 {2.修改配置文件. S. \* j8 x5 l+ B: L1 z' p
$sudo cp /usr/share/doc/rsync/examples/rsyncd.conf /etc   #已默认安装的软件,默认不启动的似乎都要这么做
' l1 z" b# D1 p- F( p( E, v我们先来查看一下这个文件
) m3 t) X9 b' v- ?# i  ]$sudo cat /etc/rsyncd.conf
$ Q9 I8 {, v  S' |3 D$ p2 D7 q8 s4 c! x! j  Y
# sample rsyncd.conf configuration file- B4 f' q* w3 ?: A
9 S( l+ z# H" Q* s% p6 A1 u8 e
# GLOBAL OPTIONS
& d/ e; Z% ?5 v: [8 L% c) R
( N* a! O0 L0 B3 c  A#motd file=/etc/motd #登录欢迎信息
' d, Q! U& I( s; y2 ~#log file=/var/log/rsyncd #日志文件
6 U! g( F1 z! ^2 a. t# for pid file, do not use /var/run/rsync.pid if9 B$ ?4 W! J) M% n0 x1 s9 N
# you are going to run rsync out of the init.d script.9 C: I  B2 C: }: w
pid file=/var/run/rsyncd.pid
2 _1 z# F; v0 N* |% ]' L1 N/ t
" `! Y3 l0 a+ M( q; d9 g#指定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 D# ?+ |; Q3 N9 ~
#syslog facility=daemon
6 P6 R" P2 F* Y5 S4 `4 B+ h: W+ C9 v; ^3 c: l. l7 p
#自定义tcp选项,默认是关闭的  J8 w2 n8 X% P  X" b
#socket options=
. q$ N* C' v& M4 f6 D
0 v. a5 N7 f& i/ F#以下是模块信息,我们可以创建多个模块
. }# h# K: q8 G, A* j# MODULE OPTIONS3 `% p' {9 m3 m6 N+ Z' K

- e% L0 h4 x- H7 J8 g6 c[ftp]5 A! B& F0 C5 c6 b
- t! z8 l: ~) h4 K1 T% M
        comment = public archive #模块描述+ f, G5 n  i$ h; m% O, h
        path = /var/www/pub #需要同步的路径( S9 d- \. K" z; j5 H
        use chroot = yes #默认是yes|true,如果为true,那么在rsync在传输文件以前首先chroot到path参数指定的目录下。这样做的原因是实现额外的安全 防护,但是缺点是需要root权限,并且不能备份指向外部的符号连接指向的目录文件。
) n% I' t# i3 h1 m3 Y; U5 }1 ]0 n#       max connections=10 #最大连接数
, z7 W6 G: t4 b7 K        lock file = /var/lock/rsyncd #指定支持max connections参数的锁文件。1 U% l- y1 K/ F9 z
# the default for read only is yes...# E  b! R4 |$ u- r$ ?0 K2 H) s& |
        read only = yes #只读选项! B9 r% s! ?3 P( [
        list = yes #客户请求时可用模块时是否列出该模块
+ S7 ?( O( n- k3 }: B- l, C        uid = nobody #设定该模块传输文件时守护进程应该具有的uid
- R& J! Y) O% |8 m  J3 Z8 y        gid = nogroup #设定该模块传输文件时守护进程应具有的gid,此项与uid配合可以确定文件的访问权限; m1 O5 l; k- Y" ?
#       exclude = #用来指定多个由空格隔开的多个模式列表,并将其添加到exclude列表中。这等同于在客户端命令中使用--exclude来指定模式,不过配置文件中 指定的exlude模式不会传递给客户端,而仅仅应用于服务器。一个模块只能指定一个exlude选项,但是可以在模式前面使用"-"和"+"来指定是 exclude还是include    #这个我的理解是排除目录中不需同步的文件7 S/ |, r7 r+ G* o* h$ b: G
#       exclude from = #可以指定一个包含exclude模式定义的文件名3 L6 v! X! N( o! a5 p: {- b
#       include = #与exclude相似7 _0 r/ G8 Y1 x" ~) Q9 b0 g9 I
#       include from = #可以指定一个包含include模式定义的文件名
" V1 L2 N) w5 N9 d#       auth users = #该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的 challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)3 |& F1 f! }* Q+ B1 Q
#       secrets file = /etc/rsyncd.secrets #该文件每行包含一个username:password对,以明文方式存储,只有在auth users被定义时,此选项才生效。同时我们需要将此文件权限设置为06009 U7 D% }- ^2 W9 h, C# L
        strict modes = yes #该选项指定是否监测密码文件的权限,如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认值为true: z: T5 [( Y+ ], ^2 j
#       hosts allow = #允许的主机! J' B+ `4 N$ R' V" W- s6 \6 W; }
#       hosts deny = #拒绝访问的主机5 |* R# Z% X" q4 x7 Z
        ignore errors = no #设定rsync服务器在运行delete操作时是否忽略I/O错误
# P0 c5 ~& \* l        ignore nonreadable = yes #设定rysnc服务器忽略那些没有访问文件权限的用户/ G0 f) n- b. s! U, D
        transfer logging = no #使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中( a7 f0 n+ }2 X# Y! p, j" B& _
#       log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes. #设定日志格式
7 w- h4 k) A4 r" c' E2 Y' H        timeout = 600 #超时设置(秒)
7 ^% U( H8 {/ r5 q, u6 g        refuse options = checksum dry-run #定义一些不允许客户对该模块使用的命令选项列表
6 u! l8 A0 K/ Z8 P4 c8 F+ J  C+ O9 }        dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz #告诉rysnc那些文件在传输前不用压缩,默认已设定压缩包不再进行压缩* m# o. T2 W9 Q/ r
: p  x) r9 k' Y" i- K, H

. O3 e' [( i# k3 ^2 k' q1 j; |日志格式选项列表:- w; `/ D" |! C- b0 t
%h:远程主机名
- O* t/ r9 E: y. V%a:远程IP地址
* l, L2 R! B9 G: I) u( y%l:文件长度字符数5 r6 v/ v6 I8 N# `  H1 b4 b6 G
%p:该次rsync会话的进程id
0 s  K: f0 a: ]2 Y  j! c7 |%o:操作类型:"send"或"recv"、”del.”& i% Z5 w) ~6 u8 m6 \" k
%f:文件名# e/ i( f/ t" z8 o* J
%P:模块路径' ]2 g5 c$ b! E- H
%m:模块名
8 B) E: j& X3 K%t:当前时间9 F) e+ P% g# H- u% Z9 u
%u:认证的用户名(匿名时是null)
  v# \2 \1 U  B, k' U& Q( j0 Q* b%b:实际传输的字节数
5 D# y: k+ z& b! Q0 K%c:当发送文件时,该字段记录该文件的校验码, W; F+ M3 q6 D2 P

" @( u7 R8 x' Q- y- ]5 B! `! O下面我们来定义自己的conf文件6 y6 p4 t5 Z- L5 l

  T2 z7 @. x* G- i. Z5 K. t2 M# S# sample rsyncd.conf configuration file
* x1 @7 z- p  W0 v( P; W' o# GLOBAL OPTIONS
4 W0 _) B9 ]6 L5 t#motd file=/etc/motd" r9 @) E% [) S; U% c* S
log file=/var/log/rsyncd
5 g# q1 M6 \! X& L. C2 V7 A( s1 V9 ~# for pid file, do not use /var/run/rsync.pid if% `  J! p$ C  q9 ?6 s
# you are going to run rsync out of the init.d script.
6 s! X4 i( H+ n  N- C7 E) |( \ pid file=/var/run/rsyncd.pid
) f8 ^0 ^2 i! l. Q+ o7 ~. l2 o0 d2 d/ }syslog facility=daemon
" ^! k% U& a+ `. L# @0 A#socket options=2 t; |) k4 ^2 J8 d. C0 f
# MODULE OPTIONS
% P  o  N6 n8 M; b" l+ [[my_rsync_bk] #名字可以任意命名,只要客户端的rsync命令一致" Q" p# Z9 T# F+ {
        comment = public archive
0 H, i" D  q! r$ o' h. C# ?        path = /home/rsync_bk                             #指定路径,如果没有这个目录自己建。# m* p1 K1 a& i% ~  P
        use chroot = no
' s8 @: K! x+ {1 P5 Y#       max connections=10
; x, F0 j! `2 E        lock file = /var/lock/rsyncd
3 _5 {' ^2 W3 I" \, c  q6 N# the default for read only is yes...; ~! b* U- p0 H5 t, l& r
        read only = yes
. K; G8 e+ R$ l- R5 z        list = yes, J; x9 f$ X* Y# o0 R
        uid = nobody
4 h  J% r  t9 K! F  z        gid = nogroup
3 a, n) s5 M2 Z; A9 P#       exclude =
5 t  O/ Z( j  z+ L" t9 c4 l#       exclude from =
# U5 j  i9 b$ r5 h#       include =
/ P& N# f, I+ S4 r1 v# X- \: d' D#       include from =3 S0 o, s( |$ s- B" V/ j/ \/ ]5 D
        auth users = liu_rsync              #rsync连接时的用户名,要和客户端rsync的命令一致
3 |8 D# L9 N( F! K) |6 B* m        secrets file = /etc/rsyncd.secrets #这里是保存密码的地方,如果屏蔽掉就不用密码了, L+ F2 ?3 r6 G$ F5 D+ J2 f+ s
        strict modes = yes
! P- m! x3 n% h+ J4 e        hosts allow = 192.168.64.145 #运行的客户端ip
1 r8 `" F; N) r9 j7 h#       hosts deny =5 g- F# {- i3 p9 l: m8 _/ O
        ignore errors = yes# k5 i# n  N, M; v1 Z
        ignore nonreadable = yes7 l: P/ b! G9 B
        transfer logging = yes
7 Q( B* X( d3 z3 M* i8 i        log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.
( h: {9 X! f' v8 o        timeout = 6006 Z% o7 n' }6 R% b0 q
        refuse options = checksum dry-run/ O: C$ X" E: ~6 W$ c" n
        dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz5 o$ O& \: E, |6 @9 B+ }" d4 a

0 L3 Y, z, u/ z  P0 M/ e* S! t' J
. X0 Y. ]# I0 {9 p( }$ C# Q1 ~- x创建一个密码文件1 ?4 y; i+ T% t2 U7 ]% l0 v
$sudo vi /etc/rsyncd.secrets
; A) c  {; C. U9 X+ R liu_rsync:123* y0 `# x8 C# S7 b% h, u
$sudo chmod 0600 /etc/rsyncd.secrets    4 J1 K* E% F$ }# F
; {% A' o3 r! U! P0 h
启动rsync
. z: @! z+ P9 D( z! X2 asudo /etc/init.d/rsync start
, ^& x/ P9 n' h: {) [* i9 C* v$ e* F8 s6 ]
client
; ]# X% r2 K3 ~: k% p2 c' u7 y; r我们再来看一下客户端的操作,一般客户端不需要进行特殊的配置,直接同步即可! \' u5 T2 s! G& @& u4 f
rsync -vzrtopg --progress  liu_rsync@192.168.64.128::my_rsync_bk .  #.为当前目录,在服务端touch一个文件,同步后就会出现,当然你也可以指定一个位置比如/databk,需注意所建立的权限!8 l' d" y. P/ i2 _- ]

2 I5 b* y. i7 [% u$ o我们把这个同步工作交给crontab去执行。首先我们要创建一个密码文件9 s" l& Y& c  m; l' \
$sudo vi /etc/rsync.pwd输入123,保存     #密码要一致' x+ N# J$ i  e$ f

( _; R8 f. c, @0 _. F!注意:下面这两步操作是必须的,没有足够权限同步就会不成功,ls -l 你所指向的目录' Q, F) @2 J- p8 A
sudo chmod 0600 /etc/rsync.pwd; q3 c4 N9 Q" e2 e: z
sudo chown 普通用户:普通用户组 /etc/rsync.pwd
0 z% f6 Z2 o# \! J% x! l- U; h6 V
: m8 b% z( z, }1 H% `6 ]然后我们打开crontab,使它自动同步
5 H, Q' E5 s. J* I- }" V4 }5 [( J$crontab -e
5 {0 j0 k. f, p5 E* l8 S* * * * * rsync -a --password-file=/etc/rsync.pwd liu_rsync@192.168.64.128::my_rsync_bk /databk   
5 T& W0 S8 J3 Y% \0 Ocrontab随机启动  sudo vi /etc/rc.local( r" O# i, |* v# o
参数说明:
8 J, m0 g, O: L) ^" Q-v verbose,即详细模式- H  t- ]- M% X' Z
-z 压缩% `9 _$ Y* j& n( Z. G) m" n, ^
-r recursive 递归" O2 l- t$ z8 a" ?. i
-topg 保持文件原有属性,一般不用加$ o. K- B/ S( g. ?4 N% z7 c7 q
--progress 用来显示详细进度情况4 ^% L% ?3 s: k# x* ]
--delete 表示如果服务器删除了一个文件,客户端也应对应删除
" ^# @/ {7 q3 B4 H8 q( @. t--exclude="*.sh" 表明不包括某些文件
  _1 Z" [! \5 E' b1 |0 E9 T3 m--password-file=/etc/rsync.pwd 指定所使用的密码文件
# G  l. e; N! |# j最后一项是需要同步的目录  
' M" {# v1 R8 e注意指定使用的密码文件中只需要有密码,不要有用户名。# t% A9 k, l) B
------------------------------------------------------------------------
' O& l' J5 _8 N8 r1.在本地机器上对两个目录同步9 r3 ]9 S* N3 J: x6 H
$ rsync -zvr filename1 filename26 T: f) d. |3 ]4 w  k. l
" ^' a9 X: p5 L+ I
上述代码是将filename1中的文件与filename2中的文件同步,如果将filename2中的文件同步到filename1中,修改代码为:
1 k) |( [# T$ `- |1 g$ rsync -zvr filename2 filename1( m- a- u: S/ x, e' f- u* q

1 l" [0 D5 E0 v6 P. M. X0 c$ S2.使用rsync –a 同步保留时间按标记# k! p( d) R+ s$ v; \4 d
$ rsync -azv filename1 filename2
- q# c0 p- e$ [2 q0 ~" h- a9 {# Q; W& W! R; f) @
使用上述命令,将filename2中新同步的文件的时间与filename1中的创建的时间相同,/ c! @2 ?6 S" S0 X1 L- M9 @
它保留符号链接、权限、时间标记、用户名及组名相同。
: C6 o% Q* G& G4 C) F7 C3.从本地同步文件到远程服务器' m, [$ V( d% M2 L
$rsync -avz filename1 ubuntu@192.168.0.1:/home/ubuntu/filename2
- m' |: V2 _8 s- j  h" j6 \! U4 l2 u+ Z) g+ g7 P7 l# I& ?: t: M
上述命令是将本地的filename1同步到远程192.168.0.1的主机上。
$ C, e+ M. _, m; v# l注意:如果远程主机的端口不是默认的22端口,假如是3000端口,上述的命令修改为,
+ d8 j. Z. c  X3 v  e( n$ rsync -avz '-e ssh -p 4000' filename1 ubuntu@192.168.0.1:/home/ubuntu/filename2+ d( W- a6 _6 ]" v

% \9 _9 ]# h4 L& j4 @5 g4.将远程服务器的文件同步到本地
  e; D+ G6 e* n! x与步骤3类似,只是将filename1与远程服务器的位置对换一下,
# C. u1 I$ y: }, C6 H' X$rsync -avz ubuntu@192.168.0.1:/home/ubuntu/filename2 filename17 R' a& L* x. \, X0 @0 l! j  a

/ M- g: u* g4 @! m同理如果端口不是22,使用以下命令7 o8 e4 y8 Y1 O2 q
$ rsync -avz '-e ssh -p 4000' ubuntu@192.168.0.1:/home/ubuntu/filename2 filename1
1 r% j2 V7 P7 g5 J. N: p
1 S8 y) j8 T* L5 N' b( V参考:http://www.eduicc.com/read-24.html$ N1 i6 v) g. H1 e: y4 N% D3 I
           http://jordy.easymorse.com/?p=273
8 r4 N& j0 b, `" r6 G# O! f5 a4 V" ]* `

$ `# x' L! v3 J( l1 i9 b  I
7 T' G' Y( i0 s# _1 ]! q& p* ^& O/ z/ D
服 务器之间常常要保持些文件或目录的一致,比如一些大的软件下载网站,它们通常使用多台服务器来提供下载服务。当一台服务器上的文件更新后,其它的服务器也 需要更新,而且 在更新的时候应该是只对新增或是修改过的文件进行更新,否则会造成网络带宽和时间的浪费。rsync就是能有效的保持文件及目录的一致的 优秀软件。
7 ~1 W- S5 T5 f2 i& R  rsync,remote synchronize8 I' ~4 O& d/ B9 ^" S
  顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息,而且可以通过ssh方式来传输文件,这样其保密性也非常好,另外它还是免费的软件。rysnc的官方网站:http://rsync.samba.org/,可以从上面得到最新的版本。当然,因为rsync是一款如此有用的软件,所以很多Linux的发行版本都将它收录在内了。你的Linux里并没有安装rsync,你可以按以下的安法自行安装: 7 F3 A2 g2 T* a
  一、安装过程# [* _1 ^" o! z
  1.下载rsync
* _' v& S( M$ O, q8 D+ u$ l: c  目前(2003年9月)最新的rsync版本是2.5.6,从rysnc的官方网站上下载一个回来:! z0 [& L! U0 z, D1 R0 j" @) ^2 q
  # wget http://ftp.samba.org/ftp/rsync/rsync-2.5.6.tar.gz " s+ N1 [7 F- [$ n
9 f" M! t# t' L- W3 U; Q3 G
  2.解压
, v/ ^# _' R" B5 N# w  # tar -xzpvf rsync-2.5.6.tar.gz
' s% s. N5 \7 A5 y& J6 ?6 t9 C" N* C8 h
1 C6 }& d& @, Q8 U; K5 y3 ?  3.编译安装& A" O% @- @& {, p: A, ?9 {5 W
  # cd rsync-2.5.6/- c1 D  A3 R" K, x+ i( j
  # ./configure --prefix=/usr/local/rsync$ n" {4 j. z9 q/ K# C& g* a9 L. o& X5 D
  # make
; ~0 ~4 B/ ?0 K1 `  # make install
# o& Z/ o; B# d) z  以上过程没有出现的话就安装好了,现在就有rsync命令可以用了,rsync命令放在
. E; Z3 I' u6 q# a# `/ D: }# U/usr/local/rsync/bin。用rsync命令可以去运行有rsync服务的服务器上抓取资料。. T5 W* X/ ?, ^/ H9 L
  如果要把当前的机器变成一台rsync服务器的话,就需要继续进行一些配置了。
/ m4 ^& j: B) g0 `7 d! `+ L& ?$ L1 A# ?+ j# {
  二、配置rsync服务9 [6 v. ~; Q9 ?' O
  配置一个简单的rsync服务并不复杂,你需要修改或建立一些配置文件。" G! U9 l4 u4 O( e
  1.rsyncd.conf; P7 U8 X; \" M- T, \4 P
  # vi /etc/rsyncd.motd
7 N7 d0 }' y* Q% b4 Y& y1 g  rsyncd.con是rsync服务的主要配置文件,它控制rsync服务的各种属性,下面给出一个9 S/ p. T# |) ]) S# E. O6 c
rsyncd.conf文件的例子:
1 A8 m7 m: A, p3 `  #先定义整体变量1 t0 n  Z1 W% R/ K4 C# s0 t6 _
  secrets file = /etc/rsyncd.secrets$ h! @# U( l, @. l7 U8 H
  motd file = /etc/rsyncd.motd
/ k2 m. Y: O; ^  e( J, U  read only = yes
% [. W2 Y! B9 f1 [! o( n9 _) k  list = yes
# ~. x% ~- K1 y2 O) J  uid = nobody3 j+ M. {$ ~& \/ ?1 B+ k
  gid = nobody
: s% j" a/ C2 [4 m  hosts allow = 192.168.100.90 #哪些电脑可以访问rsync服务, f/ A0 t7 t+ A
  hosts deny = 192.168.100.0/24 #哪些电脑不可以访问rsync服务3 O: ^" f$ q/ C% N6 O
  max connections = 2: \; B$ o1 i9 J: i! m* i+ L. A" t
  log file = /var/log/rsyncd.log$ Q, p8 L9 c! H5 P) W  i
  pid file = /var/run/rsyncd.pid7 S1 X" ]$ D8 j. c6 F
  lock file = /var/run/rsync.lock$ b- z) h! P' I$ Y5 g  y( Q/ T
  #再定义要rsync目录
& }2 `, ?4 U+ ~' T( ^; j  h( h  [terry]
2 \. X  N, F  ^, v# M+ R  comment = Terry 's directory from 192.168.100.21% F( B* P) V; F& u; O
  path = /home/terry
7 l- }6 r8 R3 T* S9 n  auth users = terry,rsync2 p, [' o* Q0 r% _# n7 P
  [test]
8 t0 m7 s. S7 B8 C  comment = test rsync
  H7 a  ?3 d' l  p  path = /home/test
" X( n- n$ ]; o3 n& W. s& Z   在上面的配置文件中,限定了192.168.100.0/24这个子网中,只有192.168.100.90的机器可以来访问这台rsync服务器的 rsync服务。配置文件的后面部分定义了两个rsync的目录,terry目录是只有知道terry、rsync两个账号的人才能使用的,而text目 录是无需账号就可以访问的。rsync在定义目录时还提供了一些其它选项,可以作更严格的控制。
" E- P; |  e! A) h6 {4 @/ p9 m
; z# J/ `, g+ }" u7 C: q: ?  2.rsyncd.secrets) C2 F3 O! f  a( y
  # vi /etc/rsyncd.secrets
3 V- l- o4 Q, g0 J  rsyncd.secrets是存储rsync服务的用户名和密码的,它是一个明文的文本文件,下面给出一个rsyncd.secrets文件的例子:
3 g% C9 W& i) o- w% T  terry:12345
0 \5 }- l. u- o0 v- u  rsync:abcde7 E" r" g8 A- R/ S5 ^
  因为rsyncd.secrets存储了rsync服务的用户名和密码,所以非常重要,因此文件的属性必须
- N8 ^8 I7 t8 J+ \+ G. b设为600,只有所有者可以读写:0 w! U, j8 i6 H3 y# V
  # chmod 600 /etc/rsyncd.secrets
* s* q4 G/ B9 y9 X8 J* A8 |6 I' G% J. g- ^! y# t4 h3 c" {0 v
  3.rsyncd.motd
; O/ x9 Z- ]- M  # vi /etc/rsyncd.motd: ?" K( O, F& k1 g& A
  rsyncd.motd记录了rsync服务的欢迎信息,你可以在其中输入任何文本信息,如:
& a! u4 k- }2 R8 ?9 S  Welcome to use the rsync services!
5 x+ o8 n: D( M% D+ ?8 e* V1 {& ?
; ^2 M4 v7 `8 p/ M: j5 k  4.services% q5 c* `1 _# w# R" t( n# B
  # vi /etc/services
$ S, Q- H  D" E! K  services并不是rsync的配置文件,这一步也可以不做。而修改了services文件的好处就在于6 Z- M9 s, Z0 V: W
系统知道873端口对就的服务名为rsync。修改services的方法就是确保services中有如下两行,# U1 L5 S3 h& ?4 T! m' Z
没有的话就自行加入:9 w/ A0 {5 S6 c  M) |' v6 M
  rsync  873/tcp  # rsync
) e: c6 X( g2 L9 c3 d  rsync  873/udp  # rsync. L1 s$ g1 ~$ h- i+ Z" q1 w6 V) j
  5./etc/xinetd.d/rsync- |- p; v6 B4 A) y1 N% k1 l: Q
  # vi /etc/xinetd.d/rsync4 C% z! z- t/ w1 }4 R
  建立一个名为/etc/xinetd.d/rsync文件,输入以下内容:
: v: Q' ]' t+ F4 j  service rsync
  j" U* Y7 [* N3 r7 p  {
5 o' |4 E* L# a1 N$ T- ?# I& Q    disable = no
# v- ]! A/ t) |4 \% c    socket_type  = stream
1 |+ @0 y$ k5 Y! r$ [  {" [# a8 e    wait      = no! j4 p3 F  v% k& O* Q8 `8 L
    user      = root3 j* H4 E. D; n" u
    server     = /usr/local/rsync/bin/rsync
0 S4 [" R9 M& ~* v3 X# }% ?, C    server_args  = --daemon1 a1 \* _- I: d, b2 r( Q
    log_on_failure += USERID
% c% N' Q- \- z  }
9 B% Z! F1 r7 |  保存后,就可以运行rsync服务了。输入以下命令:) w/ s" h) t5 i/ K6 _( j
  # /etc/rc.d/init.d/xinetd reload- z+ J% Q- d/ p. V, B' @- i$ I! S, e
  这样rsync服务就在这台机器上(192.168.100.21)运行起来了,接下来就是如何来使用它了。: N4 }/ {1 V7 R- O
1 I. B7 u! P) L) n) S7 u% M
  三、rsync命令的用法' D9 I. C1 d6 ]" X; {( f
  在配置完rsync服务器后,就可以从客户端发出rsync命令来实现各种同步的操作。rsync有很0 Y7 C) [1 D; l  U" C* g& u4 O
多功能选项,下面就对介绍一下常用的选项:! S; g$ c, r8 f; b4 G
  rsync的命令格式可以为:5 }6 S* U6 ?* U7 [
  1. rsync [OPTION]... SRC [SRC]... [USER@]HOST : DEST]% B/ S6 @8 V  x2 `% U
  2. rsync [OPTION]... [USER@]HOST:SRC DEST]! ?: c! I. H7 [* R7 c9 y/ W, M
  3. rsync [OPTION]... SRC [SRC]... DEST]
, u$ c( b" Q8 J6 T. W) H# q  4. rsync [OPTION]... [USER@]HOST::SRC [DEST]
1 T+ N, \# w: V) d0 h2 o3 [  5. rsync [OPTION]... SRC [SRC]... [USER@]HOST :: DEST]
0 K. g  E  _1 s: n  6. rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]7 Q, w# Z( @! k8 s+ X% W
7 |" \  J% M% Y. }* x* m, v
  rsync有六种不同的工作模式:2 C/ g/ p- n# d. x8 o+ z" V
  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。1 w5 |/ z' M$ m: J( o5 O
  2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST
' a5 e7 I& W" `3 I1 R1 Z+ `4 v路径地址包含单个冒号":"分隔符时启动该模式。+ s  @) t0 J# N6 o  N$ Z8 ]9 H
  3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC
( t$ y$ M  K; T0 `/ S" k' X地址路径包含单个冒号":"分隔符时启动该模式。
# M1 d6 Z. B! S/ r) m0 P( L; r1 t  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。" G# Y4 U! G4 U8 g0 ^: _
  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。7 K% z5 \* h7 ?' m: m" A
  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
0 d: o$ k' ?$ H1 k  下面以实例来说明:
1 g- e4 i+ c: Z: q* V* Y3 \  # rsync -vazu -progress terry@192.168.100.21:/terry/ /home/ _# P2 E, Y- `. a8 s4 D( \. k+ a
  v详细提示( M. s9 \% \; [( Q. b
  a以archive模式操作,复制目录、符号连接1 |& X  D& q( ?, n- ?
  z压缩
/ L: f! c- i5 F9 X  u只进行更新,防止本地新文件被重写,注意两者机器的时钟的同时
' N* Y: v. J% E7 e  -progress指显示
3 ~8 W) M. R; d5 r  以上命令是保持客户机192.168.100.90上的/home/terry目录和rsync服务器上的terry目录同
( D3 i2 f) n9 o6 f9 ?' r4 d4 n2 I0 D步。该命令执行同步之前会要求你输入terry账号的密码,这个账号是我们前面在rsyncd.secrets
& q3 X# x6 Y' n" \文件中定义的。如果想将这条命令写到一个脚本中,然后定时执行它的话,可以使用--password-file9 X* s4 x4 u, P3 \8 m) n
选项,具体命令如下:) i, a. s/ x$ v( @4 @+ p/ E- a
  # rsync -vazu -progress --password-file=/etc/rsync.secret
! B( W: L% e/ B9 j  terry@192.168.100.21:/terry/ /home
$ W9 d4 w: I8 |8 g8 ?: P: ^  要使用--password-file选项,就得先建立一个存放密码的文件,这里指定为/etc/rsync.secret。
4 h& H  f% q  Z- G- d2 E0 p4 d其内容很简单,如下:" ~! B0 x0 G2 y/ g$ b( O
  terry:12345; L( U  b4 y* U4 _. ?
  同样要修改文件属性如下:4 X3 {* o; M1 v; W) K( o0 }3 h
  # chmod 600 /etc/rsyncd.secrets
% }, d* Q' Q' V( T. D# B# l1 Y
  四、利用rsync保持Linux服务器间的文件同步实例
( s( |5 K. d! T% Z: T  现在假设有两台Linux服务器A(192.168.100.21)和B(192.168.100.90),服务器A中的. P2 a6 e% l$ j. N1 [
/home/terry和服务器B中的/home/terry这两个目录需要保持同步,也就是当服务器A中文件发生# H' x% T( N( Q8 Q7 a
改变后,服务器B中的文件也要对应去改变。1 q) P. N5 \8 p  f) }! z, Z% Q
  我们按上面的方法,在服务器A上安装rsync,并将其配置为一台rsync服务器,并将/home/terry) C: W# k: T) I/ H; P
目录配置成rsync共享出的目录。然后在服务器B上安装rsync,因为B只做客户端,所以无需配置。
0 x) I* J) ~$ O8 @5 n6 W7 x+ f然后在服务器B,建立以下脚本:" F7 A! Q$ Q" r5 r! Z
  #!/bin/bash
* [% d9 C* O. G/ u  /usr/loca/rsync/bin/rsync -vazu -progress --delete
; o  q, L+ i9 W" i  --password-file=/etc/rsync.secret terry@192.168.100.21:/terry/ /home+ w4 _1 h- V2 q5 P
  将这个脚本保存为AtoB.sh,并加上可执行属性:  l$ L& D6 Z2 j
  # chmod 755 /root/AtoB.sh( J0 A! ~# K/ `2 o- ^
  然后,通过crontab设定,让这个脚本每30分钟运行一次。执行命令:
+ A9 k7 U  r6 ~+ `; [  # crontab -e) }  f5 b; U" b) i* _0 ?
  输入以下一行:
/ U0 ?1 r- _0 K7 Z5 Q  0,30 * * * * /root/AtoB.sh( d/ D$ U+ H; `( N8 E
  保存退出,这样服务器B每个小时的0分和30分时都会自动运行一次AtoB.sh,AtoB.sh是负责
: E- A; P6 ]  A+ V5 a9 K: U1 R/ X保持服务器B和服务器A同步的。这样就保证了服务器A的所有更新在30钟后,服务器B也一样取
$ L" F* y; ~' }5 v9 V7 x/ f得了和服务器A一样的最新的资料。1 d4 k! E4 j4 F, S
2 p/ O  f$ k& ~: W) Q0 Z* ~- d* a+ L7 b
  五、其它应用; [- g/ P& f4 z9 t4 B, U
  rsync除了同步文件及目录之外,还可以利用它来实现对远程网站的远程备份。如果再结合脚本和Crontab就能实现定时自动远程备份。其可以实现与商业化的备份和镜象产品的类似效果,但完全免费。
$ |5 i5 F# N2 Z4 L
# I! N) R5 q/ k' o7 z         附:rsync有六种不同的工作模式:& Y$ z3 c( e( U
  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。
3 B, E% k# ~2 e+ o  2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST6 Q* Q1 b3 x- }! q8 `
路径地址包含单个冒号":"分隔符时启动该模式。3 R1 }* }% c3 p( m9 H4 y
  3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC
9 F9 B: ~7 f$ ^% [( _& c( n地址路径包含单个冒号":"分隔符时启动该模式。2 `' O. b. }5 O% j+ {% u2 @9 U
  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
- f6 q% o% M' }) C. A7 d  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。
, X3 `) Z8 E' l- ]  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
% Z5 `5 _% A7 ~/ \- L$ a
4 G- r! d+ e/ {% E% w, P2 n' P/ }8 {" w3 J$ A; r- h9 ]1 {
' L- g0 u$ y8 k4 `+ ]* _

( w+ L: k$ x! D" b" h  L# O8 t- p
/ N6 l: q5 Z  J2 O! G' z' N. S) Z9 u: Q. J7 ]* c3 s6 a! }4 }
' j3 @* v+ j/ G- Q/ Y
2 j5 ?$ X; T$ _6 h- ]

) e" p) d% h  |8 |; t5 O  前段日子在网上找rsync daemon的filter等过滤规则的详解,怎么也找不到,哥一怒之下,决定自己动手翻译,于是有了本文…
. `9 R- N$ Q3 [0 H    本文内容翻译自rsync的官方文档:http://rsync.samba.org/ftp/rsync/rsync.html,以及http: //rsync.samba.org/ftp/rsync/rsyncd.conf.html,非完整的全文翻译,并且按照我的需要,对原文的相关章节或 条目进行了适当的重新编排。官方文档发布日期:26 Mar 2011。# c( z: L: Q- [/ b# \3 {; A
4 `1 J/ g: ]' X% C
    rsync是Unix/Linux系统中一款优秀高效的镜像同步和远程数据备份工具,它可以把本地文件拷贝到远程主机,或从远程主机拷贝文件到本地,也可以在本地的两个目录之间进行拷贝,但不支持两个远程主机之间的互相拷贝。7 k! ~1 X' ?. ?8 R  m& a$ O0 |7 S

* I, m* y  y; `: y/ \6 ^, I3 o" _) @! }
    关于rsync的工作方式:' @- w7 y! v3 f+ w
    rsync连接远程主机进行同步或备份时有两种途径:使用远程shell程序(如ssh或rsh)进行连接,或使用TCP直接连接rsync daemon。
3 F8 x$ u+ ]. K4 a    当源路径或目的路径的主机名后面包含一个冒号分隔符时,rsync使用远程shell传输;当源路径或目的路径的主机名后面包含两个冒号,或使用rsync://URL时,rsync使用TCP直接连接rsync daemon。3 E  {3 j/ f0 |6 R( R' j, U
    特别的,如果只指定了源路径,而没有指定目的路径,rsync将会显示源路径中的文件列表,类似于使用命令ls -l。
  {$ _; B2 c  a! B
& n, S8 ]+ g$ w! n) `9 g, Z% ` rsync把本地端看作client,把远程端当成server。注意:不要把server与rsync daemon混淆!daemon一定是server,而server却不一定是daemon,也可能是远程shell的衍生进程。
: B8 {3 B5 V% n3 n    至于什么是daemon,以及远程shell衍生daemon,下文会有说明。; \6 }5 _' [* |# R5 J
$ L' p6 o+ ]# ]6 C) ?, s

4 S2 O' w: C$ A  Z$ I) n& Q0 @    关于rsync的安装:( `* z( A, Y- e( [0 r
    rsync安装方式是最常规的./configure && make && make install,只是要注意:源机器和目标机器都要安装。
. m' l/ ^" I; Z6 V
. {- e5 H: @( b0 S1 t* _
( \* l) {) I4 o    关于rsync的启动:
/ c% f1 s7 k3 l! I    前面说过rsync在进行同步或备份时,有两种途经连接远程主机:使用远程shell,或使用TCP连接远程daemon,可以把它们分别称之为shell模式和daemon模式。只有daemon模式才有启动rsync一说。
% I; W7 [& E* y% t% x    如果使用shell模式,rsync安装完成后就可以直接使用了,无所谓启动,也不需要任何配置文件。远程传输时一般使用ssh作为传输工具,当然,也可以使用参数-e来指定一个远程shell。6 h$ I' j$ {' |' G0 N6 L
    如果使用daemon模式,就无需远程shell了,但必须在一台机器上启动rsync daemon,默认端口873.
# @1 f2 N  d. o" J2 I* R0 `" f, T! E( d1 e: ]: s
    你可以经由inetd启动daemon,或者作为一个独立进程启动daemon,或者由rsync client通过远程shell启动daemon。
$ e) K6 t* I2 t+ y8 u" u     1)如果把它作为一个独立进程来启动,只需要运行命令:rsync --daemon即可;
! y1 W- k7 n4 H& I& ^* k& T! t     2)如果通过inetd来运行,要修改两个文件:/etc/services和/etc/inetd.conf:, J5 g3 S7 Y# P" E9 R; h
      在/etc/services文件中添加如下行:rsync 873/tcp
' m; b( P% O" W# B      在/etc/inetd.conf中添加:rsync stream tcp nowait root /usr/bin/rsync rsyncd --daemon; e9 }; z, a, q
  注意把/usr/bin/rsync换成你的rsync安装目录!然后重启inetd服务,使配置文件生效。
( R6 g/ x+ H' a6 E, N
  i1 n  @( d/ R$ k& q% B    关于由client通过远程shell启动daemon,官方文档中有一个条目:USING RSYNC-DAEMON FEATURES VIA A REMOTE-SHELL CONNECTION。
7 I. p8 o* t, @: I9 L    条目中说,rsync支持这种用法:使用远程shell连接host,然后衍生出一个single-use “daemon”服务器,来读取远程用户家目录下的配置文件。从用户的角度看,通过远程shell连接而启用的daemon传输,它的命令行语法跟正常的 rsync daemon传输是一样的,唯一不同的是,你必须在命令中使用--rsh=COMMAND来明确远程shell程序。如下例:9 b  [: N: r( o$ K9 L- m1 T& S
    rsync -av --rsh=ssh host::module /dest
( E$ J" P, B: A  译者注:虽然官方文档中说这种用法在某些情况下很有用,但我觉得很别扭。
; ^6 M" n6 N" D! ?' A: A' ]
* [& N& u  i* C! U6 i    当rsync作为daemon运行时,它需要一个用户身份。如果你希望启用chroot,则必须以root的身份来运行daemon,监听端口(1024 以下,默认873),或设定文件属主;如果不启用chroot,也可以不使用root用户来运行daemon,但该用户必须对相应的模块拥有读写数据、日 志和lock file的权限。% ?& ^/ [9 n# Z! y
    当rsync以daemon模式运行时,它还需要一个配置文件:rsyncd.conf。修改这个配置后不必重启rsync daemon,因为每一次的client连接都会去重新读取该文件。
" [. r. d2 Y8 ]    译者注:关于配置文件rsyncd.conf的设定,后面会有详细的参数解释。
& c" x+ F! e( C, o2 A/ t, ^4 X1 c, O+ ]
    关于rsync的两种模式:2 E+ N* q9 g" m1 T! @* f( M
    该部分额外的内容来自IBM官方网站上的一篇文章。该文章把rsync的运行模式扩展成了四种,但我认为rsync官方文档的两种模式的划分更加合理一些。2 H. K3 \' h: X  Z
    所谓rsync daemon,就是在一台机器上永久运行的rsync进程。在任何一台安装rsync的机器上运行rsync --daemon,则这台机器上运行的rsync就是rsync daemon。我们可以把文件发送给daemon,也可以向daemon请求文件。
1 U7 N3 t& {; Q% b, L5 Q0 R    daemon模式非常适合创建中心备份服务器,或项目存储库。: l  ?7 y4 p; y
    两种模式的区别前面已经说过,shell模式在源路径和目的路径中使用一个冒号,而daemon模式使用两个冒号。
5 c! Y0 G0 ~% z3 w/ D- b# H7 }
4 G( ?4 t1 B2 S5 I; u    关于rsync命令的语法:3 {, d3 \7 l1 R6 M4 @

5 W- L: ?8 o  I. w, K+ c本地拷贝:    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,仍然是推动作
+ P+ K- t+ R2 u7 L0 S2 y4 I8 T) g    官方文档的举例:
; \$ v7 s/ R. e) Q7 q3 g& V5 I    1)rsync -t *.c foo:src/, t+ X' D: }0 r0 `  B- y
        把当前目录中所有以.c结尾的文件传输到机器名为foo的src目录中。如果某些文件已经在远程主机中存在,则跳过该文件。
9 Y4 _4 ]5 j4 J. Y( I/ R4 n    2)rsync -avz foo:src/bar /data/tmp
+ Y! A# r* p/ C  D9 D         从机器名为foo的远程主机上把/src/bar目录及其下所有文件传输到本地机器的/data/tmp目录中。注意:源路径src/bar的最后没有斜杠”/”!- W2 k9 e4 K9 m
        源路径的最后是否有斜杠有不同的含义:有斜杠,只是复制目录中的文件;没有斜杠的话,不但要复制目录中的文件,还要复制目录本身!9 }; J+ D) Z0 [' [) p; ~/ C
        目的路径的最后有没有斜杠,对传输没有影响。
* K+ }  q3 S0 S1 t% s, Z    3)rsync -av host:file1 :file2 host:file{3,4} /dest/* n" {+ D0 d/ }, S
         rsync -av host::mod/file{1,2} host::mod/file3 /dest/" A7 h6 B8 w( j: O' e
         rsync -av host::mod/file1 ::mod/file{3,4}
7 @: l+ n9 f" n# u* b; C; D        这个例子是rsync更高级一点的用法,使用rsync同时传输多个指定文件。2 ~; u; h  M1 ]3 [+ e, \; ]4 \! h1 w
    rsync可以一次传输多个指定的文件,方法是添加多个远程主机参数,或忽略主机名。如上例。
7 U& U1 L% f/ ?: {, L
8 e; N$ B( ]4 o    关于rsync命令中的选项:# c# j- P" L( m% H! ?! |- s
    上面例子中提到了一些选项,rsync的选项有很多,请参考官方文档。常用的选项如下:
( S2 r# Y6 C. o7 ^* ~5 D) a1 U% @* y. x0 s3 F( ?& _8 e
-a:归档模式,保持文件的所有属性,相当于-rlptgoD -r:递归模式 -e:指定一个远程shell -z:文件传输时进行压缩处理 --delete:镜像中常用,删除DEST中那些SRC中不存在的文件% g2 f6 S9 ~- s! R* H6 W
 daemon也有一些常用选项,下面会有介绍。& C7 F" Y2 h3 j: v, H
; n, s' g/ Z. g* r3 i
    client如何连接rsync daemon:, g+ c# U, V8 B6 m2 A9 z- U  ~
    上面第3个例子已经给出了client连接daemon的语法示例。但是官方文档又把本条目单独列了出来,提醒我们在连接rsync daemon时要注意的几点:
% L8 I( f2 H7 T* q0 W    1) daemon模式中的源路径,即SRC,实际上是模块的名称
0 |" q! i( U) m" E0 |    2) 如果未在双冒号::后面指定源路径,则rsync会列出daemon上所有可能的模块
/ J' Z' w$ Z6 G4 B, {    3) 不要使用--rsh(-e)参数
% u: W& P4 F. L* P    4) 有些模块可能需要密码认证,你可以使用--password-file选项,来指定密码文件% k7 r; y3 C( h! W# f/ I

: D0 B. |. r7 `6 Y  C    启用一个rsync daemon来接受client的连接:
) J; R' J0 J0 b2 X- `    除--daemon外,rsync daemon启动时还有其它一些常用选项:$ G( H2 [; u1 ?3 o+ W" F4 ^8 _" D; F
    --daemon:
( W" C* V. z- \9 E. P7 S      使rsync作为一个daemon运行。daemon有两种启动方式,前面已经说过。对client发出的每一次连接请求,daemon会读取配置文件rsyncd.conf,然后做出相应的回应。
& h0 q) E- d2 ~$ K( i    --bwlimit=KBPS:
. a; m; n4 z6 h. d1 n4 J4 x, U      指定daemon每秒传输的最大千字节。client在请求连接时也可以指定一个--bwlimit值,但该值不能大于daemon端的设置。, d0 S# c* r+ H% N. l. \2 k
    --config=FILE:& s- V, e+ D7 K
      指定daemon的配置文件。只有当rsync以daemon模式运行的时候,该选项才有效。默认的配置文件为/etc/rsyncd.conf,除非 daemon是通过远程shell运行,并且远程user非超级用户,这种情况下,配置文件rsyncd.conf默认存在于当前目录(在$HOME目录 中比较典型)。关于通过远程shell启用daemon,见上文。
# r* X1 o6 ~& \3 G9 x6 u8 A    --port=PORT:
& P  S/ w+ J, }4 B. J* F      指定daemon监听的端口。
) d$ D0 t0 q0 o* Y; k8 f7 v    --log-file=FILE:
$ z+ m" {; o) P, x  y2 `      该选项告诉daemon不要使用rsyncd.conf中指定的log文件,而要使用此处指定的文件。此选项很少用到' C8 j# ?1 r& q9 s+ x

% B" [/ r- J5 }/ q6 F
  Q1 l! }7 b% R/ c* V; W) R+ y; }" b
rsync 远程数据同步工具详解
. t9 h) N3 {1 Z7 z: T& z! ~
& w2 J1 B6 ^& C: b- {! A0 s* g9 u# ?rysnc(remote synchronize)在CentOS系统默认安装在/usr/bin,此外rysnc在windows平台下也有相应版本。主页地址为: http://rsync.samba.org/. s$ Z8 r+ B5 e/ r) e

  t( m8 [7 c% F/ a' E$ Lrsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远 程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。
. r! ]$ O0 N* L9 T1 v8 _2 ]" V+ O3 R4 v4 ?  G0 q' p0 [
rsync本来是用于替代rcp的一个工具,目前由rsync.samba.org维护,所以rsync.conf文件的格式类似于samba的主配 置文件。rsync可以通过rsh或ssh使用,也能以daemon模式去运行,在以daemon方式运行时rsync server会打开一个873端口,等待客户端去连接。连接时,rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份。4 k9 e; ^/ b4 I& q
+ X: ?- H, z: ~2 p0 \; q+ z* S
------------------------------------------------------------------------------------------------------------------------------------------------------------
; ?2 I. M' M1 h( N
# J- |1 U0 _8 ^' x9 g/ T: Nrsync的命令格式可以为以下六种:
6 ]) I6 u, N" f& z2 X$ l/ }" Y3 R5 X& e7 Y  c
  rsync [OPTION]... SRC DEST3 z2 _8 o1 M3 `, z
  rsync [OPTION]... SRC [USER@]HOST:DEST4 B" L" d) m- t+ d# C8 e/ e
  rsync [OPTION]... [USER@]HOST:SRC DEST5 a% ?5 `  K: I* V& v  e! R& s" K
  rsync [OPTION]... [USER@]HOST::SRC DEST, D7 m9 O" @" S9 K0 \. \
  rsync [OPTION]... SRC [USER@]HOST::DEST+ i; i& s9 @) |6 c$ P( f5 Y/ I
  rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
5 j( T. X7 b, H* n1 ~( i. X
% J( v5 i% X8 J2 M  对应于以上六种命令格式,rsync有六种不同的工作模式:
& d- ]  u! q% ~, n
- _$ o$ v. t3 m. T9 ]# i/ U  1、拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。如:rsync -a /data /backup
  f. J3 {+ d0 c& y* z) [- u  2、使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。如:rsync -avz *.c foo:src6 D3 o( c1 Q3 E0 z2 G
  3、使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。如:rsync -avz foo:src/bar /data* d( P4 J: B; J! w1 j% ~7 o
  4、从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。如:rsync -av root@172.16.78.192::www /databack
. u3 [7 T( k! {% H! o! w  5、从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。如:rsync -av /databack root@172.16.78.192::www
7 P! G  O4 S) E8 h! n$ |0 o: y3 G  6、列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。如:rsync -v rsync://172.16.78.192/www
. j4 s: U- e; y! T2 Y. @7 A% [0 u( P
5 |; I( T( n* o6 q% Lrsync 命令常用参数 9 k* }! U9 W6 W0 q1 H% L1 v
-a 递归方式传输文件,并保持文件属性,等价-rlptgoD不包含-H
) M' t# V$ h$ a! d0 ^-r 子目录以递归模式处理4 E6 _; J( t- r2 D- J' t
-l 保持符号链接文件2 X  M; Y1 q3 |' c2 _/ e
-H 保持硬链接文件
3 i  f  P8 c3 `* r) i/ r-p 保持文件权限6 t7 m& R5 @$ ^% F
-t 保持文件时间信息
: l* N  M2 j" I' s( P5 ]/ `-g 保持文件归属组信息. f7 G! i8 o6 t6 _" d( A" a% D
-o 保持文件归属用户信息: M4 m5 [& S2 J( y$ O2 [
-D 保持设备文件和特殊文件6 h7 g' V/ B! e
-z 在传输文件时进行压缩处理
  F) |! N) L/ E! }1 l( F- T1 h5 w$ T, F--exclude=PATTERN 指定排除一个不需要传输文件匹配模式
1 @: J! i# U8 @7 a) B--exclude-from=FILE 从FILE中读取排除规则0 w1 X/ I# p( z1 k5 c: e
--include=PATTERN 指定需要传输的文件匹配模式9 P' p0 H+ @: H& x/ t$ x  W
--include-from=FILE 从FILE中读取匹配规则9 L4 C0 ?! N7 D
--copy-unsafe-links 复制指向复制源路径目录以外的链接文件: _) P) |1 L, G/ N4 P: \1 }5 u
--safe-links 忽略指向复制源路径目录以外的链接文件(默认)
. f# Y- a6 Y4 o- z# T0 F0 J+ R! y3 [--existing 仅更新那些已经存在于接收端的文件,而不复制新创建文件% J4 Z( Z7 a& A, l3 d3 c0 H/ s& ~' X
--ignore-existing 忽略那些已经存在于接收端的文件,只复制新创建文件7 Z9 k, o4 Z" L0 C& u
-b 当有变化时,对目标目录中的旧文件进行备份( z, w( Z* W3 J  n1 N
--backup-dir=DIR 与-b结合使用,指定备份路径2 U' n  g) h; [' v2 T/ z8 S. t
--link-dest=DIR 当文件未改变时在指定路径创建硬链接文件
, a8 E! l( n3 L1 g7 j2 k--delete 删除接收端还存在而保存端不存在的文件
% J2 ^( i5 y  b4 y2 L, G7 O8 l% T--delete-before 接收端在传输之前进行删除操作(默认)" b4 ?1 s1 W* F& [, |# i: w
--delete-during 接收端在传输过程中进行删除操作4 U! q# x3 a  ?' Y3 z9 h' q3 p
--delete-after 接收端在传输之后进行删除操作$ u" K( |) }3 X
--delete-excluded 接收端在传输同时进行删除操作$ H) _( m$ E! B$ G
--e,--rsh=COMMAND 指定代替rsh的shell程序,例如可以指定为ssh
* O( ?. Z2 \9 K  M$ |" q8 Y: q--ignore-erros 即使出现I/O错误也要进行删除
3 d1 ]3 h! ]* u. N--partial 保留因故没有完全传输的文件,以加快随后的再次传输1 d$ v: i4 t4 T1 K; H
--progress 在传输时显示传输过程
$ F4 y1 g3 }4 o7 z% J-p 等价于—partial—progress) X2 r- R. h5 J  E+ i, a
--delay-updates 将正在更新的文件先保存到.~tmp~临时目录,待传输完毕再更新目标文件9 @& K+ k# b- X
-v,--verbose 详细输出模式' Z& A9 ]( j1 p9 M, D6 w, E4 ^
-q,--quiet 精简输出模式1 m. k) C5 e9 m; F+ `6 C. d" M
-h,--human-readable 输出文件大小4 n* L8 t1 K3 P- [( n6 j
-n,--dry-run 显示那些文件将要被传输
' C, [3 h5 d& |9 |3 n0 j--list-only 仅列出文件而不进行复制# o- x7 z" a" l
--rsync-path=PROGRAM 指定远程服务器上的rsync命令所在路径; g) A; ~# b! F& u# p$ `, z" H" ^
--password-file=FILE 指定从FILE中读取口令,避免在终端中输入口令+ @1 q& q3 p& ^$ r
-4,-6 使用IPv4或者IPv6
  t6 B- }* A3 I  @7 i) D3 V--version 打印版本信息4 }% p4 c# e! a. y7 |
--help 显示帮组信息5 n$ H0 Z" u  h: d
% ?5 w' ]) Q7 }( d: _4 N
* m( v5 l  z; f) }* J( L
注意: 若用普通用户身份运行rsync命令,同步后的文件的属主将改变为这个普通用户身份;若用超级用户身份运行rsync命令同步后文件属性保持原来用户身份不变。若指定-tg但目标计算机没有指定用户和组,则复制的文件归入501用户 501组
3 n* r2 E: t$ ~( t# Y0 n+ F% J# A( r& k! A. E# R
------------------------------------------------------------------------------------------------------------------------------------------------------------% x6 Q3 E6 b8 f0 C; @
. C4 o" l8 N: u$ Q- k
启动 rsync 服务
1 x2 ]( U4 q$ I( f" I1 e9 b启动 rsync 服务 - D, v% c! A3 t; ~0 [3 n
vi /etc/xinetd.d/rsync  把disable = YES改成NO; b8 K) j% h- ]$ I9 y
service rsync
9 B& B6 r  K3 o/ E$ |! K: e5 `. R{
6 p" ?. X' B' m# f        disable = no
3 K2 O% @  ^8 i3 r* a, O" y        socket_type     = stream
: m+ x, r4 Q; H# B) t        wait            = no
* T3 j1 W5 A1 Z2 C0 h8 Q        user            = root
5 J) N0 n. m6 X& v2 Z7 a& ^5 ]% J6 b        server          = /usr/bin/rsync
7 E" d* C( h: a" ?        server_args     = --daemon  E6 b! w4 [1 k) E! a9 q
        log_on_failure  += USERID, a/ q9 q  d7 `6 m6 X
}
  y+ O& q( B% M5 B/ w0 I* J0 Z) ~2 K0 M: v
: K& v( @: w5 Z* P- F
8 {- u6 W" d: H( k6 u' k
配置服务端 rsync
# |# p$ Y. n4 _' j  lrsync 服务器可以独立运行也可以由xinetd运行,CentOS默认以xinetd运行,同时默认监听873端口。需要创建rsync配置文件 vi /etc/rsyncd.conf% D; L. x, u, e* X- {+ y9 i
在文件中[module]之外的所有配置行都是全局参数,也可以在全局参数部分定义模块参数,模块参数主要功能定义哪个目录要被同步,可以根据需要来定义多个模块 uid = root
4 J1 r! _1 @5 s" |9 s9 E+ j- ngid = root
7 b' d" p4 C% B2 ~" c7 g3 tmax connections = 103 S/ q  M/ E, P. U) M3 _6 ~7 T
use chroot = no 9 U" W: C; e8 y
log file = /var/log/rsyncd.log * i  e- S3 A- B# d  I6 J6 D
pid file = /var/run/rsyncd.pid
# G2 N8 L1 {+ j1 w- o* A7 ?lock file = /var/run/rsyncd.lock 6 `/ P) `' a6 L2 L! G
+ @- A! c# ^+ A
[tongbu] : p" ]8 r7 }3 u* E9 D( r
path = /opt/tongbu
6 J2 ~/ y& [6 h* n4 I) ?comment = hello world
1 L' \5 H0 a7 Rignore errors = yes , N& n5 R2 G7 l
read only = no " c$ d8 J/ h3 \5 _; @" Q0 d
hosts allow = 192.168.1.125
% X0 E% p- ^6 t6 O0 Yhosts deny = *
4 d0 U( K0 \- Z& O/ v1 c7 c' ?; a(可以匿名连接,不安全,详细参考以下)
. D: R. M. n3 d# j' r! H# ]+ @1 n启动并设置随系统启动 rsync,要求 服务端和客户端都启动 ,否则使用的时候报错Connection refused
. o8 Y9 }3 o7 b
- Y6 ?! J) U  ?  M8 c  b
" ]; n) T. }7 ~& P" P9 ~+ {+ ]2 yrsync --daemon –-config=/etc/rsyncd.conf
) i6 ^" A7 ^. E, M$ [' o8 mchkconfig rsync on
7 U& M; `6 y5 q& q: t% W2 k
* W; _( M% S8 N: f9 V/ v$ r& D9 y6 K
------------------------------------------------------------------------------------------------------------------------------------------------------------8 ?4 U) s6 U6 @- d
/ p3 O2 [% A8 e9 r
全局参数
2 a. J$ N' p' ~address 指定的服务器运行的IP地址。由xinetd运行时将忽略此参数
; b' w. _3 b. xport 指定rsync守护进程监听端口号(默认873)。由xinetd运行时将忽略此参数* z$ v& C( m. T+ A6 _% L
motd file 指定一个消息文件,当客户连接服务器时该文件内容将显示给客户
3 {% ]# m$ {6 S/ U/ _pid file rsync的守护进程将其PID写入指定的文件
. m0 Z0 M5 {0 E! ^/ H+ e+ f/ I- ?log file 指定守护进程的日志文件,而不将日志发给syslog9 R' z8 K$ @4 {% j9 d; e
syslog facility 指定发送日志消息给syslog时的消息级别
. F- W/ a' t. x9 _6 [socket options 自定义tcp选项
# s) X' }2 [& F8 f; s" h- \( K1 }% s# {2 X" _
基本模块参数
- _% b& [8 [7 x) v6 g: F1 K8 `* C) ppath 指定当前模块在rsync服务器上的同步路径,必须指定
; q' k5 G  }& W% Hcomment 给模块指定一个描述+ c0 O0 {& w" V0 c6 n
控制模块参数  k* m% c" }, [
use 默认为true,传输文件之前先chroot到path参数所指定的目录下,这样做实现额外的安全防护,但缺点需要root权限,并且不能备份指向path外部的符号链接所指向的目录文件/ V  K: B" E7 R# Q: L
uid 制定该模块已指定的UID传输文件' f- O. z* x* d
gid 指定该模块已指定的GID文件
1 R7 D- E! s; T' q1 R+ Emax connections 限制最大连接并发数以保护服务器,超过限制则提示稍后操作6 d7 Q$ Z8 T9 y3 I9 s0 ?4 [' ^6 ?
lock file 指定支持max connections参数的锁文件,默认/etc/run/rsyncd.lock
: y" j9 N* g& V/ w  {9 W- Q( Dlist 指定当客户请求列出可以使用的模块列表时(默认ture),该模块是否被列出。如果false,可以创建隐藏的模块+ L8 e* n7 o- J: V
read only 是否也许客户上传文件,默认ture则不也许上传。为false并且服务器目录具有读写权限则允许上传- T. D/ J3 t; ?) o% O
write only 是否也许客户上传文件,默认ture则不也许下载。为false并且服务器目录具有读写权限则允许下载
- ?& u( c, V; xignore errors 指定rsync服务器在运行delete操作时是否忽略I/O错误
: U( }' K0 ~! [. u% \& \7 Jignore nonreadable 指定rysnc服务器忽略那些没有访问文件权限的用户/ A% w/ d' J; F9 u( X( N) ~
timeout 设定连接超时时间,单位为秒
) ?% ], C$ m3 _/ Qdont compress 告诉rysnc那些文件在传输前不用压缩,默认已设定压缩包不再进行压缩0 w8 ^! }& T( ]$ f. I
refuse options 定义一些不允许客户对该模块使用的命令选项列表& h4 X8 ~5 X) J% {$ j, p" K; m( i5 N
文件筛选模块参数
9 x5 `5 |# K5 d0 R# S* Yexclude 指定排除的多个文件或目录,由空格隔开, w$ e& O9 e" z* r
exclude from 从指定文件中读取排除规则
4 R2 B, Q# P3 d0 \1 i5 [include 指定包含复制多个文件或者目录,由空格隔开
: ]( I! V! b* ]% y! N5 p. pinclude from 从指定文件中读取包含规则7 g; J0 {( ~# y
用户认证模块参数
. {+ T2 b5 p2 _auth users 指定用户才允许连接该模块
$ Z7 S) g. A& Q6 w+ w4 ^secrets file 指定一个口令认证文件,格式是 用户:密码,即指定用户和密码连接匹配才行,不匹配的话会提示ERROR: auth failed on module,不设置该参数则可以匿名连接。
& |; s8 w* u1 n5 ?( @strict modes 指定是否检测口令文件权限。rsync认证口令文件权限一定是600
/ w" s8 {0 C' F1 V; G; M; ?访问控制参数
/ ]( C' y3 P; Xhosts allow 指定哪些IP可以访问该模块
4 Z$ q: D' U: E+ ]2 Z% t/ i& Ahosts deny 指定哪些IP不可以访问该模块,*表示全部
' Z1 g' P7 x$ k. H1 ^2 q. I1 p1 S! E! ?, g5 b: W( @% u
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 21:39 , Processed in 0.082285 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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