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

Ubuntu下 rsync同步文件实例

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2016-8-29 13:50:37 | 显示全部楼层 |阅读模式
Rsync(remote synchronize) 是一个远程数据同步工具,可以使用“Rsync算法”同步本地和远程主机之间的文件。5 i! |7 ]5 S1 y( e5 W
rsync的好处是只同步两个文件不同的部分,相同的部分不在传递。类似于增量备份,
. u% D2 Y/ ]) m4 ~/ U" R# l这使的在服务器传递备份文件或者同步文件,比起scp工具要省好多时间。# n. v% p) ?$ T. [& m
OS:ubuntu server 10.04
8 b9 ^3 E) w3 J& C+ _+ h; P% `server:192.168.64.128  G) N( [$ B+ o! t
client:192.168.64.145" g$ ]3 x5 o9 m, d1 i+ }
server; O% K  Y/ M) X2 w3 d  N9 |  }
1.ubuntu  server 10.04默认已安装rsync,rsync服务默认不是启动的,我们要修改下面的文件。
8 v: T9 K% x: T0 Z8 @! S9 k& t$sudo vi /etc/default/rsync% A4 o% ^6 `7 j( b
RSYNC_ENABLE=true   #false改true! |' v/ G* x$ L) \
2.修改配置文件
) |: e* Z0 U, e( N' v$sudo cp /usr/share/doc/rsync/examples/rsyncd.conf /etc   #已默认安装的软件,默认不启动的似乎都要这么做
  t1 |& ^8 b; o3 d我们先来查看一下这个文件
0 T/ V7 [* |7 }% N/ m$sudo cat /etc/rsyncd.conf* D3 R8 G% k  V

4 D* u2 M# {% j" b8 O7 v( @# sample rsyncd.conf configuration file
1 H! G: l  b% G
# R# Z6 l0 K* P: W" X9 F/ d# GLOBAL OPTIONS
/ d  M/ z$ J( `" A/ ^( U
0 w- Z, k! }6 k& M) @; ~#motd file=/etc/motd #登录欢迎信息1 M, i5 v2 }3 t1 S0 {
#log file=/var/log/rsyncd #日志文件
+ U, \! T! K9 U# for pid file, do not use /var/run/rsync.pid if- t& C% j8 K) q: B$ o( W2 F6 Z& ?3 `
# you are going to run rsync out of the init.d script.
; ?" j6 r) g/ r. E- U& Rpid file=/var/run/rsyncd.pid
# L: g. A0 b" e, N6 L- G2 Q& B. S" R/ i& l- u* }) 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。) K, d) m& V) Q, J7 u" V: U9 Q! g7 T
#syslog facility=daemon% n; {( L$ g& {! o7 ?
' u& I# o3 _. Y6 s. |
#自定义tcp选项,默认是关闭的
9 X* |! w1 s  V#socket options=
" ^9 {1 @( B( J1 v, M4 Q
5 j5 b& k$ h% p* U! m#以下是模块信息,我们可以创建多个模块8 A& V. |2 j( |% M$ p( @5 S! t
# MODULE OPTIONS
2 ]: Q$ a$ t* G& N8 d3 E* f: q
+ p' j& Q0 Q: H  K1 t6 e[ftp]
! H  E( l0 K/ j2 {- N% n- ^
9 o2 H+ n) Z) Q8 S- n4 s        comment = public archive #模块描述6 O3 U1 f2 J# L* B. T
        path = /var/www/pub #需要同步的路径
- J/ I: l4 A& S' D. s- A: L6 z        use chroot = yes #默认是yes|true,如果为true,那么在rsync在传输文件以前首先chroot到path参数指定的目录下。这样做的原因是实现额外的安全 防护,但是缺点是需要root权限,并且不能备份指向外部的符号连接指向的目录文件。
, C. y3 E( z% I: [+ R6 T# }#       max connections=10 #最大连接数
+ F# }; a9 r* x) O: H4 }        lock file = /var/lock/rsyncd #指定支持max connections参数的锁文件。  w: G8 K7 q9 K; n& T
# the default for read only is yes...
7 e! z5 r+ Y. R8 {: |        read only = yes #只读选项
3 F) _" r2 X1 ^9 x& ]2 k3 v        list = yes #客户请求时可用模块时是否列出该模块9 T9 k0 p7 x: u4 s
        uid = nobody #设定该模块传输文件时守护进程应该具有的uid
) i' E) T+ T9 `2 t0 p2 W. H/ a        gid = nogroup #设定该模块传输文件时守护进程应具有的gid,此项与uid配合可以确定文件的访问权限
+ D* N5 O8 M# v! H' ^#       exclude = #用来指定多个由空格隔开的多个模式列表,并将其添加到exclude列表中。这等同于在客户端命令中使用--exclude来指定模式,不过配置文件中 指定的exlude模式不会传递给客户端,而仅仅应用于服务器。一个模块只能指定一个exlude选项,但是可以在模式前面使用"-"和"+"来指定是 exclude还是include    #这个我的理解是排除目录中不需同步的文件
, N3 z0 S- h7 z+ U5 q3 |- }#       exclude from = #可以指定一个包含exclude模式定义的文件名
8 u9 P3 m/ s% H5 D+ j% Z& F#       include = #与exclude相似: x2 Q" a, t3 _+ s, k$ }
#       include from = #可以指定一个包含include模式定义的文件名
' E; |4 O2 t: F1 R# Q#       auth users = #该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的 challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)
" c5 B, D, A- z4 V% b# j#       secrets file = /etc/rsyncd.secrets #该文件每行包含一个username:password对,以明文方式存储,只有在auth users被定义时,此选项才生效。同时我们需要将此文件权限设置为0600
) k% V- \7 Q% d4 m4 q! b        strict modes = yes #该选项指定是否监测密码文件的权限,如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认值为true- j5 _! j! O! Z  Y
#       hosts allow = #允许的主机
* z3 k+ n$ @( N* |0 z& h#       hosts deny = #拒绝访问的主机
  U( z2 W9 _! \! s( W2 B( G        ignore errors = no #设定rsync服务器在运行delete操作时是否忽略I/O错误
* f- B8 L5 Q1 f4 G$ ^0 ^/ U        ignore nonreadable = yes #设定rysnc服务器忽略那些没有访问文件权限的用户
7 Q- A2 d3 G- _  |. @        transfer logging = no #使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中
" y( J9 `$ k- X! h8 A#       log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes. #设定日志格式
+ Q. `. l+ T: }) [: @        timeout = 600 #超时设置(秒)
+ o2 F4 |  F$ E; D# n        refuse options = checksum dry-run #定义一些不允许客户对该模块使用的命令选项列表
# j3 O& G8 W% W  i/ R        dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz #告诉rysnc那些文件在传输前不用压缩,默认已设定压缩包不再进行压缩
9 B% A3 L4 ]" U" h0 c1 b8 ^4 f
# L& v/ b: d) r8 l& D
7 Q; {$ a2 N0 g+ S; Q+ B日志格式选项列表:
, }! b9 H& Q' q7 {7 X7 g%h:远程主机名1 j7 Y0 e4 n" ~7 y* z7 h4 _
%a:远程IP地址
' r1 \5 n2 G4 @8 ~& i2 F3 f/ A%l:文件长度字符数* B0 u$ y* ]  F" S
%p:该次rsync会话的进程id
- Y7 G9 \9 ?! l%o:操作类型:"send"或"recv"、”del.”
6 ^7 K& G4 _# u! Q# G" `" D%f:文件名4 Z$ j# V+ y4 Z) K3 N
%P:模块路径4 l; B- b* `! Z. [5 J! x9 {
%m:模块名
+ x! \7 k: M, W" H  o* ]%t:当前时间
; y, ~$ X5 F& p* ^8 t& n%u:认证的用户名(匿名时是null)
( @; y$ a0 X2 ^1 U$ e' R" t; q%b:实际传输的字节数  E% {7 p" P* s3 U" Z8 G# r/ ]
%c:当发送文件时,该字段记录该文件的校验码
! \0 u; c2 k5 Z! S$ |& t
5 V: Z8 o& u: H下面我们来定义自己的conf文件
1 x9 x: t3 E" `6 e& s
0 Y- S& N7 d6 O2 i- Y# sample rsyncd.conf configuration file8 \. ]/ ?4 M) J& L! Z- [% t
# GLOBAL OPTIONS0 f+ o9 j! h- H! r$ I' @: q
#motd file=/etc/motd
. |8 h5 h7 L+ H( e1 M. `7 [log file=/var/log/rsyncd, q9 g' W: Y; H- K! i% I3 w1 d
# for pid file, do not use /var/run/rsync.pid if5 Y+ d" `4 @; l) L$ a
# you are going to run rsync out of the init.d script.
0 |6 Q3 N: A+ n2 J pid file=/var/run/rsyncd.pid$ T7 }5 d' N9 H" n& o& t0 d6 _
syslog facility=daemon6 n, ^% c( f( i7 z! t
#socket options=
, k0 D+ Y. f9 e% n3 c! i# MODULE OPTIONS
& s% P3 j( Y: A( ]+ e[my_rsync_bk] #名字可以任意命名,只要客户端的rsync命令一致/ E0 B0 ?& j, O3 X% q2 P* O
        comment = public archive( r' D4 z6 y. X
        path = /home/rsync_bk                             #指定路径,如果没有这个目录自己建。
1 J+ |" H' S5 G) s5 l1 `, a- [        use chroot = no5 C1 d/ m' n; H
#       max connections=10+ a4 g8 e7 {8 l) N) z, G6 f4 p
        lock file = /var/lock/rsyncd
& y; j% X; M7 @: A5 _# the default for read only is yes...- P' H$ G! l7 K) A$ ?
        read only = yes
; M4 ]/ i, ]5 j/ ^        list = yes
8 |* A# d+ s$ E2 d        uid = nobody# h* C7 ], ?! d! n3 `
        gid = nogroup
! ]; j& m' c4 }) M. g2 R( A! k# L4 F#       exclude = 4 e. z1 J; Q6 d: t
#       exclude from =
1 z, Z$ U& G4 ?2 |: S#       include =% L5 f2 \2 k* A+ k" D0 @- K
#       include from =
$ p& Y: r+ X  @: s        auth users = liu_rsync              #rsync连接时的用户名,要和客户端rsync的命令一致$ [1 K: c# Y. |7 r! q
        secrets file = /etc/rsyncd.secrets #这里是保存密码的地方,如果屏蔽掉就不用密码了* z) C" C& `% r3 n
        strict modes = yes
/ [1 A0 a- i. _! `  c9 `: E        hosts allow = 192.168.64.145 #运行的客户端ip
9 t* ^0 P: h$ ^5 k& O#       hosts deny =3 o" t  H, G( _
        ignore errors = yes% [, Z- x2 T+ w" h) Q' O8 W% L5 E
        ignore nonreadable = yes
# D: `' ]" e/ v+ a9 D7 E        transfer logging = yes
, N/ f: J$ E& {6 g) V$ g0 u+ ]  o        log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.
) W$ H% K, S" K- x        timeout = 6007 i1 Y/ u; D# [' v* E/ O) e' ~# f+ ?/ p/ A: Q
        refuse options = checksum dry-run
: O- g0 G3 b! W/ f+ z+ G1 [        dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz! Z& O* o; _: Y0 f, s

; q* m% Q! p1 l; {
, t$ J" `: `) F  m( b创建一个密码文件
/ Z+ l! J* b0 z% ?) l$sudo vi /etc/rsyncd.secrets
1 {* Q! d( @/ o1 D+ o4 J liu_rsync:123
6 S( L1 S: t- U# T# Y- d3 V$sudo chmod 0600 /etc/rsyncd.secrets    2 ~; S' F) ]( w4 o) H5 V# }

) q/ L- d5 B  x) \- r0 y& v5 d启动rsync
" Z- H1 ?$ L! G" `6 psudo /etc/init.d/rsync start
: v9 u6 F) _/ Z0 w; T9 \) U$ o3 V- l3 D+ G0 o% L3 c
client8 N; w6 A- j: M4 A
我们再来看一下客户端的操作,一般客户端不需要进行特殊的配置,直接同步即可8 c' j2 @# z. j, d3 w' |
rsync -vzrtopg --progress  liu_rsync@192.168.64.128::my_rsync_bk .  #.为当前目录,在服务端touch一个文件,同步后就会出现,当然你也可以指定一个位置比如/databk,需注意所建立的权限!6 @4 y1 G( b. J& ?# Z/ z. K9 d9 f
  T3 v. G6 p8 c* u
我们把这个同步工作交给crontab去执行。首先我们要创建一个密码文件  c& x: W5 ?/ j# A4 ^
$sudo vi /etc/rsync.pwd输入123,保存     #密码要一致0 W' F/ l5 Q4 z0 V4 n# ^

( U  N, ^& G* t4 _" L$ o!注意:下面这两步操作是必须的,没有足够权限同步就会不成功,ls -l 你所指向的目录
1 M' h. N: ]* ]* a9 J* Esudo chmod 0600 /etc/rsync.pwd2 Z3 B3 n; ]0 e& O3 O1 \5 B+ T
sudo chown 普通用户:普通用户组 /etc/rsync.pwd- T" r8 y* [" J) F2 w' q3 r

/ I0 y# k" n8 `- u' N6 @& X然后我们打开crontab,使它自动同步, b; o5 E/ F7 m% _9 P; _
$crontab -e
8 k6 S3 V! s; k1 T* * * * * rsync -a --password-file=/etc/rsync.pwd liu_rsync@192.168.64.128::my_rsync_bk /databk   
# o0 V# t$ y, M' E# b! y3 |crontab随机启动  sudo vi /etc/rc.local1 j! E4 z: p/ ?8 `
参数说明:5 Y9 m% W* ?3 Y+ B: @) f0 A4 E
-v verbose,即详细模式
2 G: C5 u* K4 P3 k- c; V5 D-z 压缩
$ ]! B' e) x( t  W' n-r recursive 递归$ O! ^- |( X) q+ C+ y, p* j% @# r
-topg 保持文件原有属性,一般不用加9 d4 ?: l) I5 H5 W9 x
--progress 用来显示详细进度情况
8 f9 G' r- [' O! ?( f- ?" A/ q--delete 表示如果服务器删除了一个文件,客户端也应对应删除+ t4 O; f, p/ A( K
--exclude="*.sh" 表明不包括某些文件
2 O, V3 U3 M, r--password-file=/etc/rsync.pwd 指定所使用的密码文件
2 J' C, a$ d3 p* F% U- ~$ @最后一项是需要同步的目录  . U; f. \' a: c+ L9 V
注意指定使用的密码文件中只需要有密码,不要有用户名。# Y' h- w. M  V9 t
------------------------------------------------------------------------% s4 q5 w# `1 n/ W+ T" k
1.在本地机器上对两个目录同步! o4 Q: B  J0 P+ j$ w! q  {6 \! S9 p
$ rsync -zvr filename1 filename2
; v) b; X! J6 w. r# r( ^7 b9 Q* t8 p
上述代码是将filename1中的文件与filename2中的文件同步,如果将filename2中的文件同步到filename1中,修改代码为:; Y8 G) E' ~2 L. c- Y
$ rsync -zvr filename2 filename1$ m: l: A0 w& M# s$ p
# c% W) K: o; k4 @& B1 x
2.使用rsync –a 同步保留时间按标记
0 Q9 F0 d( ~) S7 z3 S* [$ rsync -azv filename1 filename22 n1 \% Y  {4 T1 ]1 Q9 h0 C$ x7 N

" n% y; t/ W2 s5 r1 S使用上述命令,将filename2中新同步的文件的时间与filename1中的创建的时间相同,5 P+ e+ a% h0 l/ ]& ^7 h
它保留符号链接、权限、时间标记、用户名及组名相同。
  [4 H7 F% R$ ~) ]# L0 K3.从本地同步文件到远程服务器
4 A# T2 k- c& x" A- H1 n/ _, Q$rsync -avz filename1 ubuntu@192.168.0.1:/home/ubuntu/filename2
0 F4 ^5 v$ I7 t8 M& Z" D
5 P9 I* V- p* o8 X) C上述命令是将本地的filename1同步到远程192.168.0.1的主机上。
5 X. W) v8 g, w& a6 F0 {注意:如果远程主机的端口不是默认的22端口,假如是3000端口,上述的命令修改为,
3 Z3 _: m2 V4 R$ rsync -avz '-e ssh -p 4000' filename1 ubuntu@192.168.0.1:/home/ubuntu/filename28 l: E& Q+ t5 w  D( S
7 w6 j% E. r: X% ?& I  t$ T9 U  C0 @
4.将远程服务器的文件同步到本地
0 ~* k; H2 P, j9 P与步骤3类似,只是将filename1与远程服务器的位置对换一下,
" ^# J9 R6 H  {1 j8 z$rsync -avz ubuntu@192.168.0.1:/home/ubuntu/filename2 filename1
% O. ^" H0 j) E  j$ c! K( [% g% L+ A% A8 N; R$ v, n/ I+ h  y1 R3 x( }
同理如果端口不是22,使用以下命令
6 x$ M. S# e% j$ rsync -avz '-e ssh -p 4000' ubuntu@192.168.0.1:/home/ubuntu/filename2 filename1 : U: l& e. v( X- M+ x3 Y2 @

, T( A7 `8 d! _1 V& N9 Y( Y参考:http://www.eduicc.com/read-24.html
$ _% ^! C/ P; A% t" A$ x2 Y; z1 v4 L$ M           http://jordy.easymorse.com/?p=273) _+ A* j/ `  N  T4 S" v4 a
) B1 P9 J" b0 j) Q

6 N2 z8 h5 U7 s" I. |
9 E" \4 H- a" d0 O
  C. g1 }' U9 }! d% ^2 n% Y 服 务器之间常常要保持些文件或目录的一致,比如一些大的软件下载网站,它们通常使用多台服务器来提供下载服务。当一台服务器上的文件更新后,其它的服务器也 需要更新,而且 在更新的时候应该是只对新增或是修改过的文件进行更新,否则会造成网络带宽和时间的浪费。rsync就是能有效的保持文件及目录的一致的 优秀软件。  D! y! X* k6 N! F
  rsync,remote synchronize
/ [3 \& W- T. N. I$ v+ }- a  顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息,而且可以通过ssh方式来传输文件,这样其保密性也非常好,另外它还是免费的软件。rysnc的官方网站:http://rsync.samba.org/,可以从上面得到最新的版本。当然,因为rsync是一款如此有用的软件,所以很多Linux的发行版本都将它收录在内了。你的Linux里并没有安装rsync,你可以按以下的安法自行安装: + ?' Q- B% ]* E' s9 K/ d, d
  一、安装过程7 k  T$ F- k6 _1 p5 f
  1.下载rsync
9 S. }7 ~- s0 E. q/ `$ V  目前(2003年9月)最新的rsync版本是2.5.6,从rysnc的官方网站上下载一个回来:
4 i! `! q+ y: O8 ^9 s& Y  # wget http://ftp.samba.org/ftp/rsync/rsync-2.5.6.tar.gz 0 Q: v, O( u2 z4 Z! {. P1 A
- U2 F2 \2 @2 U4 n' q& b8 o. L
  2.解压$ ]: I2 G, d6 s# i
  # tar -xzpvf rsync-2.5.6.tar.gz
