易陆发现互联网技术论坛

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

Ubuntu下 rsync同步文件实例

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

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

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

x
Rsync(remote synchronize) 是一个远程数据同步工具,可以使用“Rsync算法”同步本地和远程主机之间的文件。# A# P' v/ c5 p& \
rsync的好处是只同步两个文件不同的部分,相同的部分不在传递。类似于增量备份,1 ]' R9 q2 a/ p# M
这使的在服务器传递备份文件或者同步文件,比起scp工具要省好多时间。" c) P7 U$ w5 E1 ^: X0 Z& W
OS:ubuntu server 10.04- Q8 W% c8 K  n( ~, H) ~6 w) T, ?
server:192.168.64.128
1 k, z& l" y! C8 `* }; o% qclient:192.168.64.145
" b5 ?. z0 r7 Xserver
3 P- e8 k  X0 ~7 N" r+ r( @) @1.ubuntu  server 10.04默认已安装rsync,rsync服务默认不是启动的,我们要修改下面的文件。
" x/ |6 c! {6 b$sudo vi /etc/default/rsync
* r6 h( w6 ~( i- wRSYNC_ENABLE=true   #false改true
# j; |( z5 y" ]* B  z; Y2.修改配置文件
8 k4 N1 ]- `  d2 o: v$sudo cp /usr/share/doc/rsync/examples/rsyncd.conf /etc   #已默认安装的软件,默认不启动的似乎都要这么做
4 C' s7 `, y9 I% x我们先来查看一下这个文件1 o; ]. [( U/ q# W, l9 n- U" Z$ Z) T
$sudo cat /etc/rsyncd.conf
5 _+ ]$ l/ F4 {9 h! r$ }; k) A& N& U- V8 t% K+ g
# sample rsyncd.conf configuration file9 @3 s! l  o" g/ v% O  @

6 R+ }1 i) C6 M" i1 T- u( ~4 B3 Z# GLOBAL OPTIONS2 P' U2 m$ `8 v" _: _
7 j3 c0 ^. [! Q5 J2 @* o$ M
#motd file=/etc/motd #登录欢迎信息
7 D! s" w: {: B# r' q/ I& H0 Q( Q#log file=/var/log/rsyncd #日志文件7 ~' d& \7 o( b
# for pid file, do not use /var/run/rsync.pid if
& b: p- }" B" N( A8 Y* t# you are going to run rsync out of the init.d script.0 `: ^& u4 A( R& l! @3 v, s
pid file=/var/run/rsyncd.pid
: u. e! h# g! [1 g
6 z; z9 P- [* 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。
$ n: W$ j5 a+ R9 x) [% t# v+ ~#syslog facility=daemon1 n8 T3 t% k$ Y- r. D: d  b2 r5 y

( a8 s6 u5 t" Y! i7 P# ?#自定义tcp选项,默认是关闭的: \" _5 C2 o" O4 f0 S
#socket options=
/ D/ |! \+ D0 t" J1 N& [0 L2 F3 n: A0 n" ]+ T' r
#以下是模块信息,我们可以创建多个模块+ k8 Z1 D3 f+ h5 T0 ~
# MODULE OPTIONS
0 {; X  y3 `5 q9 N1 A. U4 N' }, e8 b
- \5 t7 ^* d# R+ t- E  k: c[ftp]
! ^' _. ]1 T2 ]
* L' Q3 ?) K0 A8 \  j        comment = public archive #模块描述& h9 W2 U* D$ l4 A
        path = /var/www/pub #需要同步的路径' H/ i8 A- Z+ O4 d/ i% o
        use chroot = yes #默认是yes|true,如果为true,那么在rsync在传输文件以前首先chroot到path参数指定的目录下。这样做的原因是实现额外的安全 防护,但是缺点是需要root权限,并且不能备份指向外部的符号连接指向的目录文件。
3 n: K: Z7 T# i) ^% o7 M9 z#       max connections=10 #最大连接数
- ]+ R2 S; h$ A1 @% T+ d        lock file = /var/lock/rsyncd #指定支持max connections参数的锁文件。
$ p* _9 I: [: l& Y/ d& L! z0 A# the default for read only is yes...
( X3 ^5 N0 f. {3 v# g# r# H        read only = yes #只读选项& b  p1 T. i& G; E/ u
        list = yes #客户请求时可用模块时是否列出该模块; A+ n, K. ]7 @* z; y* |; w
        uid = nobody #设定该模块传输文件时守护进程应该具有的uid( V6 k4 h; h2 S4 u% ]
        gid = nogroup #设定该模块传输文件时守护进程应具有的gid,此项与uid配合可以确定文件的访问权限
! c( L* l1 o/ g" G# s#       exclude = #用来指定多个由空格隔开的多个模式列表,并将其添加到exclude列表中。这等同于在客户端命令中使用--exclude来指定模式,不过配置文件中 指定的exlude模式不会传递给客户端,而仅仅应用于服务器。一个模块只能指定一个exlude选项,但是可以在模式前面使用"-"和"+"来指定是 exclude还是include    #这个我的理解是排除目录中不需同步的文件% y% I! w1 H# O: H6 Q- V2 ]) B
#       exclude from = #可以指定一个包含exclude模式定义的文件名, i8 f% c! Q, g' R
#       include = #与exclude相似
# k& `4 ]8 j# o; w#       include from = #可以指定一个包含include模式定义的文件名
: j' h+ S  s7 D#       auth users = #该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的 challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)5 V% L( F' a1 |
#       secrets file = /etc/rsyncd.secrets #该文件每行包含一个username:password对,以明文方式存储,只有在auth users被定义时,此选项才生效。同时我们需要将此文件权限设置为06008 S1 y8 S% \' W- p' K- K' O6 F
        strict modes = yes #该选项指定是否监测密码文件的权限,如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认值为true
; y8 @; }3 B7 x' ]: {#       hosts allow = #允许的主机
4 H- U/ q6 }- z" o5 W  R% r( e#       hosts deny = #拒绝访问的主机% U; c4 Z) Y6 [5 H8 |
        ignore errors = no #设定rsync服务器在运行delete操作时是否忽略I/O错误7 c8 ~5 j' [5 a+ J  v, u8 v, r# [
        ignore nonreadable = yes #设定rysnc服务器忽略那些没有访问文件权限的用户
4 G# V/ H2 ~6 F! P) W1 U        transfer logging = no #使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中
! w9 M8 @& g& Z& j9 L#       log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes. #设定日志格式" X" H, d& g% @6 n
        timeout = 600 #超时设置(秒); f  t1 N2 s, R, e/ w9 J7 X
        refuse options = checksum dry-run #定义一些不允许客户对该模块使用的命令选项列表3 B' @; Z: u, Y6 a
        dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz #告诉rysnc那些文件在传输前不用压缩,默认已设定压缩包不再进行压缩
6 w, c3 _) D) l; n3 s/ X& P" Q+ A2 R