8 p0 f7 s! O; Z; K* F) n* i. A4 I% c. {* d& U1 ]/ p5 r$ V
  3.编译安装8 y2 ?  P$ n! n7 J' `
  # cd rsync-2.5.6/
) p$ P3 p/ |4 J" h  # ./configure --prefix=/usr/local/rsync
! H3 s" j( I0 Z$ g5 ^! E  # make
3 h/ k: g9 J1 ^4 O" ^  # make install
  [$ i9 O" d( g! }" o5 p$ G  以上过程没有出现的话就安装好了,现在就有rsync命令可以用了,rsync命令放在
4 ~: F4 Z$ P. x2 N% R/usr/local/rsync/bin。用rsync命令可以去运行有rsync服务的服务器上抓取资料。
6 D& y  T* f; n8 J) F( F! n" L  E  如果要把当前的机器变成一台rsync服务器的话,就需要继续进行一些配置了。" b4 h6 X9 s8 j0 P$ r0 A

0 X9 k+ j! I& L8 d6 z+ L  二、配置rsync服务/ m' ^' _; @2 L# N
  配置一个简单的rsync服务并不复杂,你需要修改或建立一些配置文件。0 E6 M6 ^" i6 T& o" e: w  S
  1.rsyncd.conf
  s7 ~( ^0 K3 P$ T: Y  # vi /etc/rsyncd.motd
2 i; \8 f' k" p# a0 y$ l6 q9 ~  rsyncd.con是rsync服务的主要配置文件,它控制rsync服务的各种属性,下面给出一个/ D+ d9 F' W8 D) w2 x( S0 w8 |
rsyncd.conf文件的例子:
$ `3 a" w  R- C# g3 F9 [  p: b  #先定义整体变量! t6 f. k0 l9 n7 j5 q! ^
  secrets file = /etc/rsyncd.secrets1 c" j% G. c6 @% ~. {1 \
  motd file = /etc/rsyncd.motd5 Z& n9 {$ L3 j) O* D
  read only = yes# x6 x4 c: J" w0 ~
  list = yes
8 u8 Q3 W$ Y( v; W8 E# c% z  Z" D  uid = nobody
$ \5 n7 L0 m) q3 m4 \3 l  gid = nobody6 B/ @# {- I% ]2 b+ j
  hosts allow = 192.168.100.90 #哪些电脑可以访问rsync服务6 ?/ B" u, f# r
  hosts deny = 192.168.100.0/24 #哪些电脑不可以访问rsync服务
& L6 p- Z2 y4 h; M/ S8 I. G* w  max connections = 2
) ^" R  x2 b8 [( S" V( k2 V$ M3 f  log file = /var/log/rsyncd.log
0 _9 A) J* G' U8 x2 p! R# t1 k  pid file = /var/run/rsyncd.pid0 m2 h+ V' \3 o; u, r/ g1 T5 r
  lock file = /var/run/rsync.lock' w. A& F1 f, a* I
  #再定义要rsync目录
; R- H8 E( e' c' j  [terry], P+ {' \; p1 p
  comment = Terry 's directory from 192.168.100.21
3 _' b( L, }5 g+ ~  path = /home/terry
0 G6 `- k6 E, Z% u# }4 x4 y5 K' i  auth users = terry,rsync1 f9 [8 @) x' Y2 C$ ^. J& m* p
  [test]
# G% B; k* h# F( [, O: b2 f  comment = test rsync
& [' @& A* }& ?9 A/ I8 H  path = /home/test$ v4 S- K& n$ i- d0 r
   在上面的配置文件中,限定了192.168.100.0/24这个子网中,只有192.168.100.90的机器可以来访问这台rsync服务器的 rsync服务。配置文件的后面部分定义了两个rsync的目录,terry目录是只有知道terry、rsync两个账号的人才能使用的,而text目 录是无需账号就可以访问的。rsync在定义目录时还提供了一些其它选项,可以作更严格的控制。
5 t& V  L2 J0 e/ |* @3 i
! j# f4 z9 h9 G  2.rsyncd.secrets
( Q; a) g; D" u7 B- {5 m  # vi /etc/rsyncd.secrets
! I! [' z( B+ R$ H" ~4 `' H1 ~1 ]) f  rsyncd.secrets是存储rsync服务的用户名和密码的,它是一个明文的文本文件,下面给出一个rsyncd.secrets文件的例子:& n6 j4 k  O9 a& p! a
  terry:12345
" q$ f: J8 N, S( h' W* l7 B  rsync:abcde4 F% g, N3 C$ N
  因为rsyncd.secrets存储了rsync服务的用户名和密码,所以非常重要,因此文件的属性必须
. n& X& j$ ?) C& ?6 C/ ^2 \, Z- U设为600,只有所有者可以读写:
" ]8 d+ x+ q; p  B5 q/ Z7 p8 c5 r9 d  # chmod 600 /etc/rsyncd.secrets
# {) @* O  c% U. ]& W6 \& u2 K  o  T9 |% |2 C& j
  3.rsyncd.motd
( G% @$ _! n. e9 z9 Z  # vi /etc/rsyncd.motd( Z/ C5 G3 @! [* P( E
  rsyncd.motd记录了rsync服务的欢迎信息,你可以在其中输入任何文本信息,如:
9 P  y; t- U* m: Z: b  Welcome to use the rsync services!
/ |4 {2 S4 c+ u  K9 B" |& {
1 G, d. I4 i: X! H  4.services8 Y/ e; j' S0 h/ g
  # vi /etc/services
2 d. Z  C3 }0 W2 f# W  services并不是rsync的配置文件,这一步也可以不做。而修改了services文件的好处就在于: c. P, e+ b+ u8 S" ?
系统知道873端口对就的服务名为rsync。修改services的方法就是确保services中有如下两行,
- m% Z; i1 |8 s9 D没有的话就自行加入:
* L- _2 I+ h$ E$ S* `  rsync  873/tcp  # rsync
( R$ {. p+ {+ ^; W6 Y( ^  rsync  873/udp  # rsync
2 q9 v; Q7 q/ F$ y- R! q9 H6 K( ~* o  5./etc/xinetd.d/rsync( b1 M4 |" O7 A0 z2 B. \
  # vi /etc/xinetd.d/rsync
7 Y8 A: f9 `; G( v" v1 g  建立一个名为/etc/xinetd.d/rsync文件,输入以下内容:4 B% I% t5 e$ J/ I+ k7 T5 O6 Z
  service rsync4 o1 B* r: `. V+ ]/ F
  {
. Z9 \" h) L9 R5 [0 [& g    disable = no
* n  @1 [5 l. t& W    socket_type  = stream4 R6 f2 r1 W% E8 [# l$ R
    wait      = no7 v1 o2 Y) j' ]9 H2 A6 {
    user      = root' j4 b2 p: s% L& s. N
    server     = /usr/local/rsync/bin/rsync
% P& L( P, q) B6 T    server_args  = --daemon
! V; C% [7 m: j0 _2 ~9 R' u" F    log_on_failure += USERID
& l. ?! x( Q( \+ {  @6 b( n  }
& m5 O8 i7 \9 r) F5 w; h  保存后,就可以运行rsync服务了。输入以下命令:% F1 B5 [% j& _
  # /etc/rc.d/init.d/xinetd reload$ K! u5 g. j. }; ]8 K! a  A# l/ l
  这样rsync服务就在这台机器上(192.168.100.21)运行起来了,接下来就是如何来使用它了。2 t, \  a. R) N1 f$ W; N

4 r8 t) M/ F9 G9 t, v2 I7 r& [) {  三、rsync命令的用法
3 `  r# q+ w" W7 J: @+ L  在配置完rsync服务器后,就可以从客户端发出rsync命令来实现各种同步的操作。rsync有很
! h% h6 w) u9 }, D多功能选项,下面就对介绍一下常用的选项:
9 z" A( e6 S3 v6 k  rsync的命令格式可以为:
3 j0 C9 F0 c1 c. F3 M  1. rsync [OPTION]... SRC [SRC]... [USER@]HOST : DEST]0 {$ J+ G: a% z3 K: _1 Q* n
  2. rsync [OPTION]... [USER@]HOST:SRC DEST]& R% h+ J4 N2 r$ {% }0 p
  3. rsync [OPTION]... SRC [SRC]... DEST]2 R4 T; k- u$ S( z( y& s1 V
  4. rsync [OPTION]... [USER@]HOST::SRC [DEST]
" P4 v% v1 d3 ?! {  5. rsync [OPTION]... SRC [SRC]... [USER@]HOST :: DEST]- R& R  Q$ U  l
  6. rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
3 H& w/ a3 X! b9 [( P, Z) Z) j' f6 J. g( X5 j
  rsync有六种不同的工作模式:) z9 Q9 Q" v8 J! n1 q9 z+ Q
  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。: T+ Z# x# C3 Y' E4 v3 d
  2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST
4 g, C$ j4 o% ?, m3 u1 f路径地址包含单个冒号":"分隔符时启动该模式。
8 R& I8 u( k- H  A  3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC
) C* ~' I* |# ~; r6 T地址路径包含单个冒号":"分隔符时启动该模式。
0 K& y* O- m2 d* x! J7 [! j  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
- w" Q7 v. N8 g) f5 ~  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。! M5 D/ ^) y; c( H, o+ h
  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
  C4 E. W9 D* p1 A) M8 z& _0 x+ Z  下面以实例来说明:
) b3 g, b+ E0 i' e  ]5 E* C  # rsync -vazu -progress terry@192.168.100.21:/terry/ /home& R! V5 m7 X% q8 h+ x% p& J0 f7 k% c
  v详细提示