$ Q; X9 x) D4 l% A6 b. G8 S日志格式选项列表:9 L) m3 j; e8 |) ~' H0 |) B
%h:远程主机名* G; I9 O$ n( E# [- \/ g$ P" ]
%a:远程IP地址5 M7 t2 c. T- R6 O+ F
%l:文件长度字符数: d  F7 o* g2 {" f4 w
%p:该次rsync会话的进程id; ^* |6 T" _- [' P7 y- h( _- i# `
%o:操作类型:"send"或"recv"、”del.”
4 O9 h" u/ ]2 D%f:文件名
! ~+ _: t2 t% Y%P:模块路径% c% c: p% {& x" c* Y
%m:模块名
( k5 Q; ~. ~! j6 i, Z7 A" T0 L%t:当前时间6 t, H, w, T, ^2 ?7 U- m
%u:认证的用户名(匿名时是null)
3 k- ]- a* k# t4 b2 @%b:实际传输的字节数, U, u9 ~; \& ], l5 K6 }% Q4 Y. }
%c:当发送文件时,该字段记录该文件的校验码
/ W5 Y1 z: P+ z8 g; i/ }, q% q4 f
3 @  A6 ]5 i5 Y" C下面我们来定义自己的conf文件
" r  b% u- G. t) n' t* X/ S# m0 a/ h5 p: S9 K* Z9 ]& i
# sample rsyncd.conf configuration file
: `% N" T* c) G" X! ?# GLOBAL OPTIONS
3 U; e5 H; y* F6 B#motd file=/etc/motd9 d9 K+ U# z( }4 d* O3 o; M1 c+ M
log file=/var/log/rsyncd
# o! }* m; [  q, J7 z: b9 E# for pid file, do not use /var/run/rsync.pid if. b, }2 v# K8 P: ~
# you are going to run rsync out of the init.d script.
0 I* |) U/ c2 I9 u) { pid file=/var/run/rsyncd.pid. U" `# a2 x+ N2 {5 O8 s8 A
syslog facility=daemon
% d$ v% x/ B7 o9 t6 p$ c#socket options=6 E7 G2 N* d  _$ G5 a4 Q4 J
# MODULE OPTIONS
7 @+ x) @+ ~* R4 `! t. A7 `[my_rsync_bk] #名字可以任意命名,只要客户端的rsync命令一致/ _' k$ D2 v/ S9 \* W
        comment = public archive
5 w# r6 r! i" e. n: o$ i+ A# L6 L! t        path = /home/rsync_bk                             #指定路径,如果没有这个目录自己建。) j* G7 Y5 ^6 T! J0 V
        use chroot = no
- o+ K( t8 P8 _8 q8 j, B#       max connections=10
: {! X" Y2 S" o7 I% Q        lock file = /var/lock/rsyncd" H9 M* ?. K7 f$ j' \- J4 v
# the default for read only is yes...
& x0 S. a/ h1 x$ u$ L        read only = yes: X( Q! D" n" a
        list = yes
4 D/ I0 j" I( D6 f* I        uid = nobody
5 D7 ?1 i( X9 E3 O        gid = nogroup
$ S( [3 F% H6 s4 w/ q1 ^& B#       exclude = ) Q9 u% Z; G+ R/ h6 r1 s" z3 g
#       exclude from = ! q7 Q$ I5 ~: n1 {5 N  p
#       include =
5 K* V1 q5 O" X9 G5 h#       include from =
8 r" d- C4 x' i" ~+ r2 G        auth users = liu_rsync              #rsync连接时的用户名,要和客户端rsync的命令一致. p- m$ {9 y( g. }5 [; W( J
        secrets file = /etc/rsyncd.secrets #这里是保存密码的地方,如果屏蔽掉就不用密码了. M7 m$ A$ N0 k0 J: |
        strict modes = yes  A! K9 A/ b2 F$ E8 _$ C; c7 G
        hosts allow = 192.168.64.145 #运行的客户端ip
0 t6 J! u6 J% b+ a#       hosts deny =3 D0 ^3 `* d5 F: K0 |
        ignore errors = yes: D$ C; f) X8 m$ n9 q, F5 R
        ignore nonreadable = yes* l1 m6 E" v" R& I2 H
        transfer logging = yes
( S: z/ {8 l' {! Z! P5 c9 n        log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.2 H4 B% O6 L/ X; q5 d, A) M
        timeout = 6001 K* n' l  o  N) \9 K% J
        refuse options = checksum dry-run
/ k& ^) z; f5 G9 Y3 k        dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz0 m2 e$ x, l# }/ p  j5 ^7 ?) e

) i/ L9 V# V" o: h
0 z" \# f1 v4 S( H9 t# f! }6 x3 }! Y创建一个密码文件- [0 T* K- c, B6 M& s  B
$sudo vi /etc/rsyncd.secrets
( j8 f! o* J, f# t liu_rsync:123" ^( A* I3 s7 d; U6 X6 ~8 e
$sudo chmod 0600 /etc/rsyncd.secrets    ! t$ X. X2 m: @9 O4 v: x# k
" ?6 t1 W; O5 |6 a! D+ W
启动rsync
6 m8 P3 N- ]) E3 K8 N) \5 D- q$ ksudo /etc/init.d/rsync start
# q6 K0 P4 P1 |
2 T" c( R, q2 V( R, v7 Aclient
! a! L' q: Y1 ]6 N我们再来看一下客户端的操作,一般客户端不需要进行特殊的配置,直接同步即可2 d- E+ N( n% d: o- Q
rsync -vzrtopg --progress  liu_rsync@192.168.64.128::my_rsync_bk .  #.为当前目录,在服务端touch一个文件,同步后就会出现,当然你也可以指定一个位置比如/databk,需注意所建立的权限!
: `2 c2 N3 X, E0 W
3 G1 O6 ^5 U4 X" Q我们把这个同步工作交给crontab去执行。首先我们要创建一个密码文件$ |! m3 O( }9 a: i+ O, R! e" S
$sudo vi /etc/rsync.pwd输入123,保存     #密码要一致
3 M) p0 F% \& x* x8 o$ @7 {" F' l3 b; g( ~0 `
!注意:下面这两步操作是必须的,没有足够权限同步就会不成功,ls -l 你所指向的目录
" d2 Q+ M4 Q# ?: w0 m2 Q. r5 Nsudo chmod 0600 /etc/rsync.pwd
( Z& _  G7 O9 U2 ~" ^! c2 s# Hsudo chown 普通用户:普通用户组 /etc/rsync.pwd
0 V& P3 |/ m( ?! J8 ^5 I* p6 P% u/ a) b
然后我们打开crontab,使它自动同步
& V$ `. m' g+ N# x' F9 O# A$crontab -e
% f- i" c) P5 X2 t7 C1 f* * * * * rsync -a --password-file=/etc/rsync.pwd liu_rsync@192.168.64.128::my_rsync_bk /databk   
9 q/ X$ g6 o5 a- Lcrontab随机启动  sudo vi /etc/rc.local
* R, z1 A! i3 A* V" \参数说明:$ g! j. t1 O* \, Y; m
-v verbose,即详细模式/ ^' e! L) e+ l6 }
-z 压缩
. q9 k- q8 K4 M* V: _-r recursive 递归3 x9 b' m4 D: Y. Y6 ?
-topg 保持文件原有属性,一般不用加
. {; z$ [: }3 h6 y' Z' `! s% a, q --progress 用来显示详细进度情况
6 g' h4 p6 V1 l) H1 N--delete 表示如果服务器删除了一个文件,客户端也应对应删除
/ C' D4 c' `& ^2 b--exclude="*.sh" 表明不包括某些文件
+ a5 c* {! `2 S0 M--password-file=/etc/rsync.pwd 指定所使用的密码文件( \! c* l' A; ~) R9 w1 x, E
最后一项是需要同步的目录  7 q: l" b; {2 i0 M( P1 V0 R" O( D! f
注意指定使用的密码文件中只需要有密码,不要有用户名。/ o  B- F/ V  s0 I- C
------------------------------------------------------------------------: S% ]2 O: t3 m& P( s% R5 s
1.在本地机器上对两个目录同步, Y/ a- y: T6 [: B) x( `. N/ p
$ rsync -zvr filename1 filename2; p# X: p' ]" a( Y9 C

* G% Q" g8 u5 P6 m. e3 g% F上述代码是将filename1中的文件与filename2中的文件同步,如果将filename2中的文件同步到filename1中,修改代码为:- t6 Q  O* E5 ^
$ rsync -zvr filename2 filename1
2 {. q7 T) ~7 i6 t' ~+ q  M& Z% v3 Q( D* B, D+ d6 x  N4 m' C
2.使用rsync –a 同步保留时间按标记: }9 Z$ r, {+ c3 ~  t8 `9 _% \
$ rsync -azv filename1 filename2
4 b1 z* P8 Y: m$ y* }) b/ N3 t$ d4 o2 X, \9 g
使用上述命令,将filename2中新同步的文件的时间与filename1中的创建的时间相同,# h& \2 A5 L9 N* c0 y
它保留符号链接、权限、时间标记、用户名及组名相同。% i. l1 a( `. u4 J0 T2 D
3.从本地同步文件到远程服务器
% o, X: j6 N/ B. E, ~$ T  `* ]  c( _$rsync -avz filename1 ubuntu@192.168.0.1:/home/ubuntu/filename2. i1 b9 S+ _) k2 \- ~0 P6 s

* d7 ~) Y$ w$ i上述命令是将本地的filename1同步到远程192.168.0.1的主机上。
+ v2 |& F3 K- k0 x2 G: K$ Y# H注意:如果远程主机的端口不是默认的22端口,假如是3000端口,上述的命令修改为,9 i4 {+ \# b/ Q
$ rsync -avz '-e ssh -p 4000' filename1 ubuntu@192.168.0.1:/home/ubuntu/filename2
* h( s; q) _4 m- I2 Q; O6 R6 n! p1 R( R# J
4.将远程服务器的文件同步到本地
  x# F$ v5 z* B# z# Z1 D2 U* O! C与步骤3类似,只是将filename1与远程服务器的位置对换一下,
4 X* f9 M0 v7 V$rsync -avz ubuntu@192.168.0.1:/home/ubuntu/filename2 filename1
+ b) E: x, ^- V
+ U1 e& a% q+ _: p$ y/ N- N& b2 T同理如果端口不是22,使用以下命令
" M# I) y/ h7 \* S6 @1 ]1 `$ rsync -avz '-e ssh -p 4000' ubuntu@192.168.0.1:/home/ubuntu/filename2 filename1
4 M  G# K8 n4 G' c. E8 y
7 ~2 V/ k5 u2 G! ]参考:http://www.eduicc.com/read-24.html" ~2 l& H' u+ [
           http://jordy.easymorse.com/?p=273; w* z( X' n) C4 S5 }# ]
, X7 K. K0 A0 I* t3 w& c
" O8 B( J# n; U

& Y6 W  B1 }. J- k# U
8 v; K9 g# q5 U. A1 X 服 务器之间常常要保持些文件或目录的一致,比如一些大的软件下载网站,它们通常使用多台服务器来提供下载服务。当一台服务器上的文件更新后,其它的服务器也 需要更新,而且 在更新的时候应该是只对新增或是修改过的文件进行更新,否则会造成网络带宽和时间的浪费。rsync就是能有效的保持文件及目录的一致的 优秀软件。  H2 ^: |9 f2 E% X4 T4 F
  rsync,remote synchronize
9 Y7 q  X7 B8 U  顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息,而且可以通过ssh方式来传输文件,这样其保密性也非常好,另外它还是免费的软件。rysnc的官方网站:http://rsync.samba.org/,可以从上面得到最新的版本。当然,因为rsync是一款如此有用的软件,所以很多Linux的发行版本都将它收录在内了。你的Linux里并没有安装rsync,你可以按以下的安法自行安装:
0 J- |  R; s, x& t$ e  一、安装过程- M. m% n& e! E" ~- y! ]
  1.下载rsync
6 V$ O; z8 O, ^8 M  E- Q  目前(2003年9月)最新的rsync版本是2.5.6,从rysnc的官方网站上下载一个回来:
8 J9 Y; |, x  V' S" T+ x2 J/ h7 G  # wget http://ftp.samba.org/ftp/rsync/rsync-2.5.6.tar.gz
8 k. @; T9 s* l8 F) G7 T* h5 m$ A, F6 I9 U( X9 w
  2.解压
5 U" B4 j1 p2 p, ^0 K  # tar -xzpvf rsync-2.5.6.tar.gz
& }8 h# c, R8 s$ [
7 |( Z0 k' o& a5 j; F* c( q  3.编译安装
  o  v5 ]( ~) Y  @/ Y$ Z  # cd rsync-2.5.6/) e, @! e  g# v# i% h; t
  # ./configure --prefix=/usr/local/rsync
) m& e0 h; S2 W' ]9 W5 @  # make
" _5 H# [9 j2 T8 Z  # make install- V" }- k& [8 z) x' @( h1 D0 G
  以上过程没有出现的话就安装好了,现在就有rsync命令可以用了,rsync命令放在4 F1 e+ i6 M' C/ N. k% q4 ^* k