% M- Y- _. _, Z9 ~5 Q  a以archive模式操作,复制目录、符号连接
1 \- n* H9 P( |* X  z压缩
3 d1 i1 {1 u+ I  u只进行更新,防止本地新文件被重写,注意两者机器的时钟的同时: S' A$ a1 |1 |& K3 o& Z3 e7 U, }, i! R
  -progress指显示
4 q7 T+ G( z' R6 V7 Y4 T  以上命令是保持客户机192.168.100.90上的/home/terry目录和rsync服务器上的terry目录同' s0 R+ Q! K/ n
步。该命令执行同步之前会要求你输入terry账号的密码,这个账号是我们前面在rsyncd.secrets/ d5 h4 h0 s* R
文件中定义的。如果想将这条命令写到一个脚本中,然后定时执行它的话,可以使用--password-file
6 L) x% }% U7 v4 E选项,具体命令如下:
$ {7 n: K1 r2 X% b: b0 G4 ^  # rsync -vazu -progress --password-file=/etc/rsync.secret
4 j$ `& {' P  p1 ?# V2 G% q  terry@192.168.100.21:/terry/ /home
2 v1 t, d7 V! ^" X  要使用--password-file选项,就得先建立一个存放密码的文件,这里指定为/etc/rsync.secret。
* d* x% u" J* N$ ]- i9 ?其内容很简单,如下:$ Q+ S2 c& S7 ~! e/ B
  terry:12345
" T% }; H/ E( K& _) T$ W  Z6 j- ]  同样要修改文件属性如下:
% V9 w' D, d: \! C) N  @  # chmod 600 /etc/rsyncd.secrets
9 o- m) E, _+ e6 j# Y: \  r) n
- ]( R! ~& N- u$ G  四、利用rsync保持Linux服务器间的文件同步实例6 s% q) u' V; j! n
  现在假设有两台Linux服务器A(192.168.100.21)和B(192.168.100.90),服务器A中的
6 p( I% Z5 W5 E8 w9 Y1 i9 _) j/home/terry和服务器B中的/home/terry这两个目录需要保持同步,也就是当服务器A中文件发生5 s; n( T' @7 F& M" g8 D
改变后,服务器B中的文件也要对应去改变。
& D2 \$ C1 S+ N" l0 Y, L4 M  我们按上面的方法,在服务器A上安装rsync,并将其配置为一台rsync服务器,并将/home/terry( q5 n+ T" [0 {* B7 c8 z+ B- K$ y
目录配置成rsync共享出的目录。然后在服务器B上安装rsync,因为B只做客户端,所以无需配置。6 O) F- ]* g8 B0 v2 [/ }& P! e
然后在服务器B,建立以下脚本:
0 [0 i/ E0 h1 e( W: ]& Z% e. d  #!/bin/bash$ W0 O) ]+ r. \
  /usr/loca/rsync/bin/rsync -vazu -progress --delete# v7 c& b8 s9 h5 h$ t) W) F2 K! \
  --password-file=/etc/rsync.secret terry@192.168.100.21:/terry/ /home
: W* w, G4 J8 P0 o6 A$ k  将这个脚本保存为AtoB.sh,并加上可执行属性:: u( j5 T/ I6 n* _. ]) D
  # chmod 755 /root/AtoB.sh! Q, u% c6 H# b: N% Z  t
  然后,通过crontab设定,让这个脚本每30分钟运行一次。执行命令:
4 [. B0 U! T+ Y6 U  F1 J  # crontab -e
1 E, K% b. o/ E& r, c; I( D5 S  输入以下一行:+ g8 \% h" B1 b" ?, j6 x; K
  0,30 * * * * /root/AtoB.sh
/ Z6 d5 B; x! F. a  保存退出,这样服务器B每个小时的0分和30分时都会自动运行一次AtoB.sh,AtoB.sh是负责
% f$ c/ q- c. t- u. a" ?# P! o  E( h( B0 Y3 Z保持服务器B和服务器A同步的。这样就保证了服务器A的所有更新在30钟后,服务器B也一样取
/ q3 Z. p5 A1 Q# x得了和服务器A一样的最新的资料。1 m( ]* ]) R8 Q2 @! g
5 @, j$ ~+ U3 {8 }3 g) ^
  五、其它应用
/ H  a! p( c0 Y: r  rsync除了同步文件及目录之外,还可以利用它来实现对远程网站的远程备份。如果再结合脚本和Crontab就能实现定时自动远程备份。其可以实现与商业化的备份和镜象产品的类似效果,但完全免费。
0 q: F7 G8 @7 z7 Q$ H2 F2 L0 E% I
         附:rsync有六种不同的工作模式:: I* _- V7 X4 Y7 n9 |
  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。
% {- J6 X7 P; K" ]1 t  2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST
6 E6 N6 s% I) r3 j- O4 H4 M& G+ e( |路径地址包含单个冒号":"分隔符时启动该模式。
$ A( g! q; S4 i7 W+ A- y* @) |  3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC2 @( m; x5 `$ }8 b9 n% P& u, u
地址路径包含单个冒号":"分隔符时启动该模式。
: A" c/ n& \0 M6 X% |8 G/ u' d  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
1 f3 M6 v; \/ ^$ Z% T. W& z9 {" N  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。
) {' G0 [- K4 Q8 S+ S  B0 Z  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
7 X5 z! c3 Y9 w! g' a0 l) i3 N/ @5 u

8 L* f/ y, T: E" B; y" z9 U$ V/ f9 R
* k% z  |$ q) h: U6 [6 N4 Y" N7 l
) x2 l' y4 [! ?/ S# g
/ {# K* E- ]4 h" V5 ?( K' |( q6 s* X- r* [7 f0 E
# w5 |1 T0 b5 A- M
$ C$ y8 N& X) z) t' r- _