/usr/local/rsync/bin。用rsync命令可以去运行有rsync服务的服务器上抓取资料。9 B* i  V3 i# C* [( }' q- G) K( D9 G, v3 s
  如果要把当前的机器变成一台rsync服务器的话,就需要继续进行一些配置了。
. ~0 o  h' r, U3 H0 z* b9 O- _9 L; Y/ c, b# I. M  A9 [
  二、配置rsync服务: R8 \4 b& o9 X% ^
  配置一个简单的rsync服务并不复杂,你需要修改或建立一些配置文件。1 l8 }& A8 w* P+ r3 \. m
  1.rsyncd.conf5 d1 b- J$ S8 @
  # vi /etc/rsyncd.motd
7 W) F2 j' f7 ^+ c7 G) `3 S  rsyncd.con是rsync服务的主要配置文件,它控制rsync服务的各种属性,下面给出一个
: D7 R+ Y. @4 C4 U2 }7 _rsyncd.conf文件的例子:
' ?: h- N, Z  b+ w) U; v3 Q4 B  #先定义整体变量
/ c8 o) Q: |4 y. F  secrets file = /etc/rsyncd.secrets
7 {0 p4 m% S. L+ i; f* o. ]  motd file = /etc/rsyncd.motd5 K; R1 C( a* `* i8 b3 P. U
  read only = yes: m" b3 l: q$ z% F2 w+ P; }
  list = yes+ ~7 r, l1 Q- N8 w
  uid = nobody
; N( y4 K1 U) b) ?  gid = nobody8 `7 r( L8 i& n" g
  hosts allow = 192.168.100.90 #哪些电脑可以访问rsync服务
- v1 ^0 V3 n7 r( m# W0 Y  hosts deny = 192.168.100.0/24 #哪些电脑不可以访问rsync服务& v' i; J% D+ e! q! c$ N
  max connections = 22 z. P  k$ _( C3 [
  log file = /var/log/rsyncd.log
9 U0 L# q' L( I" S8 f$ S  pid file = /var/run/rsyncd.pid' g8 _/ t' N6 G7 o
  lock file = /var/run/rsync.lock/ v$ x+ [0 h* X; G
  #再定义要rsync目录
$ i$ x) W8 w, Z  V5 g3 o  [terry]! @+ L4 s- Z. a  u2 N! l2 c  n
  comment = Terry 's directory from 192.168.100.21: p( _9 V+ h5 d8 V: U! y
  path = /home/terry: b$ f  s; E* l) N
  auth users = terry,rsync
) K4 W4 y; n2 M  [test]9 p5 O1 E! d; F
  comment = test rsync- ~* U3 l0 e- }8 u, R# R, o, @
  path = /home/test
& M- n  I& s. y& L7 K   在上面的配置文件中,限定了192.168.100.0/24这个子网中,只有192.168.100.90的机器可以来访问这台rsync服务器的 rsync服务。配置文件的后面部分定义了两个rsync的目录,terry目录是只有知道terry、rsync两个账号的人才能使用的,而text目 录是无需账号就可以访问的。rsync在定义目录时还提供了一些其它选项,可以作更严格的控制。
. \5 _& m" w8 B* o  S; l
; A. \! k5 r6 F. v) O  2.rsyncd.secrets
) a$ U/ O/ J9 p. S" B7 @  # vi /etc/rsyncd.secrets
! V' {% M. k( o3 U4 c& u* h0 L3 j  rsyncd.secrets是存储rsync服务的用户名和密码的,它是一个明文的文本文件,下面给出一个rsyncd.secrets文件的例子:
6 V0 Q) y8 H3 }  terry:12345, z; I* E" p/ H7 F3 a
  rsync:abcde