7 y' t2 J7 @+ D$ A" E5 \/ ^  前段日子在网上找rsync daemon的filter等过滤规则的详解,怎么也找不到,哥一怒之下,决定自己动手翻译,于是有了本文…, T4 d) e4 a2 Y* |' [$ J
    本文内容翻译自rsync的官方文档:http://rsync.samba.org/ftp/rsync/rsync.html,以及http: //rsync.samba.org/ftp/rsync/rsyncd.conf.html,非完整的全文翻译,并且按照我的需要,对原文的相关章节或 条目进行了适当的重新编排。官方文档发布日期:26 Mar 2011。5 K: C# D4 F, v% S4 O
$ F0 L/ h& F4 K& q& \
    rsync是Unix/Linux系统中一款优秀高效的镜像同步和远程数据备份工具,它可以把本地文件拷贝到远程主机,或从远程主机拷贝文件到本地,也可以在本地的两个目录之间进行拷贝,但不支持两个远程主机之间的互相拷贝。
4 ~3 G: n! y* x+ a% d' F
5 a: ]$ I) \  O5 P
6 O' g6 y' h2 P8 \. f    关于rsync的工作方式:
9 m' E- o# t. `" N$ L* Y5 a    rsync连接远程主机进行同步或备份时有两种途径:使用远程shell程序(如ssh或rsh)进行连接,或使用TCP直接连接rsync daemon。
% R- R7 f. A1 O# H) f    当源路径或目的路径的主机名后面包含一个冒号分隔符时,rsync使用远程shell传输;当源路径或目的路径的主机名后面包含两个冒号,或使用rsync://URL时,rsync使用TCP直接连接rsync daemon。
+ z- ?% d* N' Z+ W    特别的,如果只指定了源路径,而没有指定目的路径,rsync将会显示源路径中的文件列表,类似于使用命令ls -l。
  Z' {2 w, ^' G' W2 h- h8 T1 M+ m3 Y$ ]2 o2 z, X. ]9 H
 rsync把本地端看作client,把远程端当成server。注意:不要把server与rsync daemon混淆!daemon一定是server,而server却不一定是daemon,也可能是远程shell的衍生进程。. H; w, u+ ]9 ^( @$ L: ]2 ]
    至于什么是daemon,以及远程shell衍生daemon,下文会有说明。7 G9 H! ~8 h- f( W: b+ z$ b, B/ l

2 X* n! u" r: U) @2 @, y- U  [) N* ]  V% [, I
    关于rsync的安装:# }/ R* y$ c7 H/ o$ ^" u  g
    rsync安装方式是最常规的./configure && make && make install,只是要注意:源机器和目标机器都要安装。
; ^+ f. L! Y+ b7 a: j, C" I; h, s# [* p+ z5 S  Q
# G6 Z8 k$ h- L! C8 i
    关于rsync的启动:
$ Y# g- j: E/ G! Z4 N/ S    前面说过rsync在进行同步或备份时,有两种途经连接远程主机:使用远程shell,或使用TCP连接远程daemon,可以把它们分别称之为shell模式和daemon模式。只有daemon模式才有启动rsync一说。" h+ U/ |& \5 ^4 d8 c
    如果使用shell模式,rsync安装完成后就可以直接使用了,无所谓启动,也不需要任何配置文件。远程传输时一般使用ssh作为传输工具,当然,也可以使用参数-e来指定一个远程shell。) c( T1 y/ Y$ ]7 ]* H$ i
    如果使用daemon模式,就无需远程shell了,但必须在一台机器上启动rsync daemon,默认端口873.