9 O( H' S) G" o; d  因为rsyncd.secrets存储了rsync服务的用户名和密码,所以非常重要,因此文件的属性必须
3 u+ J! t/ j/ h' _3 W/ S# x* v! s0 k设为600,只有所有者可以读写:
- Y  Y8 G3 Q$ N9 |% g$ |; Y  # chmod 600 /etc/rsyncd.secrets; h5 Q9 K# b' h

" d8 g/ t) Y& D" B2 _, ]& Q  3.rsyncd.motd3 Y) x) \( T2 J
  # vi /etc/rsyncd.motd) M: U+ S/ c* N2 x
  rsyncd.motd记录了rsync服务的欢迎信息,你可以在其中输入任何文本信息,如:
1 N" y2 K5 T5 f" l$ v  Welcome to use the rsync services!  P. v+ h( i: z) B( O; w. B; {
/ c# y3 O2 T* E/ I% \
  4.services
3 j2 j! k- T2 r! e! ^  # vi /etc/services
. Q& U1 I. j5 E% v  services并不是rsync的配置文件,这一步也可以不做。而修改了services文件的好处就在于9 {& U2 i; c3 T% L! c" D. c' ~
系统知道873端口对就的服务名为rsync。修改services的方法就是确保services中有如下两行,
( R/ A! c+ k- k% D8 ~- P没有的话就自行加入:) E6 u6 K6 S& C( f- P( }8 \, ^
  rsync  873/tcp  # rsync6 [: u' G# q  K% e3 T% c! S  N
  rsync  873/udp  # rsync; S( E# y$ i( S4 }' |
  5./etc/xinetd.d/rsync
5 a/ L8 Y  a1 A' w# J+ G5 Y0 K  # vi /etc/xinetd.d/rsync/ @9 C3 K7 A! i* }
  建立一个名为/etc/xinetd.d/rsync文件,输入以下内容:
2 D$ o8 F9 u/ d1 @( P9 a  service rsync' P) T; o0 g, K  ~  C9 a2 `
  {) g/ u) {9 o$ ]- C% Y
    disable = no
) z: b- i2 d& o* ~* u# [    socket_type  = stream
& r( W8 }7 H! R; b& T    wait      = no
1 L" y* d/ k( p) w    user      = root( {! K% n- ]! n6 r% @
    server     = /usr/local/rsync/bin/rsync  t: D7 f# C0 b+ y. b7 e) d
    server_args  = --daemon
$ S! u5 T& J3 B7 o- [5 Z    log_on_failure += USERID$ u' i$ M7 e$ M, @& @
  }! S) D1 ^, [1 j" e, O
  保存后,就可以运行rsync服务了。输入以下命令:
6 U& n9 U4 O' h* h" F) ~  # /etc/rc.d/init.d/xinetd reload- X7 ^7 z2 x/ o+ @* Z* f( Z
  这样rsync服务就在这台机器上(192.168.100.21)运行起来了,接下来就是如何来使用它了。& L# X- z: {- G. W

; x/ @; z* W6 N  三、rsync命令的用法2 H9 j/ @8 z0 {5 _& b; K. g
  在配置完rsync服务器后,就可以从客户端发出rsync命令来实现各种同步的操作。rsync有很  F9 f& B; K3 F5 R5 ]
多功能选项,下面就对介绍一下常用的选项:
4 x3 D5 E, y) R- I1 T& _  rsync的命令格式可以为:
. M- {( ], q6 K4 K8 J4 G! F  1. rsync [OPTION]... SRC [SRC]... [USER@]HOST : DEST]
& _1 `9 [& H$ ?. Z& A  2. rsync [OPTION]... [USER@]HOST:SRC DEST]! r! C4 d* c+ E% F& A& A
  3. rsync [OPTION]... SRC [SRC]... DEST]
- F6 G2 f3 y4 z( v' K  4. rsync [OPTION]... [USER@]HOST::SRC [DEST]8 p7 P: W  E! p4 y, i0 C
  5. rsync [OPTION]... SRC [SRC]... [USER@]HOST :: DEST]
8 m4 c# [3 Q7 u, |1 r+ d$ Y  6. rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]0 H3 p2 [" b& E# e) [% c% p% V

+ }3 h1 H- x, l6 v' s8 {  rsync有六种不同的工作模式:
+ F5 h4 m, `6 {% `" g  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。
* o2 m- z" g* I( B  2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST/ ^) M, [- l6 E, O) t+ a
路径地址包含单个冒号":"分隔符时启动该模式。
: n3 B& L+ p% Y  C  3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC& u* \: p7 o5 {7 L' e
地址路径包含单个冒号":"分隔符时启动该模式。
) y* I  c% l4 k7 d/ G; v# D. z  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。; i, U, K  `, I; F& o4 @# {6 ^, {
  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。
% I3 [6 n: ?6 w( Q; n6 T  E7 j% `# O  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
6 @* B" T+ p) z  下面以实例来说明:8 {. s7 m6 \! m7 k+ m
  # rsync -vazu -progress terry@192.168.100.21:/terry/ /home0 t1 b. a! G+ J' J2 x8 ~* T
  v详细提示
$ L8 F, Q+ h8 C% q0 k  a以archive模式操作,复制目录、符号连接
( i) c% V5 L: T, X) _% T. D  z压缩
" x9 t1 X# t* l4 C/ H4 ~7 i: I  u只进行更新,防止本地新文件被重写,注意两者机器的时钟的同时( b' m! Y( R5 b, R
  -progress指显示
6 t9 i2 r+ S7 F  以上命令是保持客户机192.168.100.90上的/home/terry目录和rsync服务器上的terry目录同
6 T0 H% g5 ?/ s- v& j步。该命令执行同步之前会要求你输入terry账号的密码,这个账号是我们前面在rsyncd.secrets1 X  q  I1 ?, j* d
文件中定义的。如果想将这条命令写到一个脚本中,然后定时执行它的话,可以使用--password-file
7 `3 h( F+ J6 I) B/ h选项,具体命令如下:/ G+ g8 f+ ~/ T
  # rsync -vazu -progress --password-file=/etc/rsync.secret. @; J4 a+ f$ S
  terry@192.168.100.21:/terry/ /home# X- x& a8 Q, K% h
  要使用--password-file选项,就得先建立一个存放密码的文件,这里指定为/etc/rsync.secret。
  U& `9 ]3 @8 w( F$ }: R4 A7 c6 r- c其内容很简单,如下:( B, |! O6 {& h4 l
  terry:12345% B, T9 r# \) Q) y( s2 s: K
  同样要修改文件属性如下:) S. R) D$ o9 q" T0 s
  # chmod 600 /etc/rsyncd.secrets/ R0 Z& i7 T! @" m% o& x8 h5 L

6 f- n# {/ z' ^  四、利用rsync保持Linux服务器间的文件同步实例
* n& _1 A' [6 f* l5 q4 l9 a  现在假设有两台Linux服务器A(192.168.100.21)和B(192.168.100.90),服务器A中的
: x  q$ M- ~% v6 b/home/terry和服务器B中的/home/terry这两个目录需要保持同步,也就是当服务器A中文件发生* L: O; n: H! }% [; U, j
改变后,服务器B中的文件也要对应去改变。1 E$ H4 m: P" V4 v1 r
  我们按上面的方法,在服务器A上安装rsync,并将其配置为一台rsync服务器,并将/home/terry
* P# W  x3 W" d4 [0 Q2 t目录配置成rsync共享出的目录。然后在服务器B上安装rsync,因为B只做客户端,所以无需配置。7 \: Q3 r2 ^' O5 D8 k
然后在服务器B,建立以下脚本:
1 [% k8 K6 Y& v2 E1 L* s% u  #!/bin/bash
- ^! X; l, c8 K( I# O  /usr/loca/rsync/bin/rsync -vazu -progress --delete1 ~6 z& i( ]7 D: g  O0 J! a* i
  --password-file=/etc/rsync.secret terry@192.168.100.21:/terry/ /home2 u5 B+ E# ]4 Q& C
  将这个脚本保存为AtoB.sh,并加上可执行属性:
1 g" e2 o- C' u1 d: G$ |  # chmod 755 /root/AtoB.sh. j/ e8 K8 s" m+ {) N2 V' \
  然后,通过crontab设定,让这个脚本每30分钟运行一次。执行命令:
, s7 ], v7 w* h1 d/ r# w9 H  # crontab -e
& O9 _) j/ j! x9 s# N6 @9 y  输入以下一行:2 d, H3 ~  g. [9 T7 {7 L
  0,30 * * * * /root/AtoB.sh
: }6 B  z7 a# }# j- X2 z  保存退出,这样服务器B每个小时的0分和30分时都会自动运行一次AtoB.sh,AtoB.sh是负责; S6 ^5 E3 A. A3 u* ?
保持服务器B和服务器A同步的。这样就保证了服务器A的所有更新在30钟后,服务器B也一样取
5 g$ I7 a2 ^+ V  A2 _( L( \得了和服务器A一样的最新的资料。
4 m9 Y) J' f6 n, N7 ?. ]0 C2 {9 U4 K5 \* U1 \
  五、其它应用" O( t! h5 c, p5 K
  rsync除了同步文件及目录之外,还可以利用它来实现对远程网站的远程备份。如果再结合脚本和Crontab就能实现定时自动远程备份。其可以实现与商业化的备份和镜象产品的类似效果,但完全免费。/ z! Q  K( f7 l3 L
9 q' I4 I; o& x
         附:rsync有六种不同的工作模式:# x2 }+ q; B4 R" i% O7 o+ r
  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。0 Z$ Z3 |% }  v2 _
  2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST
1 X" z$ b3 g% f( m4 y# G. u+ ~7 Z路径地址包含单个冒号":"分隔符时启动该模式。
3 V" i$ g' L  U3 @/ s' @  3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC& ]# Z4 u. Y6 K( g1 D: J+ }
地址路径包含单个冒号":"分隔符时启动该模式。& D3 N, Z# ?5 }, r
  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
( M* l% z$ r9 u, m  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。
% K* T# `! w# m5 D- H' N  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。9 d6 F% T! s1 r/ H- |

7 Q; @0 \3 `4 p1 A" K9 U, u
9 F7 O: n4 g1 T% q0 P. E' c: w! {( Z  p6 ?# L5 {4 ^2 a' s# s

6 w( }" l# R  @1 v2 p+ e- c7 \& y$ q

! Z) p+ T2 `- @2 H' r/ D* X3 c9 i9 K3 i

- u- h% E& X! M( |7 Z: W5 h& |9 U( ]+ A
  前段日子在网上找rsync daemon的filter等过滤规则的详解,怎么也找不到,哥一怒之下,决定自己动手翻译,于是有了本文…4 r4 _9 E+ I8 F9 W3 L
    本文内容翻译自rsync的官方文档:http://rsync.samba.org/ftp/rsync/rsync.html,以及http: //rsync.samba.org/ftp/rsync/rsyncd.conf.html,非完整的全文翻译,并且按照我的需要,对原文的相关章节或 条目进行了适当的重新编排。官方文档发布日期:26 Mar 2011。5 r+ U0 D6 D) n! N  a6 y3 D+ b
9 W/ V4 b& n' e: Y. m
    rsync是Unix/Linux系统中一款优秀高效的镜像同步和远程数据备份工具,它可以把本地文件拷贝到远程主机,或从远程主机拷贝文件到本地,也可以在本地的两个目录之间进行拷贝,但不支持两个远程主机之间的互相拷贝。
, h% p; D# ^. H' A0 S& N5 Z: W: w4 Y$ G! }6 _

' G1 K5 M( b" ~* |3 T2 M* G. c    关于rsync的工作方式:: I+ @* m% D0 B1 q: ~% ?5 Z
    rsync连接远程主机进行同步或备份时有两种途径:使用远程shell程序(如ssh或rsh)进行连接,或使用TCP直接连接rsync daemon。, d2 u- x4 S& E$ X8 B6 ?. F
    当源路径或目的路径的主机名后面包含一个冒号分隔符时,rsync使用远程shell传输;当源路径或目的路径的主机名后面包含两个冒号,或使用rsync://URL时,rsync使用TCP直接连接rsync daemon。, e& y1 `9 K' O
    特别的,如果只指定了源路径,而没有指定目的路径,rsync将会显示源路径中的文件列表,类似于使用命令ls -l。
" d+ V* }  z" d1 ?  t- v3 C
) @& h4 W# R2 Q2 F6 l( p$ c; e rsync把本地端看作client,把远程端当成server。注意:不要把server与rsync daemon混淆!daemon一定是server,而server却不一定是daemon,也可能是远程shell的衍生进程。
. ?( j" D* T6 ]    至于什么是daemon,以及远程shell衍生daemon,下文会有说明。3 f) J: i; w2 C% t7 h& K! I

( |- k) {, m' u6 B! R
6 Z! O5 x2 a0 N0 s! y    关于rsync的安装:+ v4 V  `6 k0 _, O0 j& n( A
    rsync安装方式是最常规的./configure && make && make install,只是要注意:源机器和目标机器都要安装。) A5 a1 n$ I4 L6 O* m( l8 T

8 ]# G9 F& D, W% L; n
) _' K1 q- C4 P5 S. {    关于rsync的启动:
0 O; N: V2 w& _/ N- C    前面说过rsync在进行同步或备份时,有两种途经连接远程主机:使用远程shell,或使用TCP连接远程daemon,可以把它们分别称之为shell模式和daemon模式。只有daemon模式才有启动rsync一说。
: o( R! ^& c, F9 w    如果使用shell模式,rsync安装完成后就可以直接使用了,无所谓启动,也不需要任何配置文件。远程传输时一般使用ssh作为传输工具,当然,也可以使用参数-e来指定一个远程shell。3 k' v. y8 J, l- {7 v0 A5 r' y
    如果使用daemon模式,就无需远程shell了,但必须在一台机器上启动rsync daemon,默认端口873.0 k7 @9 [0 ?0 p3 X- L+ p4 b3 v

8 @, p8 c6 ^! F2 h    你可以经由inetd启动daemon,或者作为一个独立进程启动daemon,或者由rsync client通过远程shell启动daemon。
, a! o. W! c1 W" U7 U     1)如果把它作为一个独立进程来启动,只需要运行命令:rsync --daemon即可;
) _( F4 U6 ^4 x  q( ]& S     2)如果通过inetd来运行,要修改两个文件:/etc/services和/etc/inetd.conf:$ z* T, H. |- b, e1 ]8 g
      在/etc/services文件中添加如下行:rsync 873/tcp
4 X+ {. ^3 N5 C- b. k1 k4 t      在/etc/inetd.conf中添加:rsync stream tcp nowait root /usr/bin/rsync rsyncd --daemon# _0 X3 ~2 ?2 L& u% q8 K
  注意把/usr/bin/rsync换成你的rsync安装目录!然后重启inetd服务,使配置文件生效。: z. Q5 j( N  F: ]

4 h! Y0 X% n3 B) j- c8 d2 y    关于由client通过远程shell启动daemon,官方文档中有一个条目:USING RSYNC-DAEMON FEATURES VIA A REMOTE-SHELL CONNECTION。8 [7 z8 w* {) O) u- Z
    条目中说,rsync支持这种用法:使用远程shell连接host,然后衍生出一个single-use “daemon”服务器,来读取远程用户家目录下的配置文件。从用户的角度看,通过远程shell连接而启用的daemon传输,它的命令行语法跟正常的 rsync daemon传输是一样的,唯一不同的是,你必须在命令中使用--rsh=COMMAND来明确远程shell程序。如下例:
/ K1 R+ R0 v7 `4 r, \. D3 `: A    rsync -av --rsh=ssh host::module /dest2 I* O% E* e# |; z  D6 T
  译者注:虽然官方文档中说这种用法在某些情况下很有用,但我觉得很别扭。
' R8 F3 W" `1 u4 Q. q, y: v% r3 I! I. z/ Y4 O" N7 a9 R; `) B
    当rsync作为daemon运行时,它需要一个用户身份。如果你希望启用chroot,则必须以root的身份来运行daemon,监听端口(1024 以下,默认873),或设定文件属主;如果不启用chroot,也可以不使用root用户来运行daemon,但该用户必须对相应的模块拥有读写数据、日 志和lock file的权限。# y$ J6 `: z9 P. F& S+ L7 b" S4 r
    当rsync以daemon模式运行时,它还需要一个配置文件:rsyncd.conf。修改这个配置后不必重启rsync daemon,因为每一次的client连接都会去重新读取该文件。
# r) o# {( ]; g2 o! M    译者注:关于配置文件rsyncd.conf的设定,后面会有详细的参数解释。
8 r1 w$ H5 o' I2 d+ W% c. a" a; h7 k- {2 X$ \% x$ l) o
    关于rsync的两种模式:2 ]0 J  A9 g1 g5 y& m' i
    该部分额外的内容来自IBM官方网站上的一篇文章。该文章把rsync的运行模式扩展成了四种,但我认为rsync官方文档的两种模式的划分更加合理一些。
9 @! d0 j/ w, E8 `# s4 f    所谓rsync daemon,就是在一台机器上永久运行的rsync进程。在任何一台安装rsync的机器上运行rsync --daemon,则这台机器上运行的rsync就是rsync daemon。我们可以把文件发送给daemon,也可以向daemon请求文件。
! h( x* m' Y3 f1 C* B+ G1 \9 N    daemon模式非常适合创建中心备份服务器,或项目存储库。
6 }7 @& N& K; X$ R  P! h  J    两种模式的区别前面已经说过,shell模式在源路径和目的路径中使用一个冒号,而daemon模式使用两个冒号。
2 O- u) _) d+ O) x
: X  j6 h& y+ _/ _    关于rsync命令的语法:- T! F: |  ?6 Z/ i' C
- f4 w0 S$ F; r/ Q
本地拷贝:    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,仍然是推动作
& _, I9 v/ Z$ s" t5 O% N    官方文档的举例:3 d. z0 e8 s6 z8 [& L
    1)rsync -t *.c foo:src/
8 _* M+ T2 V: t8 Y. J        把当前目录中所有以.c结尾的文件传输到机器名为foo的src目录中。如果某些文件已经在远程主机中存在,则跳过该文件。+ U# X% R" f; A% U9 j
    2)rsync -avz foo:src/bar /data/tmp6 K6 y5 R( p* b) v
         从机器名为foo的远程主机上把/src/bar目录及其下所有文件传输到本地机器的/data/tmp目录中。注意:源路径src/bar的最后没有斜杠”/”!4 D# ^" K( U5 `  X
        源路径的最后是否有斜杠有不同的含义:有斜杠,只是复制目录中的文件;没有斜杠的话,不但要复制目录中的文件,还要复制目录本身!
% j( z7 i( r# I# O* O* p: {1 X        目的路径的最后有没有斜杠,对传输没有影响。! T9 O* Q! Z, z% w
    3)rsync -av host:file1 :file2 host:file{3,4} /dest/
9 A5 H8 Z' f$ i) V; l+ r) y) \; C         rsync -av host::mod/file{1,2} host::mod/file3 /dest/
2 x3 b$ @5 w  u) B         rsync -av host::mod/file1 ::mod/file{3,4}" ~' [& y$ S7 P3 ^; z; ?* j3 L9 \# {
        这个例子是rsync更高级一点的用法,使用rsync同时传输多个指定文件。8 ^" P% Z4 U+ }. F9 b% \
    rsync可以一次传输多个指定的文件,方法是添加多个远程主机参数,或忽略主机名。如上例。5 w# Y# E  `8 p4 {; E

! f( T' c0 x  J    关于rsync命令中的选项:
& u1 S7 Y" l$ M) M; e( k$ j+ ]    上面例子中提到了一些选项,rsync的选项有很多,请参考官方文档。常用的选项如下:
( k' ~0 |4 X& K, P! L" @' l
/ u2 V" v3 |" H0 B. R" c/ |-a:归档模式,保持文件的所有属性,相当于-rlptgoD -r:递归模式 -e:指定一个远程shell -z:文件传输时进行压缩处理 --delete:镜像中常用,删除DEST中那些SRC中不存在的文件
2 m) O6 J3 g. m daemon也有一些常用选项,下面会有介绍。! d; H1 A& l6 C7 W2 S: f
0 W( E% q7 J8 ^/ d5 _8 f
    client如何连接rsync daemon:
  Z. b, B* H+ `7 ^" ]    上面第3个例子已经给出了client连接daemon的语法示例。但是官方文档又把本条目单独列了出来,提醒我们在连接rsync daemon时要注意的几点:2 m1 x% Z. C. Z% g' R
    1) daemon模式中的源路径,即SRC,实际上是模块的名称  |2 h8 p4 {4 H) y5 T
    2) 如果未在双冒号::后面指定源路径,则rsync会列出daemon上所有可能的模块
' O/ K. [" h# c) F    3) 不要使用--rsh(-e)参数
# a; ?3 X/ }9 y/ S6 n8 }    4) 有些模块可能需要密码认证,你可以使用--password-file选项,来指定密码文件0 T: }3 |* B% Q: t% _0 B9 D
* M5 ~/ b. X5 ]5 Q& h
    启用一个rsync daemon来接受client的连接:
( t# o: H8 i( l( O) \    除--daemon外,rsync daemon启动时还有其它一些常用选项:
* E' O# N5 i/ I. b$ A6 Z! D" f    --daemon:
3 Z! Z0 ^  v3 ~6 j: W4 N8 [      使rsync作为一个daemon运行。daemon有两种启动方式,前面已经说过。对client发出的每一次连接请求,daemon会读取配置文件rsyncd.conf,然后做出相应的回应。
  e/ E2 }5 L, v+ ^+ p    --bwlimit=KBPS:
( z" }( _6 l  z! f3 p3 T6 ^      指定daemon每秒传输的最大千字节。client在请求连接时也可以指定一个--bwlimit值,但该值不能大于daemon端的设置。
9 @9 k7 r2 ^2 t. r# n( M' M    --config=FILE:" v7 w! n0 }# ]4 n# `
      指定daemon的配置文件。只有当rsync以daemon模式运行的时候,该选项才有效。默认的配置文件为/etc/rsyncd.conf,除非 daemon是通过远程shell运行,并且远程user非超级用户,这种情况下,配置文件rsyncd.conf默认存在于当前目录(在$HOME目录 中比较典型)。关于通过远程shell启用daemon,见上文。2 j! g$ p6 s6 O5 V% r
    --port=PORT:
* a- G% X. P6 y& n; w" Y# |      指定daemon监听的端口。4 J1 w# o2 U9 l) Q" u3 x
    --log-file=FILE:
6 X; v) ~: ~  [( |+ Y      该选项告诉daemon不要使用rsyncd.conf中指定的log文件,而要使用此处指定的文件。此选项很少用到
4 t7 C) _, W3 G% I8 Y/ X
- R! ~$ [, o- K$ _. V4 X/ T/ O
) G2 p" Q% u" M9 R5 S# D8 {9 g4 J5 o, r; m3 U
rsync 远程数据同步工具详解' X' r& s4 ]& \- U" S4 P, x8 \
  E% g8 r# q  R+ d; K- q
rysnc(remote synchronize)在CentOS系统默认安装在/usr/bin,此外rysnc在windows平台下也有相应版本。主页地址为: http://rsync.samba.org/4 p6 ]* J& |7 i) Y# C
) E! p2 c5 ]5 `' Y- D
rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远 程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。
- \0 L- s! E2 z' M, [" p; S3 l- J' R
rsync本来是用于替代rcp的一个工具,目前由rsync.samba.org维护,所以rsync.conf文件的格式类似于samba的主配 置文件。rsync可以通过rsh或ssh使用,也能以daemon模式去运行,在以daemon方式运行时rsync server会打开一个873端口,等待客户端去连接。连接时,rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份。
! F0 u) l$ D9 d( {% E; w) a$ S  k  K2 z! `  ]
------------------------------------------------------------------------------------------------------------------------------------------------------------
1 F+ d5 W# r& l' a
. S% U" _5 g* jrsync的命令格式可以为以下六种: 6 g$ q; Y/ |4 ~. k9 d( g0 o
9 b4 G: {* C+ f9 B2 l$ k
  rsync [OPTION]... SRC DEST
1 R2 o- s3 C) K2 t# }) h" N% l  rsync [OPTION]... SRC [USER@]HOST:DEST4 h1 r0 c4 J' C# k) R
  rsync [OPTION]... [USER@]HOST:SRC DEST
. @3 O& k9 l( o; O; m1 O0 K0 H5 o  rsync [OPTION]... [USER@]HOST::SRC DEST7 P9 i4 j! m6 I
  rsync [OPTION]... SRC [USER@]HOST::DEST
& y/ \5 i% F6 K' T, t  rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
" z# j1 ?& ]: n( a+ k* Q0 Q) X2 a* |' C& v' f! A( h$ T4 D
  对应于以上六种命令格式,rsync有六种不同的工作模式:
0 C1 Z. ~9 N5 j& v! F5 f# j! N) s/ M
  1、拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。如:rsync -a /data /backup
" X. G3 Y) }0 s* y6 a1 g* m+ O* v  2、使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。如:rsync -avz *.c foo:src
& y) G/ h6 P3 B+ _  3、使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。如:rsync -avz foo:src/bar /data& d* C. s! u* D
  4、从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。如:rsync -av root@172.16.78.192::www /databack
1 k5 ^, s- N3 V- P% N) x7 T) T& r  5、从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。如:rsync -av /databack root@172.16.78.192::www
/ P' b% n- y  W9 J" _0 S) [! {  6、列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。如:rsync -v rsync://172.16.78.192/www
5 I% G+ ~, r& e  f
& a2 e- ?8 }* P/ s+ F' krsync 命令常用参数 - x7 a1 X+ J4 d
-a 递归方式传输文件,并保持文件属性,等价-rlptgoD不包含-H
6 W; ~9 v: z" S-r 子目录以递归模式处理
$ x$ k& E$ n) u% E! k/ a  Y-l 保持符号链接文件
2 [! P4 Y. ?) G* d7 C2 s-H 保持硬链接文件: X4 b$ X8 L4 S- I3 }
-p 保持文件权限
% @' ^7 J4 n  L4 T) T) e-t 保持文件时间信息$ n4 N* A6 J" D
-g 保持文件归属组信息
# l' e& V% G- }$ Y-o 保持文件归属用户信息
; E9 d- X% R6 N! o- j! R! P-D 保持设备文件和特殊文件
, f- B1 H# |' c3 Y% L/ Y-z 在传输文件时进行压缩处理
5 L5 t! _; b. D. n6 ?--exclude=PATTERN 指定排除一个不需要传输文件匹配模式
' o1 C" Y5 n- P' Z+ B, o5 a9 g--exclude-from=FILE 从FILE中读取排除规则$ C. M" r# V7 D8 F' ?3 t  u9 b
--include=PATTERN 指定需要传输的文件匹配模式
& J" b' d! `5 q( D--include-from=FILE 从FILE中读取匹配规则
* N& ]  S' z5 N" ]--copy-unsafe-links 复制指向复制源路径目录以外的链接文件2 A3 P  I' Q2 `% w+ h! ]: y$ X) ?5 ^
--safe-links 忽略指向复制源路径目录以外的链接文件(默认)
' {+ |# R) D& S. a4 S8 N& @--existing 仅更新那些已经存在于接收端的文件,而不复制新创建文件" j  D; t" s( V! G
--ignore-existing 忽略那些已经存在于接收端的文件,只复制新创建文件' X  i# L+ h9 }* D! ]
-b 当有变化时,对目标目录中的旧文件进行备份
3 I: Q2 A+ W" I& a7 j0 d& N$ f4 s3 w--backup-dir=DIR 与-b结合使用,指定备份路径9 ?# N% _7 u8 F
--link-dest=DIR 当文件未改变时在指定路径创建硬链接文件6 ?) C& P: ^: Z
--delete 删除接收端还存在而保存端不存在的文件- g; I! s- `( K6 X0 N
--delete-before 接收端在传输之前进行删除操作(默认)
! S: ^; D/ J! o( y1 _8 d4 l$ n# R' _--delete-during 接收端在传输过程中进行删除操作
- q% `( r, _) J1 ^--delete-after 接收端在传输之后进行删除操作
  ~' @8 r7 Y; d7 a4 m--delete-excluded 接收端在传输同时进行删除操作6 a: f( x& r& G
--e,--rsh=COMMAND 指定代替rsh的shell程序,例如可以指定为ssh' X9 b! K# Z' [$ y; M. Y- e
--ignore-erros 即使出现I/O错误也要进行删除3 g7 l0 r' ]9 w9 ~2 r' b, f" _
--partial 保留因故没有完全传输的文件,以加快随后的再次传输
, \! D8 W% Y& _--progress 在传输时显示传输过程
% F. F  U" |/ f" w+ j8 f4 ]-p 等价于—partial—progress
- q' R! w' G  o1 k) r6 C--delay-updates 将正在更新的文件先保存到.~tmp~临时目录,待传输完毕再更新目标文件
* Q# z% C- O( ?0 J9 @  N$ O; m/ ?-v,--verbose 详细输出模式
3 y, P8 e7 Y$ m/ a-q,--quiet 精简输出模式
+ N7 N& [' A3 k) w0 E0 z9 P-h,--human-readable 输出文件大小9 C& L% k; h$ o, u) T
-n,--dry-run 显示那些文件将要被传输  \/ O6 V/ I; B3 n  M6 ?2 G
--list-only 仅列出文件而不进行复制
( v- c; t8 i1 n& ^--rsync-path=PROGRAM 指定远程服务器上的rsync命令所在路径: _: j* B7 r( l8 f; A
--password-file=FILE 指定从FILE中读取口令,避免在终端中输入口令
3 k3 M( @' J! V- N. T-4,-6 使用IPv4或者IPv6
1 X! k8 y# S; d/ q+ ?  }--version 打印版本信息. i0 {6 q+ h  p) @9 M6 {( o+ A8 I+ l
--help 显示帮组信息
7 o( b, s8 B9 g+ e) `- A0 N3 o4 I

& b; n$ d2 T+ v* Q; s% S注意: 若用普通用户身份运行rsync命令,同步后的文件的属主将改变为这个普通用户身份;若用超级用户身份运行rsync命令同步后文件属性保持原来用户身份不变。若指定-tg但目标计算机没有指定用户和组,则复制的文件归入501用户 501组; A1 f6 D2 r2 U. o# s) r4 g) Z
6 l5 F% G) t* D6 n8 A0 v( O  l: D
------------------------------------------------------------------------------------------------------------------------------------------------------------, K) m) p5 ?$ W/ y! g8 ]' M! B