7 i' Z8 Z" t: T! E, m* A. j% A
3 U0 b; e/ l4 {+ ~    你可以经由inetd启动daemon,或者作为一个独立进程启动daemon,或者由rsync client通过远程shell启动daemon。
# S3 x) f. I  M' X' h! F     1)如果把它作为一个独立进程来启动,只需要运行命令:rsync --daemon即可;" G9 l) S* @: P' w( o
     2)如果通过inetd来运行,要修改两个文件:/etc/services和/etc/inetd.conf:# j8 K" i; {5 u
      在/etc/services文件中添加如下行:rsync 873/tcp
/ n- ?3 F8 f" e' S' @3 J5 f      在/etc/inetd.conf中添加:rsync stream tcp nowait root /usr/bin/rsync rsyncd --daemon
) W! l5 l7 M7 H# Z1 y  注意把/usr/bin/rsync换成你的rsync安装目录!然后重启inetd服务,使配置文件生效。
1 N- y  }/ L, T2 q  t: ^, A  Y
; ]( L; u. d  Z% ?% S' M    关于由client通过远程shell启动daemon,官方文档中有一个条目:USING RSYNC-DAEMON FEATURES VIA A REMOTE-SHELL CONNECTION。
8 A+ n9 [& Q( y$ [7 i4 o    条目中说,rsync支持这种用法:使用远程shell连接host,然后衍生出一个single-use “daemon”服务器,来读取远程用户家目录下的配置文件。从用户的角度看,通过远程shell连接而启用的daemon传输,它的命令行语法跟正常的 rsync daemon传输是一样的,唯一不同的是,你必须在命令中使用--rsh=COMMAND来明确远程shell程序。如下例:
. Z) z  ^1 Q. h2 J) x5 x    rsync -av --rsh=ssh host::module /dest
: x9 s+ g9 g. O  译者注:虽然官方文档中说这种用法在某些情况下很有用,但我觉得很别扭。/ M1 g" Z" u7 F1 j8 \  q* A
" ?6 ~$ G- [. j, W
    当rsync作为daemon运行时,它需要一个用户身份。如果你希望启用chroot,则必须以root的身份来运行daemon,监听端口(1024 以下,默认873),或设定文件属主;如果不启用chroot,也可以不使用root用户来运行daemon,但该用户必须对相应的模块拥有读写数据、日 志和lock file的权限。: f2 t4 S* m' Y" O- e5 n6 `
    当rsync以daemon模式运行时,它还需要一个配置文件:rsyncd.conf。修改这个配置后不必重启rsync daemon,因为每一次的client连接都会去重新读取该文件。; ~, Y" C4 |1 a7 E. ?
    译者注:关于配置文件rsyncd.conf的设定,后面会有详细的参数解释。- k! M0 v& O, b

: _! y6 S  o& b1 \. w    关于rsync的两种模式:
( S5 P. C4 _  {" U! u    该部分额外的内容来自IBM官方网站上的一篇文章。该文章把rsync的运行模式扩展成了四种,但我认为rsync官方文档的两种模式的划分更加合理一些。
8 P6 ^! k5 W: ~5 O/ E  B    所谓rsync daemon,就是在一台机器上永久运行的rsync进程。在任何一台安装rsync的机器上运行rsync --daemon,则这台机器上运行的rsync就是rsync daemon。我们可以把文件发送给daemon,也可以向daemon请求文件。  F( [! U# A& [) Q1 `/ |3 d8 x
    daemon模式非常适合创建中心备份服务器,或项目存储库。! r4 i" x9 I) X" P% h
    两种模式的区别前面已经说过,shell模式在源路径和目的路径中使用一个冒号,而daemon模式使用两个冒号。
: F1 H! O$ E5 O8 L0 Z: Z9 [0 w" i' A. R- r. v
    关于rsync命令的语法:
1 J1 C. j1 G- R
; X8 J3 O- y7 t0 |本地拷贝:    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,仍然是推动作$ y+ S- q5 E9 N) {' E
    官方文档的举例:
7 i" _9 z! @- G* c1 ?  u    1)rsync -t *.c foo:src/
' ?. ?: l+ Z) L! h+ x) r        把当前目录中所有以.c结尾的文件传输到机器名为foo的src目录中。如果某些文件已经在远程主机中存在,则跳过该文件。% K6 b! Z' R. |$ H( N' R, R
    2)rsync -avz foo:src/bar /data/tmp6 j5 K7 ], X- [) o- R: f, z1 h2 S
         从机器名为foo的远程主机上把/src/bar目录及其下所有文件传输到本地机器的/data/tmp目录中。注意:源路径src/bar的最后没有斜杠”/”!
7 N- [/ [  p% @' g3 h& B! h        源路径的最后是否有斜杠有不同的含义:有斜杠,只是复制目录中的文件;没有斜杠的话,不但要复制目录中的文件,还要复制目录本身!0 N& F; k, H- \
        目的路径的最后有没有斜杠,对传输没有影响。
5 ~! i0 }- N3 Z" ^' n    3)rsync -av host:file1 :file2 host:file{3,4} /dest/
+ B4 a" b: ^$ Y& j; H         rsync -av host::mod/file{1,2} host::mod/file3 /dest/
: R- `" @( B" i$ ~' d, z+ U         rsync -av host::mod/file1 ::mod/file{3,4}4 r2 H+ f% i; w4 z
        这个例子是rsync更高级一点的用法,使用rsync同时传输多个指定文件。
$ t7 m6 S& S1 o9 U5 s( z2 B* {    rsync可以一次传输多个指定的文件,方法是添加多个远程主机参数,或忽略主机名。如上例。
2 Y% o! f- f  o1 `! o% \/ O4 }. `+ z" i# J0 e. C
    关于rsync命令中的选项:& H! Q5 C& g" ~/ O( G9 Z
    上面例子中提到了一些选项,rsync的选项有很多,请参考官方文档。常用的选项如下:
$ p) I$ l; O5 u  x4 |0 q2 X9 `3 G- M6 _9 C) N, T
-a:归档模式,保持文件的所有属性,相当于-rlptgoD -r:递归模式 -e:指定一个远程shell -z:文件传输时进行压缩处理 --delete:镜像中常用,删除DEST中那些SRC中不存在的文件
) |3 ]  X3 g% d6 W2 }8 R5 J daemon也有一些常用选项,下面会有介绍。/ B3 l5 \( V% H- Q( k1 E  z

. B  l3 F8 M9 L; @" a; _    client如何连接rsync daemon:
. B( t5 o+ B+ I! c* n$ G- e    上面第3个例子已经给出了client连接daemon的语法示例。但是官方文档又把本条目单独列了出来,提醒我们在连接rsync daemon时要注意的几点:
* T! X3 D9 I9 n( l    1) daemon模式中的源路径,即SRC,实际上是模块的名称
8 p8 f8 O& z5 a6 a8 `    2) 如果未在双冒号::后面指定源路径,则rsync会列出daemon上所有可能的模块
/ e; f7 D9 z& m, B    3) 不要使用--rsh(-e)参数
6 a6 ?1 @" ^1 G( f4 W7 K    4) 有些模块可能需要密码认证,你可以使用--password-file选项,来指定密码文件
# ~8 l1 T' k$ ], `' ]. J# M6 [, o' }& m; l
    启用一个rsync daemon来接受client的连接:4 q" A4 z; c* k4 G  }- g4 o9 s$ h
    除--daemon外,rsync daemon启动时还有其它一些常用选项:$ t8 @& r0 q. X! D: o
    --daemon:
% `5 ~  Q7 F& d. ]      使rsync作为一个daemon运行。daemon有两种启动方式,前面已经说过。对client发出的每一次连接请求,daemon会读取配置文件rsyncd.conf,然后做出相应的回应。: j" J( a5 x- R
    --bwlimit=KBPS:
! u: w8 c1 S# k. ]' r+ Z      指定daemon每秒传输的最大千字节。client在请求连接时也可以指定一个--bwlimit值,但该值不能大于daemon端的设置。
8 j  T8 U0 F/ `8 F+ ~- _6 u- E& @! k    --config=FILE:
# g! p3 l# |+ n      指定daemon的配置文件。只有当rsync以daemon模式运行的时候,该选项才有效。默认的配置文件为/etc/rsyncd.conf,除非 daemon是通过远程shell运行,并且远程user非超级用户,这种情况下,配置文件rsyncd.conf默认存在于当前目录(在$HOME目录 中比较典型)。关于通过远程shell启用daemon,见上文。
6 }5 J( f1 Y  b" }7 Z* p: _    --port=PORT:
; d# \- D+ ]  j9 M5 m      指定daemon监听的端口。- w- U( f# i7 _1 X$ a3 N: u$ b
    --log-file=FILE:( q$ i; Q0 n. M2 {6 Q
      该选项告诉daemon不要使用rsyncd.conf中指定的log文件,而要使用此处指定的文件。此选项很少用到  y; _9 i. o6 E/ e8 a9 I
# k; O6 p. W. P6 z$ `

4 X) q2 f4 \; x
% F% t! e% |  [. g7 Q# Srsync 远程数据同步工具详解" s/ G- J: U1 r) ^  F  c$ W
" K) f& ~: M1 h9 o6 Y4 |; I* H7 Y
rysnc(remote synchronize)在CentOS系统默认安装在/usr/bin,此外rysnc在windows平台下也有相应版本。主页地址为: http://rsync.samba.org/( ]$ x) z# b+ v$ v! I
6 o1 `8 x! ?( d8 V' `6 s9 R
rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远 程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。: d7 h$ r/ q2 h9 y" G1 J" r$ z
# d" O, ~9 Q' N( }& Q
rsync本来是用于替代rcp的一个工具,目前由rsync.samba.org维护,所以rsync.conf文件的格式类似于samba的主配 置文件。rsync可以通过rsh或ssh使用,也能以daemon模式去运行,在以daemon方式运行时rsync server会打开一个873端口,等待客户端去连接。连接时,rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份。3 ^  }6 }% T/ e- n9 @4 D
6 o, ]7 k0 G1 B4 m5 h7 N% R8 Y
------------------------------------------------------------------------------------------------------------------------------------------------------------4 D! w; e% r$ m! I

3 Z( \$ C7 ]$ }5 ?5 Irsync的命令格式可以为以下六种: 1 \! q* y8 [& o! s' q: p& W

2 j; E' J, L' s; ~, P4 v  rsync [OPTION]... SRC DEST
( \+ y" [* g& r0 r# `: y- c  rsync [OPTION]... SRC [USER@]HOST:DEST4 H5 m+ f- m  u& d
  rsync [OPTION]... [USER@]HOST:SRC DEST
, f+ B& b; k3 r' e  rsync [OPTION]... [USER@]HOST::SRC DEST1 l' \1 x5 f+ I/ M9 v# v0 k
  rsync [OPTION]... SRC [USER@]HOST::DEST  x9 p- I4 ?& v: P8 ~
  rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST] 8 D" [" N% }6 L* v, S* q  m3 j

. |( n' b. v/ p; F5 i& c  对应于以上六种命令格式,rsync有六种不同的工作模式:
6 z$ O$ K! o3 ]/ r6 H5 V3 q' P8 l. E7 Q6 R$ _* p
  1、拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。如:rsync -a /data /backup( E  E& m0 I3 }  b* m( o8 _
  2、使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。如:rsync -avz *.c foo:src
: B% x' }3 K  a& x2 C6 w: d  3、使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。如:rsync -avz foo:src/bar /data
1 I0 {6 `* N2 E( f  4、从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。如:rsync -av root@172.16.78.192::www /databack6 ~5 {% i5 d4 w9 }: ?
  5、从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。如:rsync -av /databack root@172.16.78.192::www* O2 e6 I: H8 j4 O
  6、列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。如:rsync -v rsync://172.16.78.192/www" Z& c, f0 U8 l% A: l' Y
, ~4 W* W0 f0 H) O+ A" M
rsync 命令常用参数 ' z7 C, L: K' |5 k
-a 递归方式传输文件,并保持文件属性,等价-rlptgoD不包含-H $ ^1 P/ V, y0 |( _" ?5 U4 A3 m' Z, M
-r 子目录以递归模式处理
. I3 p" l( ^) _) Q5 I- L. E  A-l 保持符号链接文件, @8 w3 a: c) `8 o0 E% q9 p& ?
-H 保持硬链接文件4 h+ _  o# r8 c* P' w( b' ^
-p 保持文件权限2 u! O3 _2 C5 c( R( i* w
-t 保持文件时间信息* h! \3 v, O, j0 x! _. e
-g 保持文件归属组信息, Q1 [7 _' _8 Y0 D' T1 j8 n1 j" u8 ~
-o 保持文件归属用户信息
+ p. d2 l5 q5 p! a3 d-D 保持设备文件和特殊文件  b- c/ j) a' O! M
-z 在传输文件时进行压缩处理
2 W; Q; l' Q; Q* H& E! p--exclude=PATTERN 指定排除一个不需要传输文件匹配模式# P& X" w8 P" @7 @
--exclude-from=FILE 从FILE中读取排除规则: _' R9 s3 n) s1 B: `
--include=PATTERN 指定需要传输的文件匹配模式
$ e$ a* H' J0 Z) Z+ b7 x8 e# |--include-from=FILE 从FILE中读取匹配规则/ d6 W! F4 W* ^+ G3 X5 E
--copy-unsafe-links 复制指向复制源路径目录以外的链接文件! z2 `: M  K7 c- F- S1 U& A5 X
--safe-links 忽略指向复制源路径目录以外的链接文件(默认)
5 M& J+ Q# ?' _. a; B4 l--existing 仅更新那些已经存在于接收端的文件,而不复制新创建文件, }2 P! b0 i4 |8 R& j- l/ X! b
--ignore-existing 忽略那些已经存在于接收端的文件,只复制新创建文件. n5 j9 \  u' T+ C. \" x) f
-b 当有变化时,对目标目录中的旧文件进行备份
' t! E3 E( b# S9 c% Q4 u3 l: _( ~--backup-dir=DIR 与-b结合使用,指定备份路径7 N- d  L. I# V
--link-dest=DIR 当文件未改变时在指定路径创建硬链接文件
5 T2 w2 h: Q4 T- x1 c: q4 H0 L--delete 删除接收端还存在而保存端不存在的文件
9 O  m" T, G& d8 f/ ]. j" x7 E: b--delete-before 接收端在传输之前进行删除操作(默认)
+ r: L/ y# w8 ?) w--delete-during 接收端在传输过程中进行删除操作
# ?' B, D! m( j' k) E--delete-after 接收端在传输之后进行删除操作' z! A5 O) z( @! }  Q6 j5 _9 D+ B
--delete-excluded 接收端在传输同时进行删除操作
+ R! l( d+ B! S, K6 v--e,--rsh=COMMAND 指定代替rsh的shell程序,例如可以指定为ssh
+ v- i9 s- `5 n9 T* q: u# ]--ignore-erros 即使出现I/O错误也要进行删除2 n$ z% k8 V% }4 B- {
--partial 保留因故没有完全传输的文件,以加快随后的再次传输, N" f# ]4 @7 Z7 n! B
--progress 在传输时显示传输过程
3 `7 y/ s% }6 ?* }& y-p 等价于—partial—progress
' u- F; E$ m; l) M5 m! ]--delay-updates 将正在更新的文件先保存到.~tmp~临时目录,待传输完毕再更新目标文件
1 u/ m; t: C2 r! d: j- s-v,--verbose 详细输出模式
0 `5 P1 u8 e1 y$ C% X-q,--quiet 精简输出模式" k" n* w8 f6 H: z. C( b4 }" p
-h,--human-readable 输出文件大小7 D0 ]/ z7 Q  N2 |2 w
-n,--dry-run 显示那些文件将要被传输
+ L9 }% a& C( M+ t5 L  {# F9 J--list-only 仅列出文件而不进行复制
: C. k6 Y' H! w' s% w7 g/ Y5 A--rsync-path=PROGRAM 指定远程服务器上的rsync命令所在路径
& Q' l9 Y+ n# F4 A& {--password-file=FILE 指定从FILE中读取口令,避免在终端中输入口令
) J, [- }, P) e! Z' n! g) g- g, q-4,-6 使用IPv4或者IPv6; i; `6 D9 C" K2 h6 T0 ?
--version 打印版本信息) _3 n; X2 m0 Z  D
--help 显示帮组信息3 x# v+ Q( K, v4 N- m. [
: p" m( [  c1 C) t2 E
; B/ O7 f: p7 X
注意: 若用普通用户身份运行rsync命令,同步后的文件的属主将改变为这个普通用户身份;若用超级用户身份运行rsync命令同步后文件属性保持原来用户身份不变。若指定-tg但目标计算机没有指定用户和组,则复制的文件归入501用户 501组" }' H) B( X9 W/ d. t
  ~& H( M' d* I, F9 C6 {# L% J: x
------------------------------------------------------------------------------------------------------------------------------------------------------------
3 K9 t- m1 r1 l! |; ]4 \5 u
1 D( C7 h9 o+ X2 K# A启动 rsync 服务
" ~6 @/ d" F2 [4 r/ ]- l+ o* O6 U1 O启动 rsync 服务
* B0 G9 |4 N6 B) `" Svi /etc/xinetd.d/rsync  把disable = YES改成NO" E: u+ c: E% _. l6 a) A
service rsync
0 i# p$ |& C3 |{
4 i$ n0 v* Q+ w- ~        disable = no
/ Y. t) @% M3 K0 F# f! P        socket_type     = stream7 u6 a& y( Y: u" v, M
        wait            = no
: i' s5 H( `+ r2 i        user            = root9 j! s4 g, b: v' T+ F" N1 ]
        server          = /usr/bin/rsync
. C& V+ @: ^2 }' e! y5 B        server_args     = --daemon, _4 ^0 o) g$ u3 E# q$ \
        log_on_failure  += USERID$ w; _  z2 T& O+ \
}1 A2 m& x* a3 h( K5 o, H
+ ~, c/ [" @* w5 C
+ u& p- h: S- c- ~" V* o. N
- h0 N7 U6 `' ?+ u' C- A
配置服务端 rsync * ?# l6 L  B4 l9 R5 _6 V; c, t
rsync 服务器可以独立运行也可以由xinetd运行,CentOS默认以xinetd运行,同时默认监听873端口。需要创建rsync配置文件 vi /etc/rsyncd.conf- [, i4 {5 c2 E2 @) v0 X
在文件中[module]之外的所有配置行都是全局参数,也可以在全局参数部分定义模块参数,模块参数主要功能定义哪个目录要被同步,可以根据需要来定义多个模块 uid = root 0 [& E8 X% H8 h: ?
gid = root 2 q( v/ r7 ?; C5 j: ^
max connections = 10
% R; s" V& W" B9 c5 p9 A6 [use chroot = no
* k. R; P3 T4 [3 Glog file = /var/log/rsyncd.log
1 t, A2 V2 M. Z; D5 @4 z0 O- y  N$ ipid file = /var/run/rsyncd.pid
+ S2 S0 B( n0 n& _+ F  xlock file = /var/run/rsyncd.lock ! q$ {& T# M! R8 i2 o9 N
) f8 T. i8 S7 V/ W# D  L7 ?
[tongbu] ( ?3 }4 v; K! V9 W2 ]8 m+ S% x$ G
path = /opt/tongbu
0 x/ H" P- D, A7 |6 [6 Hcomment = hello world , l4 G2 ?7 v$ E( c; |) W
ignore errors = yes ) c% t9 H3 L) r7 H( }
read only = no $ Z9 Q) _- h$ U6 Y/ W4 Z
hosts allow = 192.168.1.125 0 T% @3 M$ @( ~
hosts deny = *
  r4 }& K+ i& D8 w9 ~6 v' S! r(可以匿名连接,不安全,详细参考以下)
3 m: d. W  U' g0 f. K启动并设置随系统启动 rsync,要求 服务端和客户端都启动 ,否则使用的时候报错Connection refused! J* }3 g4 G* W$ }$ e
( |* U* Y  z: m3 v# L- s+ q
! }6 N- K3 b3 ^& P) `2 h
rsync --daemon –-config=/etc/rsyncd.conf
* c% t, H. c0 y7 W4 L# Echkconfig rsync on
( P0 N! L- v+ n, |
# v, G9 b9 P0 ]6 a& J' z% `9 F, ]
# Z# e7 |- G0 n0 O  r------------------------------------------------------------------------------------------------------------------------------------------------------------! |, i9 ^( S6 e# G, x$ N* A6 |6 |6 ~
1 u' L4 Z1 u, j: c2 S
全局参数 ( d0 d9 u- v' y  ~- \
address 指定的服务器运行的IP地址。由xinetd运行时将忽略此参数/ }3 p9 x3 F( h7 D. X/ M
port 指定rsync守护进程监听端口号(默认873)。由xinetd运行时将忽略此参数
8 T1 W9 n6 `: _/ b; o/ ]motd file 指定一个消息文件,当客户连接服务器时该文件内容将显示给客户
! f/ Z- i+ _' t. C" Ypid file rsync的守护进程将其PID写入指定的文件- |# X+ N% _- c
log file 指定守护进程的日志文件,而不将日志发给syslog) E- m/ j! s+ x& ?
syslog facility 指定发送日志消息给syslog时的消息级别+ t% V  d4 b8 G- [6 [# p9 M8 F
socket options 自定义tcp选项6 P5 E8 o- `( P9 A8 c
1 q1 j- {: I5 `
基本模块参数 + F1 w7 S6 \8 u% |: V
path 指定当前模块在rsync服务器上的同步路径,必须指定
2 Z8 G5 h4 J9 }) g8 {5 fcomment 给模块指定一个描述3 O- U2 R7 c7 g, E4 V4 k* b
控制模块参数
2 O8 @4 j3 f6 ouse 默认为true,传输文件之前先chroot到path参数所指定的目录下,这样做实现额外的安全防护,但缺点需要root权限,并且不能备份指向path外部的符号链接所指向的目录文件6 h: z: D3 V3 D3 `6 ~; _6 |! ?. W
uid 制定该模块已指定的UID传输文件
) |4 o8 W7 M0 H  `, }gid 指定该模块已指定的GID文件$ p( g* y) U/ c. O: t0 F3 B
max connections 限制最大连接并发数以保护服务器,超过限制则提示稍后操作
2 H4 S& ^! A0 e% i* P  a. wlock file 指定支持max connections参数的锁文件,默认/etc/run/rsyncd.lock
. r( K/ K4 h- t. Z0 H5 mlist 指定当客户请求列出可以使用的模块列表时(默认ture),该模块是否被列出。如果false,可以创建隐藏的模块
2 s5 o  h: g4 y/ \; `: C0 {2 Rread only 是否也许客户上传文件,默认ture则不也许上传。为false并且服务器目录具有读写权限则允许上传
; O- R5 X" b6 H# m& \write only 是否也许客户上传文件,默认ture则不也许下载。为false并且服务器目录具有读写权限则允许下载
# C7 x+ {. B+ v" V- ?2 v! n) R; Wignore errors 指定rsync服务器在运行delete操作时是否忽略I/O错误: S1 f" B  ^' U' ^! \' d
ignore nonreadable 指定rysnc服务器忽略那些没有访问文件权限的用户
$ O# g% @$ z) K; P# P# H/ xtimeout 设定连接超时时间,单位为秒7 @$ L3 c5 U7 V, k8 ~
dont compress 告诉rysnc那些文件在传输前不用压缩,默认已设定压缩包不再进行压缩" G3 `" w; [5 e2 R% ~% c
refuse options 定义一些不允许客户对该模块使用的命令选项列表% [$ s1 E0 O* B" u# d0 f2 J
文件筛选模块参数 ( @* y& |2 v9 b( x" n8 m/ m' R7 n' V
exclude 指定排除的多个文件或目录,由空格隔开" X. e# W! n( f$ ?, G* N
exclude from 从指定文件中读取排除规则7 h1 y5 a7 l! _# c  ]. M
include 指定包含复制多个文件或者目录,由空格隔开, A. N% r, o( N7 L+ @
include from 从指定文件中读取包含规则
8 T5 G! b% w4 d3 W用户认证模块参数
" |8 a  n9 U9 ^8 hauth users 指定用户才允许连接该模块
' {/ J& v, H1 usecrets file 指定一个口令认证文件,格式是 用户:密码,即指定用户和密码连接匹配才行,不匹配的话会提示ERROR: auth failed on module,不设置该参数则可以匿名连接。
1 ?8 B  p& L: Z5 Z# Sstrict modes 指定是否检测口令文件权限。rsync认证口令文件权限一定是600
  U6 G* {1 Z) A访问控制参数 / }5 c# I/ W# u/ e3 T2 c
hosts allow 指定哪些IP可以访问该模块
  X. x7 @) E: R1 `hosts deny 指定哪些IP不可以访问该模块,*表示全部$ I; u0 r8 R5 s  [! x4 W

! o! _+ b# i- w8 e# c8 K: {( t
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 03:00 , Processed in 0.022103 second(s), 26 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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