' F. h* }* ~+ A启动 rsync 服务
% g) L0 u, C1 K; f& H3 d! G; A启动 rsync 服务
- f6 D( o8 l- S) E/ |vi /etc/xinetd.d/rsync  把disable = YES改成NO0 P+ `' _2 g# U/ V9 Q* Y1 X% N& [
service rsync" @; ~  m7 z0 ~; D' P: w5 a  N4 A
{" w2 V' G3 z; [0 a
        disable = no
' |6 @* b( h! @' Y! l        socket_type     = stream+ k2 t2 i8 `( M! q% q
        wait            = no, l# @7 |7 ^& n( j- B% c9 o+ Z
        user            = root
8 Z/ S" W4 w& }) e  m        server          = /usr/bin/rsync1 V! ?5 e0 T" v% `
        server_args     = --daemon- _  L1 A7 v. J' k" ?" c: x1 K
        log_on_failure  += USERID" y2 F, d! f9 O0 }% w
}3 k- a  @( E2 C2 k% V$ l# Z
3 e% L9 D' f$ G( |
$ M# M" \% Y# W  o/ r; p3 Y! K
( M( e% e0 p, W, h) |+ ]2 [1 ]. }
配置服务端 rsync
/ ]3 j! S* Q0 Arsync 服务器可以独立运行也可以由xinetd运行,CentOS默认以xinetd运行,同时默认监听873端口。需要创建rsync配置文件 vi /etc/rsyncd.conf
2 B/ q1 ^1 E4 q2 B1 s在文件中[module]之外的所有配置行都是全局参数,也可以在全局参数部分定义模块参数,模块参数主要功能定义哪个目录要被同步,可以根据需要来定义多个模块 uid = root ; x0 k3 B' h; J/ A
gid = root ) o* }6 y6 D* v8 ^. G# M
max connections = 10  K9 h  {5 L! @' u
use chroot = no ( h: ?5 T! @- `: r. h& i, x
log file = /var/log/rsyncd.log
4 n1 c, I4 H: q7 e, H- Cpid file = /var/run/rsyncd.pid
: ~5 s4 B6 j' `, ?5 w$ P! xlock file = /var/run/rsyncd.lock 5 S* `2 g# m5 V/ ]

- Y$ L0 I' O4 A' G- s' `[tongbu]
2 a" }3 d9 b8 d! ?7 qpath = /opt/tongbu
; X9 m0 Y6 U# [' q- w! E0 jcomment = hello world
1 _1 A6 K0 V8 ]4 B+ Hignore errors = yes
+ |" r5 r+ e! P/ Kread only = no
$ i. g& S: d, ~  W1 Z2 }" Ihosts allow = 192.168.1.125 % }$ v% m* ^) G. F2 |
hosts deny = *; i9 w. ]: T% O# k
(可以匿名连接,不安全,详细参考以下)8 M" k5 V9 H: w4 x6 G
启动并设置随系统启动 rsync,要求 服务端和客户端都启动 ,否则使用的时候报错Connection refused" T$ c1 t* a+ G/ `% A# }2 i

/ Q! F; B) ~( {- r
2 F; J5 T" k7 q0 L/ u' J2 E- prsync --daemon –-config=/etc/rsyncd.conf
8 y) q- @+ `. t+ V3 M" xchkconfig rsync on
5 @+ B4 \/ T6 T- h' `! D+ y7 r! ^: B7 x9 p5 e" J3 |# p  a
& |" C, i7 _3 j9 b
------------------------------------------------------------------------------------------------------------------------------------------------------------
( j2 \- x' O9 w. ?0 l. f+ z
, M5 l+ R4 @" C8 z" Y9 J$ M全局参数
* Z9 h. y1 D( Z' Z1 Oaddress 指定的服务器运行的IP地址。由xinetd运行时将忽略此参数: G% T( s# |1 b9 l* }
port 指定rsync守护进程监听端口号(默认873)。由xinetd运行时将忽略此参数
3 n" D9 A+ i  I: R, dmotd file 指定一个消息文件,当客户连接服务器时该文件内容将显示给客户
  p# _* D, g1 Bpid file rsync的守护进程将其PID写入指定的文件
9 Z$ o: t/ m& ]log file 指定守护进程的日志文件,而不将日志发给syslog$ z6 I; f1 ~; I# h( ^& J& j3 p* d
syslog facility 指定发送日志消息给syslog时的消息级别3 L3 r# b+ ^% w- Q8 f& ?1 B
socket options 自定义tcp选项, R  a9 y) g0 ?! g2 {8 p9 x5 c

3 c( D/ X7 [7 H! O基本模块参数 . }3 _9 J" F+ r, P9 U; K; f
path 指定当前模块在rsync服务器上的同步路径,必须指定
: }7 v6 w/ H2 F/ g4 Lcomment 给模块指定一个描述1 c0 @1 V4 v/ `2 M
控制模块参数/ Y7 r! e: y% J4 {
use 默认为true,传输文件之前先chroot到path参数所指定的目录下,这样做实现额外的安全防护,但缺点需要root权限,并且不能备份指向path外部的符号链接所指向的目录文件
/ \, O; [( F& X' W  h- Ouid 制定该模块已指定的UID传输文件* N3 {6 l9 p% c7 B7 ^
gid 指定该模块已指定的GID文件
$ F# D8 C8 t" `- c3 _; ~max connections 限制最大连接并发数以保护服务器,超过限制则提示稍后操作
/ N( g+ n$ I+ ~! p& g: f. @lock file 指定支持max connections参数的锁文件,默认/etc/run/rsyncd.lock9 ]) \$ p) e3 r1 c; G
list 指定当客户请求列出可以使用的模块列表时(默认ture),该模块是否被列出。如果false,可以创建隐藏的模块
: j$ x' s0 o* E6 Eread only 是否也许客户上传文件,默认ture则不也许上传。为false并且服务器目录具有读写权限则允许上传2 r5 G2 ~- Y, g) X# m( I
write only 是否也许客户上传文件,默认ture则不也许下载。为false并且服务器目录具有读写权限则允许下载
" K& x4 E) S7 w, E0 f* kignore errors 指定rsync服务器在运行delete操作时是否忽略I/O错误
/ k7 h/ k$ Q& [/ Jignore nonreadable 指定rysnc服务器忽略那些没有访问文件权限的用户
9 A. j" @3 [+ y3 ^$ g. stimeout 设定连接超时时间,单位为秒
. Z) Z! S3 K, I- U0 idont compress 告诉rysnc那些文件在传输前不用压缩,默认已设定压缩包不再进行压缩# u5 G, m7 X: r2 C5 p
refuse options 定义一些不允许客户对该模块使用的命令选项列表2 w$ b/ O4 d* L. L
文件筛选模块参数 7 o! K8 V" m2 F' D" X: \! |$ W
exclude 指定排除的多个文件或目录,由空格隔开5 i+ J, o) V8 w- |
exclude from 从指定文件中读取排除规则' H; j' e) ?" d8 h& ?/ N! L
include 指定包含复制多个文件或者目录,由空格隔开
7 u# B5 `) S, ]. B; ^5 ]( _* ~6 q; Einclude from 从指定文件中读取包含规则
' g5 N. I0 k3 Y  C8 `# a- g用户认证模块参数
" a& t' M/ c* {3 [5 T2 T) kauth users 指定用户才允许连接该模块
9 W+ u( b+ w1 @# ]1 x' ]5 C( dsecrets file 指定一个口令认证文件,格式是 用户:密码,即指定用户和密码连接匹配才行,不匹配的话会提示ERROR: auth failed on module,不设置该参数则可以匿名连接。
, Q( s: p+ r$ o" Y( Bstrict modes 指定是否检测口令文件权限。rsync认证口令文件权限一定是6006 Q  o3 w$ P0 F. w
访问控制参数 ' p, ?9 s' V: |& ]1 y  G
hosts allow 指定哪些IP可以访问该模块- }$ b. j! m5 I- \2 ~2 y
hosts deny 指定哪些IP不可以访问该模块,*表示全部# z6 ]2 U9 z' Z+ n& w  J* s3 h$ K

/ c3 o# q' v& z; A
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 点击这里给我发消息

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

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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