易陆发现互联网技术论坛

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

Ubuntu下 rsync同步文件实例

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

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

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

x
Rsync(remote synchronize) 是一个远程数据同步工具,可以使用“Rsync算法”同步本地和远程主机之间的文件。1 U! D( c9 A, F. C
rsync的好处是只同步两个文件不同的部分,相同的部分不在传递。类似于增量备份,$ f; j% `5 B; w0 y6 q$ C. H/ _- h- }
这使的在服务器传递备份文件或者同步文件,比起scp工具要省好多时间。
5 `2 G: f" D( L9 v8 pOS:ubuntu server 10.04
5 p3 E, `6 J: u$ Y- J( qserver:192.168.64.128
0 o# W1 \; Z# @2 a1 Lclient:192.168.64.145' N* i. K: W5 B" L. ]
server  a$ ~0 G' N9 a) D5 J+ w) C
1.ubuntu  server 10.04默认已安装rsync,rsync服务默认不是启动的,我们要修改下面的文件。
6 ]; c' o8 R+ T* N* |/ F3 k6 f9 ^$sudo vi /etc/default/rsync+ y, Q. }) l& k0 Q: ]
RSYNC_ENABLE=true   #false改true
# C* ~, n! Z  D# m$ O4 v' k" ^2.修改配置文件
5 B. l: w/ r- W+ [$sudo cp /usr/share/doc/rsync/examples/rsyncd.conf /etc   #已默认安装的软件,默认不启动的似乎都要这么做
8 E3 n7 `3 _, z2 Y2 c# ^7 P我们先来查看一下这个文件
! o) K: a9 W' j$sudo cat /etc/rsyncd.conf, K8 {1 y7 J) f2 F' u# b) X

! \0 W, k4 Q! v3 {, M# sample rsyncd.conf configuration file, E# T/ G9 ~, y3 a! B. H6 [

6 R# g5 D6 k( M# GLOBAL OPTIONS
, K1 U2 @3 e! {. D3 ^5 C6 J$ l5 h. s; {; ?! b, F& e$ u2 R
#motd file=/etc/motd #登录欢迎信息! S& ~8 [- P' }; E6 P) h
#log file=/var/log/rsyncd #日志文件; l# D! s) f7 X6 I3 h  r  M4 j
# for pid file, do not use /var/run/rsync.pid if
- E7 f& x2 ], |' H. `0 ^0 O# you are going to run rsync out of the init.d script.# O) B/ i- h5 ~3 j. B& I2 x0 j
pid file=/var/run/rsyncd.pid+ P5 R! {. R& W+ `# _
. v6 E  K: Z, s+ J7 b) J
#指定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。' d$ S' Y: N1 n  ^
#syslog facility=daemon
# l/ l. J. s+ K, [- W, F; l
8 n1 p4 J3 N- r* j% f8 a! ?#自定义tcp选项,默认是关闭的
& Z) b* [& t) \#socket options=
, e/ }9 @# a7 B0 m" L, f( c- e) x* M! k
#以下是模块信息,我们可以创建多个模块
% X! H6 K+ \) t# MODULE OPTIONS
" }0 U, N& F0 D7 n
) N5 R- h8 r4 t4 q) y4 D[ftp]( m* _9 ^% x% m
0 z0 x: U$ k/ J+ @* `
        comment = public archive #模块描述8 v0 p# m& v1 d. j3 k) u
        path = /var/www/pub #需要同步的路径! i4 `- K3 T0 N3 F  \! N, K
        use chroot = yes #默认是yes|true,如果为true,那么在rsync在传输文件以前首先chroot到path参数指定的目录下。这样做的原因是实现额外的安全 防护,但是缺点是需要root权限,并且不能备份指向外部的符号连接指向的目录文件。7 {& G5 H9 n- x3 _& t) H( [  j
#       max connections=10 #最大连接数" }7 O  @1 V4 J5 z* v# j: t. e
        lock file = /var/lock/rsyncd #指定支持max connections参数的锁文件。
+ m  G7 y5 q: U! `; B( L# the default for read only is yes...' \9 {5 a; d& W6 n0 p
        read only = yes #只读选项! s  A7 X5 s  t- @
        list = yes #客户请求时可用模块时是否列出该模块
5 h0 C- q* s1 N6 f        uid = nobody #设定该模块传输文件时守护进程应该具有的uid4 j% q' V3 H) c* z% X2 }
        gid = nogroup #设定该模块传输文件时守护进程应具有的gid,此项与uid配合可以确定文件的访问权限+ {' ]1 N% q0 m6 E7 {9 E
#       exclude = #用来指定多个由空格隔开的多个模式列表,并将其添加到exclude列表中。这等同于在客户端命令中使用--exclude来指定模式,不过配置文件中 指定的exlude模式不会传递给客户端,而仅仅应用于服务器。一个模块只能指定一个exlude选项,但是可以在模式前面使用"-"和"+"来指定是 exclude还是include    #这个我的理解是排除目录中不需同步的文件. @2 C: C5 R+ S4 L
#       exclude from = #可以指定一个包含exclude模式定义的文件名$ V9 s. ~+ m& G8 U# i' J' b
#       include = #与exclude相似6 \4 t; D% I; C0 q! H2 l5 q' _' Q
#       include from = #可以指定一个包含include模式定义的文件名1 V" t: E; x- e( a) N  k
#       auth users = #该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的 challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)6 c& h# y7 v6 w$ F# F
#       secrets file = /etc/rsyncd.secrets #该文件每行包含一个username:password对,以明文方式存储,只有在auth users被定义时,此选项才生效。同时我们需要将此文件权限设置为0600* S' E8 D" N  I& V' ]; t
        strict modes = yes #该选项指定是否监测密码文件的权限,如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认值为true
& x  l  |3 b  t9 z3 C+ M" U#       hosts allow = #允许的主机& ]% s8 ?6 k: M- _' |0 B
#       hosts deny = #拒绝访问的主机
7 y0 L0 t/ k; u' ~% P6 [3 x        ignore errors = no #设定rsync服务器在运行delete操作时是否忽略I/O错误! ~9 @' J3 w6 N" j3 v0 s
        ignore nonreadable = yes #设定rysnc服务器忽略那些没有访问文件权限的用户2 S7 t% h" K, t2 Z
        transfer logging = no #使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中) b5 K1 w. b; W4 b
#       log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes. #设定日志格式! u% R6 \9 i+ N0 G( v
        timeout = 600 #超时设置(秒): o# \0 k# @  f5 _! X
        refuse options = checksum dry-run #定义一些不允许客户对该模块使用的命令选项列表
- Y- t4 Z# S( p        dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz #告诉rysnc那些文件在传输前不用压缩,默认已设定压缩包不再进行压缩
* P7 m2 P+ O! F+ A+ P5 O* g6 t4 H  a$ I
; F3 `& q! D5 d1 v( h' z3 B6 E% G6 {6 {# o  P  M  T3 }
日志格式选项列表:/ W: G# ?8 v( z6 k7 n1 h
%h:远程主机名, O- Q  V) V7 p# B( S# W- [
%a:远程IP地址
5 B/ p* e+ R1 S) E1 B; i' L%l:文件长度字符数) r! q4 a* z& \" Y
%p:该次rsync会话的进程id
# O5 t/ h1 w1 A' x. D%o:操作类型:"send"或"recv"、”del.”
- D+ L% f' Y; ?%f:文件名9 D# @$ G9 \0 f: z0 [
%P:模块路径
! U, @9 z; f# D: z  e* i%m:模块名3 R- m3 G; l' ^; ^2 Z1 Z& r
%t:当前时间
% X3 w- K; v0 u% ?; h. w$ k5 p& |%u:认证的用户名(匿名时是null)% F7 O3 t  j8 E) a% |
%b:实际传输的字节数  R3 v4 g1 O3 Y- e7 m
%c:当发送文件时,该字段记录该文件的校验码7 b' y: G7 x7 f' L/ |$ k( K) F. Q' X

* V: |% A4 p. R. k2 _9 ?0 w. P  p4 W下面我们来定义自己的conf文件
! e4 b0 I. b6 J% I$ L4 J# {2 @8 Y6 S1 y$ D0 t0 H/ B
# sample rsyncd.conf configuration file
! ~% n! `7 B* ?7 {( d# b# GLOBAL OPTIONS
( N. a9 s0 l, X$ R2 p# s#motd file=/etc/motd
4 _/ w" \- O: Z6 X. l6 klog file=/var/log/rsyncd# n* |4 g- P' q
# for pid file, do not use /var/run/rsync.pid if) C& Z8 O0 D% m. @/ |4 ?4 ^3 i) k
# you are going to run rsync out of the init.d script.1 s) D9 G0 z! P: {* l' f% T( l% g
pid file=/var/run/rsyncd.pid
) P% q8 i+ k. y6 w3 Usyslog facility=daemon
  `7 C) X! U2 T% ~. Z$ ?' D#socket options=( C2 |+ o, K+ t7 a
# MODULE OPTIONS! m- z$ H, ^+ ]- i5 L+ H
[my_rsync_bk] #名字可以任意命名,只要客户端的rsync命令一致5 @6 W  w' a7 m
        comment = public archive
) T2 M7 _! \( o        path = /home/rsync_bk                             #指定路径,如果没有这个目录自己建。
8 Y) f! g2 u  d6 J) o; p        use chroot = no( A0 j/ V/ f" [- d
#       max connections=101 n' y3 d( S# [
        lock file = /var/lock/rsyncd
' R5 ~- ^" }: R  x: ~+ e- P' Y# the default for read only is yes...
' \7 A: K/ _6 [5 O' |        read only = yes+ y9 S9 B$ u! @6 k1 A/ H
        list = yes
. g7 k  ^$ `0 ~        uid = nobody- e' k* M9 y( ^) M: \
        gid = nogroup; R8 ]+ N& U- S: {- N7 b) J
#       exclude = 6 |, @( b" ?* E, O, J
#       exclude from = ) C5 N! J$ ]$ T' c6 E
#       include =
  H; [/ u: U  Q* o, [* v/ I( {#       include from =" m0 @7 c+ j) X7 n1 e  z
        auth users = liu_rsync              #rsync连接时的用户名,要和客户端rsync的命令一致. G) C" W( e8 U- R8 d* A5 K; Z
        secrets file = /etc/rsyncd.secrets #这里是保存密码的地方,如果屏蔽掉就不用密码了0 B1 C2 y, b9 I: H( d8 j( |. l
        strict modes = yes2 H7 B( _5 @3 q
        hosts allow = 192.168.64.145 #运行的客户端ip
  |  d' ^5 ]  |- @- c+ l#       hosts deny =$ J( V& F2 ]" L+ |. \! o. H9 V
        ignore errors = yes
& }# b$ d  Z5 q! d. t3 g        ignore nonreadable = yes% \+ M+ P1 n" Q3 ?1 o" R. V# M
        transfer logging = yes3 T3 ~) c! t$ u( C) a$ q$ ]
        log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.: ^0 V  i- S8 q% p
        timeout = 600; }/ Q& q7 U# s: b% K
        refuse options = checksum dry-run( c$ v: H2 L0 E
        dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz
- M- t0 y" h6 _" ]5 a0 i0 f/ @+ K' L" e! L/ a. j8 Z0 d3 I$ S
& F$ Z$ R7 J4 E& E2 t
创建一个密码文件
0 `1 ^8 @5 J3 e$sudo vi /etc/rsyncd.secrets8 F4 Z9 g, u5 T
liu_rsync:1235 v* L1 g+ S& L$ ?
$sudo chmod 0600 /etc/rsyncd.secrets   
& i: I0 X- O( N" y$ Q# s4 Y) [2 ^) j
启动rsync
2 n. ^, I* s5 D6 _" k9 hsudo /etc/init.d/rsync start' \0 i* _- l; k4 ~6 ^$ ?

8 Y  g0 X! g5 A2 e' L( iclient1 B" ~& Y/ v3 B& _
我们再来看一下客户端的操作,一般客户端不需要进行特殊的配置,直接同步即可; j& }2 I+ |/ l8 P. M. b
rsync -vzrtopg --progress  liu_rsync@192.168.64.128::my_rsync_bk .  #.为当前目录,在服务端touch一个文件,同步后就会出现,当然你也可以指定一个位置比如/databk,需注意所建立的权限!
: V+ x# O- s3 V  f  m
. d) o, l9 R% x我们把这个同步工作交给crontab去执行。首先我们要创建一个密码文件7 S) R  ]7 j) j$ L
$sudo vi /etc/rsync.pwd输入123,保存     #密码要一致7 c2 A  x2 J' ?% W( v6 o

+ }( q0 g) ^) b* y- r- ]!注意:下面这两步操作是必须的,没有足够权限同步就会不成功,ls -l 你所指向的目录: [  v/ ^, v) g* ^7 @
sudo chmod 0600 /etc/rsync.pwd
" O5 ~8 v% f7 V$ b% P3 X) usudo chown 普通用户:普通用户组 /etc/rsync.pwd
% \% l7 B2 o: K- \6 {
- U1 \* N6 ?9 ^) _: B3 m5 l! ~( B; ^4 b然后我们打开crontab,使它自动同步
. A: r9 ^( K0 K# `  p) ~/ M$crontab -e7 s3 S: W2 A7 {0 _; H* \) j
* * * * * rsync -a --password-file=/etc/rsync.pwd liu_rsync@192.168.64.128::my_rsync_bk /databk   3 A3 Z& `% L: {4 H$ Y$ V
crontab随机启动  sudo vi /etc/rc.local
5 T* h- S( F/ c" [" b参数说明:
! f! ~0 q0 O0 u! Q3 J4 {3 V* t-v verbose,即详细模式
2 t' u- l' v; c: @+ A3 p! e-z 压缩2 t1 h6 V$ x, f
-r recursive 递归6 [" |3 L$ r; d
-topg 保持文件原有属性,一般不用加( \" a# }' |& b! L% e; g
--progress 用来显示详细进度情况
5 h' p7 e! E$ }! q+ w( h--delete 表示如果服务器删除了一个文件,客户端也应对应删除
7 |' u+ J. V) ~" t6 {--exclude="*.sh" 表明不包括某些文件
( p+ U# N- P  I# i. k. N+ D3 p--password-file=/etc/rsync.pwd 指定所使用的密码文件( f- ~6 q1 H- N0 c* I5 ~, C
最后一项是需要同步的目录  0 ^, t$ V& _# O6 q: G
注意指定使用的密码文件中只需要有密码,不要有用户名。
( h3 h% w: n- H% h------------------------------------------------------------------------
% \% w( p- _/ l0 o# s1.在本地机器上对两个目录同步
* S9 F# K6 X  ~+ d% y; D: N! t, I$ rsync -zvr filename1 filename2
: r/ _: F4 Z7 J  M# }/ D5 _; X$ m/ @/ F
上述代码是将filename1中的文件与filename2中的文件同步,如果将filename2中的文件同步到filename1中,修改代码为:8 {; i# @! y. t$ Z# y7 B
$ rsync -zvr filename2 filename15 S! z* x, ?/ M+ A. w* O; e) F# W
& i5 y( L6 H7 I" Z, n* w1 N+ o
2.使用rsync –a 同步保留时间按标记
/ t, b+ D8 i$ i$ rsync -azv filename1 filename2; K& j& x  u, _# ?
& D7 \: v# M! h: l7 a; E
使用上述命令,将filename2中新同步的文件的时间与filename1中的创建的时间相同,
6 i3 r) G7 `% h0 b" T3 T* a它保留符号链接、权限、时间标记、用户名及组名相同。
) n0 B1 x+ `9 s6 R/ b" v3.从本地同步文件到远程服务器' I; h4 J) o" S) o$ e
$rsync -avz filename1 ubuntu@192.168.0.1:/home/ubuntu/filename2' n9 n) P) l" o) {! K" }5 i8 V, w4 D

2 h: b; {* U+ x2 E. y0 D1 u% F上述命令是将本地的filename1同步到远程192.168.0.1的主机上。
0 h0 B% M* l7 h8 c& ~3 J# Q" \注意:如果远程主机的端口不是默认的22端口,假如是3000端口,上述的命令修改为,
9 X  F% G1 J/ i! v$ rsync -avz '-e ssh -p 4000' filename1 ubuntu@192.168.0.1:/home/ubuntu/filename2
5 N; p! J. b6 ?5 F& J5 q" ^6 v2 F& d7 j
4.将远程服务器的文件同步到本地
% G/ k% X' k; T* b: ?5 j" K与步骤3类似,只是将filename1与远程服务器的位置对换一下,! I( ~( x* z! H% a
$rsync -avz ubuntu@192.168.0.1:/home/ubuntu/filename2 filename1
+ ~1 m6 e+ B) a6 Z
' Y9 r% s3 Q9 B( m3 w) W( Q同理如果端口不是22,使用以下命令0 b( @& D6 D* s
$ rsync -avz '-e ssh -p 4000' ubuntu@192.168.0.1:/home/ubuntu/filename2 filename1
5 t+ W. j% |( a  {2 _! `# i
: q* ^; ^, U5 C7 x! a) j, F! ?参考:http://www.eduicc.com/read-24.html1 T' j. K2 r; s! r8 p
           http://jordy.easymorse.com/?p=273
, r* K* D0 M0 f" Z4 c% I; {) m! u* h

* S) s, e7 Y1 @! N
/ a1 d+ F6 G! k8 a2 n; _9 B8 @+ s  m: Z8 Q& T/ j
服 务器之间常常要保持些文件或目录的一致,比如一些大的软件下载网站,它们通常使用多台服务器来提供下载服务。当一台服务器上的文件更新后,其它的服务器也 需要更新,而且 在更新的时候应该是只对新增或是修改过的文件进行更新,否则会造成网络带宽和时间的浪费。rsync就是能有效的保持文件及目录的一致的 优秀软件。
8 T" o% a& u( \1 s  rsync,remote synchronize6 N  s  p8 a4 V2 j3 K: E8 M! K8 A
  顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息,而且可以通过ssh方式来传输文件,这样其保密性也非常好,另外它还是免费的软件。rysnc的官方网站:http://rsync.samba.org/,可以从上面得到最新的版本。当然,因为rsync是一款如此有用的软件,所以很多Linux的发行版本都将它收录在内了。你的Linux里并没有安装rsync,你可以按以下的安法自行安装:
9 V, y+ s5 n8 j4 X  一、安装过程& G$ m0 O" i& \) e. x
  1.下载rsync
) D4 O3 z0 [7 G/ |  目前(2003年9月)最新的rsync版本是2.5.6,从rysnc的官方网站上下载一个回来:
3 Y) b* l& W7 x, H: \# Y  # wget http://ftp.samba.org/ftp/rsync/rsync-2.5.6.tar.gz % u* L! r$ D& s9 I% @

* n$ ~, a) |2 v" ^# V- a6 G  2.解压
1 W: W& ^! R) B  # tar -xzpvf rsync-2.5.6.tar.gz, y8 y0 d8 N' H7 p

, K8 Q# o7 t! r/ n6 ?  3.编译安装- N" k4 x. E1 _3 D
  # cd rsync-2.5.6/
) M1 B2 F  M, I! `" y1 `  # ./configure --prefix=/usr/local/rsync7 r9 e! B' Q3 O: I3 f
  # make
' Z: I# X+ Q+ M! P  # make install% M- [' H) K. r! W& @- Z  q
  以上过程没有出现的话就安装好了,现在就有rsync命令可以用了,rsync命令放在1 X1 }4 w$ U( b9 E: k
/usr/local/rsync/bin。用rsync命令可以去运行有rsync服务的服务器上抓取资料。
: F6 K2 m: g1 N  @2 ?! ?6 W4 j  如果要把当前的机器变成一台rsync服务器的话,就需要继续进行一些配置了。
% P& @  |: B" @/ ^7 `; X6 L. J/ B( [' ?) |0 _8 q
  二、配置rsync服务5 P0 M, N  W+ P7 h
  配置一个简单的rsync服务并不复杂,你需要修改或建立一些配置文件。" s$ _' L7 R: ?9 E9 u8 j- l) u" @
  1.rsyncd.conf
3 v" x/ S; S9 P/ ?# P. U) I) ^* v  # vi /etc/rsyncd.motd
5 w6 `  L2 M: e5 q  rsyncd.con是rsync服务的主要配置文件,它控制rsync服务的各种属性,下面给出一个% O8 T; h8 S) h9 |" F2 s
rsyncd.conf文件的例子:
# I/ t' H6 a! U+ ]  #先定义整体变量  y6 b+ l& [$ o* l$ U# E( g8 x2 E
  secrets file = /etc/rsyncd.secrets2 l% U$ A! {  x- ~! h# ^0 B
  motd file = /etc/rsyncd.motd3 H, J% z, F+ J5 Z/ C6 _
  read only = yes
% h& e+ ^; k% @  P  v+ x  list = yes# C' `; x1 y  M! Z1 l
  uid = nobody
1 U( F1 }; B; L3 C  gid = nobody
) P" [: B% }& D' C6 C2 f  hosts allow = 192.168.100.90 #哪些电脑可以访问rsync服务# }1 W) Z7 j1 G- z
  hosts deny = 192.168.100.0/24 #哪些电脑不可以访问rsync服务  N* X, ]. t; C2 ?2 S0 U
  max connections = 2
4 S2 ~1 R! [3 C% y8 n  x7 w8 J  log file = /var/log/rsyncd.log0 ?, ~; E. x  ]) d* a; u# s
  pid file = /var/run/rsyncd.pid
9 {6 ^# w# `5 V% L# c  d: G3 h  lock file = /var/run/rsync.lock
- ?6 J, T" k; S! k+ Y  #再定义要rsync目录/ d, \5 h( z5 h/ A- X# E
  [terry]1 f/ L) f/ X9 n/ L& z1 c2 f
  comment = Terry 's directory from 192.168.100.21
* _5 M) a- A) S0 Y/ Z/ \7 m4 @  path = /home/terry
( Y! f( ~+ b+ k" e3 o5 V3 ^$ m7 S  auth users = terry,rsync
  j  O# y% ~* ^: u4 G  [test]
& \/ p3 ]* q4 H! M6 r7 h  comment = test rsync
# t8 b  e, n' N* F2 X1 c, R- e2 N) I" L  path = /home/test: f  J+ ]- z7 C% x: w  G
   在上面的配置文件中,限定了192.168.100.0/24这个子网中,只有192.168.100.90的机器可以来访问这台rsync服务器的 rsync服务。配置文件的后面部分定义了两个rsync的目录,terry目录是只有知道terry、rsync两个账号的人才能使用的,而text目 录是无需账号就可以访问的。rsync在定义目录时还提供了一些其它选项,可以作更严格的控制。; y$ w# j3 V. E* Q: l

4 \* B) m# m! z0 k  2.rsyncd.secrets$ Z- G& F. P1 B  I
  # vi /etc/rsyncd.secrets' _1 O! j3 @1 n
  rsyncd.secrets是存储rsync服务的用户名和密码的,它是一个明文的文本文件,下面给出一个rsyncd.secrets文件的例子:
( K% m6 x( f: i/ B. e  terry:12345  R* F- A0 m# ?0 o7 g- O
  rsync:abcde
" J  x: U* v  |  因为rsyncd.secrets存储了rsync服务的用户名和密码,所以非常重要,因此文件的属性必须9 ~7 Q! T8 Q) b; W2 o/ z
设为600,只有所有者可以读写:) |( W! }- a2 A5 K
  # chmod 600 /etc/rsyncd.secrets
3 X! M. a4 Z1 e+ H% t
) X% L4 R- i4 ~" K7 I  q* J# ~* }  3.rsyncd.motd9 Z8 `+ Y* C% i3 j+ _( r" H7 X
  # vi /etc/rsyncd.motd
5 I+ }+ j! U% M2 E  rsyncd.motd记录了rsync服务的欢迎信息,你可以在其中输入任何文本信息,如:5 T& J+ g4 }! R
  Welcome to use the rsync services!
( [+ q$ t1 Y4 E% m  o2 g2 U  X6 O; \8 p' H( B
  4.services
7 j% l- C0 h3 a- z# ]  # vi /etc/services1 T* {/ Y1 F- \8 e$ ~( j# e
  services并不是rsync的配置文件,这一步也可以不做。而修改了services文件的好处就在于1 `0 B$ b; j  H
系统知道873端口对就的服务名为rsync。修改services的方法就是确保services中有如下两行,* R4 J: `3 g) p8 n3 q/ x' a, d5 C
没有的话就自行加入:/ Q+ |# O; s6 }, X- J
  rsync  873/tcp  # rsync; _6 O: T9 k/ e1 W
  rsync  873/udp  # rsync4 K6 i  l7 H' L" E4 l
  5./etc/xinetd.d/rsync
+ C* `& B# H/ S7 T8 h" m  # vi /etc/xinetd.d/rsync
2 R  c! {) F+ N% H  建立一个名为/etc/xinetd.d/rsync文件,输入以下内容:: }4 u6 B, ~2 t$ ^& ~% B8 Y$ t2 K( c
  service rsync
' `1 a/ q/ F$ O9 V  {" {1 _" C! z5 ~8 K, Y! {! ?
    disable = no
, m& P# h; Y+ V1 v& F    socket_type  = stream% `1 ?$ u6 Z; B6 E; O! t9 Z& V
    wait      = no3 z" ]" }! l0 q* i; Y, t& \
    user      = root5 B/ f) g* x0 X  @' B5 G
    server     = /usr/local/rsync/bin/rsync; u. P! l$ e! A+ M% C5 \
    server_args  = --daemon0 ~/ e1 k- D* h& F
    log_on_failure += USERID
1 g* L$ ]2 W* W6 P% O+ \$ q# s' @. A  }* ^% I9 ]) q) }/ y! ~
  保存后,就可以运行rsync服务了。输入以下命令:% H0 I6 @( p8 J- K# k, l! W, c0 v0 e
  # /etc/rc.d/init.d/xinetd reload) v" R, D  ~9 U$ M/ W( Q, d$ I
  这样rsync服务就在这台机器上(192.168.100.21)运行起来了,接下来就是如何来使用它了。
% E( R* k' F+ K0 k, I% n$ i5 L& g3 }7 b/ ?
  三、rsync命令的用法
( ~2 g' ^# I2 a4 h/ d$ b" I  在配置完rsync服务器后,就可以从客户端发出rsync命令来实现各种同步的操作。rsync有很
" K$ g# [" \; V  p4 Z多功能选项,下面就对介绍一下常用的选项:
1 U( Z# D6 T4 \8 l' K  rsync的命令格式可以为:3 Q# x' j. u# l5 m  p) K3 G) x
  1. rsync [OPTION]... SRC [SRC]... [USER@]HOST : DEST]" l: t/ W2 d( a( L: G. A
  2. rsync [OPTION]... [USER@]HOST:SRC DEST]+ K6 w9 m& p9 w6 x+ G' K
  3. rsync [OPTION]... SRC [SRC]... DEST]
7 K1 x( f& m  p. o" p5 |- [( V  4. rsync [OPTION]... [USER@]HOST::SRC [DEST]
& `# j; j) O0 m% k/ a5 _, [1 H4 w  5. rsync [OPTION]... SRC [SRC]... [USER@]HOST :: DEST]
" x+ y! o9 @6 r( x( c  u  6. rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]/ g- G- ^- F6 U3 a! H6 R- ~0 K

6 i& y% j' D9 f) ~2 P$ `  rsync有六种不同的工作模式:8 A' B3 f' G2 r5 {
  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。
  n5 f5 \3 r1 a3 f- S8 M  2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST! d8 X5 u9 r% O3 s# a/ W& q
路径地址包含单个冒号":"分隔符时启动该模式。1 o) R* G) D0 e/ w& C, x5 }
  3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC
: z0 _. t/ O0 ]! D3 I地址路径包含单个冒号":"分隔符时启动该模式。
' e- e* f5 R4 J! C  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
5 e0 e0 `/ J1 R  y  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。
$ f- A9 f% H% T( P3 c2 w8 D4 S+ L  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
9 Q: `4 T  ^& A: e1 r  下面以实例来说明:
7 J. e" e! l0 c. N  # rsync -vazu -progress terry@192.168.100.21:/terry/ /home" P, |- v- p8 o3 Z% a0 X
  v详细提示$ m" h; I0 u  f. {
  a以archive模式操作,复制目录、符号连接/ t8 n- T2 d2 F+ J  H3 e
  z压缩
' G4 i% m1 a" O, p2 B  u只进行更新,防止本地新文件被重写,注意两者机器的时钟的同时
: s0 M/ g; N: o% ], O  -progress指显示1 x: q% J5 w6 e9 S
  以上命令是保持客户机192.168.100.90上的/home/terry目录和rsync服务器上的terry目录同$ u2 E8 |7 n5 L! Q3 t9 R$ A, V, }
步。该命令执行同步之前会要求你输入terry账号的密码,这个账号是我们前面在rsyncd.secrets
7 U: R: `& g* F7 J7 l文件中定义的。如果想将这条命令写到一个脚本中,然后定时执行它的话,可以使用--password-file" ~. K$ V! Z) `* ^4 p2 l7 B4 O: K. \  t
选项,具体命令如下:
4 T( \6 S8 H  P$ I! C  # rsync -vazu -progress --password-file=/etc/rsync.secret/ u# k' y* r. Q% f
  terry@192.168.100.21:/terry/ /home4 K0 o( Z5 h- C; |% \0 V
  要使用--password-file选项,就得先建立一个存放密码的文件,这里指定为/etc/rsync.secret。9 a9 Q5 B( B9 `' e5 t- z- y% C
其内容很简单,如下:
! H* {; @9 D; w, W' `( q  terry:12345
( j/ t. @. b/ `3 l/ Y( b  同样要修改文件属性如下:* w$ y1 T; H2 J: U: Z1 J3 ]5 j
  # chmod 600 /etc/rsyncd.secrets
8 S! t1 \% l* _( T
/ [: Y6 r5 D. P- K  四、利用rsync保持Linux服务器间的文件同步实例
7 j) P( F8 C- B$ Q  现在假设有两台Linux服务器A(192.168.100.21)和B(192.168.100.90),服务器A中的
8 f  n* d1 H3 S! q1 n$ e2 c/home/terry和服务器B中的/home/terry这两个目录需要保持同步,也就是当服务器A中文件发生
2 i5 V* D9 L' H* V/ O3 l; O+ @改变后,服务器B中的文件也要对应去改变。) a' T, @9 g5 ~, |/ E6 z' U! ?
  我们按上面的方法,在服务器A上安装rsync,并将其配置为一台rsync服务器,并将/home/terry
; O: G; W  A- o3 B% c目录配置成rsync共享出的目录。然后在服务器B上安装rsync,因为B只做客户端,所以无需配置。
! B& x$ O0 p) Q8 `; o然后在服务器B,建立以下脚本:4 y0 S% d! d. t5 {! B
  #!/bin/bash- d* [/ W/ {! ~7 m% z% s; }6 z- A
  /usr/loca/rsync/bin/rsync -vazu -progress --delete
" Z$ P1 `" {( n4 R9 ~: W/ C  --password-file=/etc/rsync.secret terry@192.168.100.21:/terry/ /home4 F; j9 E2 M, ]: E
  将这个脚本保存为AtoB.sh,并加上可执行属性:3 ]/ x- |# k* j, x+ ]6 w
  # chmod 755 /root/AtoB.sh/ k9 {5 |2 b; y9 b$ P  @
  然后,通过crontab设定,让这个脚本每30分钟运行一次。执行命令:( V3 v- `, ~; L9 a
  # crontab -e
/ v" z2 I1 L0 V1 f0 J* S! I2 T  输入以下一行:
$ H7 i2 b8 x' `# M  0,30 * * * * /root/AtoB.sh. I% m; I9 d; K$ U$ i/ P
  保存退出,这样服务器B每个小时的0分和30分时都会自动运行一次AtoB.sh,AtoB.sh是负责5 e( |. d3 f6 H5 @" X
保持服务器B和服务器A同步的。这样就保证了服务器A的所有更新在30钟后,服务器B也一样取
+ ]! O9 g3 j  _7 s, a3 ]得了和服务器A一样的最新的资料。3 u3 p( E" G( u" C

( m4 O5 V2 l0 q0 t6 @& j# n4 P  五、其它应用8 d3 i% Y3 S& l6 J' b, C' r( z0 ~
  rsync除了同步文件及目录之外,还可以利用它来实现对远程网站的远程备份。如果再结合脚本和Crontab就能实现定时自动远程备份。其可以实现与商业化的备份和镜象产品的类似效果,但完全免费。# f2 a8 m- I+ G# ^  ^, Z5 N

) N' X; ?- q$ d# n1 D! X* A         附:rsync有六种不同的工作模式:
0 ?! V0 @# D3 j- v* P$ Q, l. a, t  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。
$ X  I7 n+ p! ^4 C2 v. D$ F. @  2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST
& H; S0 V& u# h. c# _2 u路径地址包含单个冒号":"分隔符时启动该模式。# [, n! x9 [& U/ V; ~& e% k0 a
  3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC2 x/ k. s. G; W! b
地址路径包含单个冒号":"分隔符时启动该模式。
; j& Z+ O4 d$ y3 o, r% V( B  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
/ h4 W2 [7 U5 {0 I# S/ N4 w* L7 s; D$ F  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。$ i2 s% D2 c  f2 ?) k5 ~
  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
: z# B* M. N- C9 a! M7 o/ v4 q1 ?& k0 @& U
% A; H: i$ b6 M* ^

+ x4 ]  r9 }! l  P5 l6 t  P8 X' K0 ?. @9 ^  ?
: ?% ]+ A2 \/ b( C. ?/ j; x
6 V' [+ r! k# @- ?" `

' H, e. K& I$ @6 W4 ^0 m/ Y% r) a* N6 b. ]6 B
2 m% N% P/ l' G
  前段日子在网上找rsync daemon的filter等过滤规则的详解,怎么也找不到,哥一怒之下,决定自己动手翻译,于是有了本文…/ S& ~) k' {: k- P5 O. J  H7 O/ c  Z
    本文内容翻译自rsync的官方文档:http://rsync.samba.org/ftp/rsync/rsync.html,以及http: //rsync.samba.org/ftp/rsync/rsyncd.conf.html,非完整的全文翻译,并且按照我的需要,对原文的相关章节或 条目进行了适当的重新编排。官方文档发布日期:26 Mar 2011。' Y  K; A5 i4 o1 Z1 |& l
: s4 N5 B$ ?0 z2 O! @% ~* p
    rsync是Unix/Linux系统中一款优秀高效的镜像同步和远程数据备份工具,它可以把本地文件拷贝到远程主机,或从远程主机拷贝文件到本地,也可以在本地的两个目录之间进行拷贝,但不支持两个远程主机之间的互相拷贝。
2 z4 f& i9 X# Y  s( f$ Z$ X  K/ |1 S  O/ l. z, v3 c! M
% a* X+ g* `- d- K& l4 K
    关于rsync的工作方式:
2 ^1 e. e5 k4 g8 D1 E    rsync连接远程主机进行同步或备份时有两种途径:使用远程shell程序(如ssh或rsh)进行连接,或使用TCP直接连接rsync daemon。
+ ]# r( q' K7 d. J: k# x$ I. z    当源路径或目的路径的主机名后面包含一个冒号分隔符时,rsync使用远程shell传输;当源路径或目的路径的主机名后面包含两个冒号,或使用rsync://URL时,rsync使用TCP直接连接rsync daemon。
0 t& x8 I5 h) [    特别的,如果只指定了源路径,而没有指定目的路径,rsync将会显示源路径中的文件列表,类似于使用命令ls -l。
2 E2 H+ z% Y( f! j0 Y( x/ u$ _; q* r- l$ d+ v: x) p0 I
 rsync把本地端看作client,把远程端当成server。注意:不要把server与rsync daemon混淆!daemon一定是server,而server却不一定是daemon,也可能是远程shell的衍生进程。
8 L4 ?7 `2 T. o* o& [6 P7 }    至于什么是daemon,以及远程shell衍生daemon,下文会有说明。
8 [5 ~, S7 k: M, s6 n# Z8 z/ G. G; t! k, _( g
. ~# G" j, Y7 V' c# {
    关于rsync的安装:8 B, H' c, U5 e
    rsync安装方式是最常规的./configure && make && make install,只是要注意:源机器和目标机器都要安装。
7 |3 ^2 m& W) p& i: f1 r  [: U# ]: \  K8 e# b  C) N

3 M' J; U3 l5 z8 c" I& T# w    关于rsync的启动:
  \$ ^+ H% d( B$ U    前面说过rsync在进行同步或备份时,有两种途经连接远程主机:使用远程shell,或使用TCP连接远程daemon,可以把它们分别称之为shell模式和daemon模式。只有daemon模式才有启动rsync一说。0 Y; m/ \* w+ |" Z
    如果使用shell模式,rsync安装完成后就可以直接使用了,无所谓启动,也不需要任何配置文件。远程传输时一般使用ssh作为传输工具,当然,也可以使用参数-e来指定一个远程shell。
# ^# q& V  N, a& W    如果使用daemon模式,就无需远程shell了,但必须在一台机器上启动rsync daemon,默认端口873.
' M# j$ n# v! s4 ?5 {& c# H( `/ N( n( A& r# x+ \8 l1 [
    你可以经由inetd启动daemon,或者作为一个独立进程启动daemon,或者由rsync client通过远程shell启动daemon。
$ ~" I: V! k- z2 {3 P. x     1)如果把它作为一个独立进程来启动,只需要运行命令:rsync --daemon即可;# `# @. u3 m" ~( c  Y
     2)如果通过inetd来运行,要修改两个文件:/etc/services和/etc/inetd.conf:3 R# C1 G  \9 c4 |, W
      在/etc/services文件中添加如下行:rsync 873/tcp
, Q0 _: e/ f# ]& h. @      在/etc/inetd.conf中添加:rsync stream tcp nowait root /usr/bin/rsync rsyncd --daemon1 X6 F6 I1 m" v- U
  注意把/usr/bin/rsync换成你的rsync安装目录!然后重启inetd服务,使配置文件生效。
7 R6 Q$ |/ J3 l! D; O+ e3 O, w, X' L; B0 R! Z8 \9 x' X" I% z
    关于由client通过远程shell启动daemon,官方文档中有一个条目:USING RSYNC-DAEMON FEATURES VIA A REMOTE-SHELL CONNECTION。; L( A4 H+ t. B* P/ T
    条目中说,rsync支持这种用法:使用远程shell连接host,然后衍生出一个single-use “daemon”服务器,来读取远程用户家目录下的配置文件。从用户的角度看,通过远程shell连接而启用的daemon传输,它的命令行语法跟正常的 rsync daemon传输是一样的,唯一不同的是,你必须在命令中使用--rsh=COMMAND来明确远程shell程序。如下例:
0 C$ C2 o/ @$ _& `$ w    rsync -av --rsh=ssh host::module /dest
2 D- h* a# z1 K) D" q  译者注:虽然官方文档中说这种用法在某些情况下很有用,但我觉得很别扭。" B4 }) }$ W4 @5 H1 C; c5 j

5 v( N- Y; r" o( `0 `. ^    当rsync作为daemon运行时,它需要一个用户身份。如果你希望启用chroot,则必须以root的身份来运行daemon,监听端口(1024 以下,默认873),或设定文件属主;如果不启用chroot,也可以不使用root用户来运行daemon,但该用户必须对相应的模块拥有读写数据、日 志和lock file的权限。/ j. ~7 W: D' C6 ~+ g0 V
    当rsync以daemon模式运行时,它还需要一个配置文件:rsyncd.conf。修改这个配置后不必重启rsync daemon,因为每一次的client连接都会去重新读取该文件。
3 M/ U6 h) `$ I( O: N5 n& K" g    译者注:关于配置文件rsyncd.conf的设定,后面会有详细的参数解释。7 ~  f/ u, c  v

& c& c3 F: r  l( }    关于rsync的两种模式:
# L# x0 E3 u6 b$ A% w    该部分额外的内容来自IBM官方网站上的一篇文章。该文章把rsync的运行模式扩展成了四种,但我认为rsync官方文档的两种模式的划分更加合理一些。7 E) X0 M1 g0 ^, J
    所谓rsync daemon,就是在一台机器上永久运行的rsync进程。在任何一台安装rsync的机器上运行rsync --daemon,则这台机器上运行的rsync就是rsync daemon。我们可以把文件发送给daemon,也可以向daemon请求文件。
' S; U4 H* ^' P2 f+ {2 T    daemon模式非常适合创建中心备份服务器,或项目存储库。6 ?( w3 [3 F* g# t
    两种模式的区别前面已经说过,shell模式在源路径和目的路径中使用一个冒号,而daemon模式使用两个冒号。
' A% R: A3 G2 P- n% _; M& W
- o+ F2 O' q) F+ U% u* G4 D6 i    关于rsync命令的语法:9 k- u* T# l, M+ ]

9 x; ?1 P! R4 L1 p本地拷贝:    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,仍然是推动作9 a! j' _* D  t( V
    官方文档的举例:& f  E2 x4 v  G. b- r0 w6 p
    1)rsync -t *.c foo:src/
$ C2 G+ A( n  }+ F        把当前目录中所有以.c结尾的文件传输到机器名为foo的src目录中。如果某些文件已经在远程主机中存在,则跳过该文件。4 e$ q9 {: X' U4 b
    2)rsync -avz foo:src/bar /data/tmp
' J- ~' u/ c5 d0 I$ z9 |         从机器名为foo的远程主机上把/src/bar目录及其下所有文件传输到本地机器的/data/tmp目录中。注意:源路径src/bar的最后没有斜杠”/”!; }, y, `: w# o* ~" `: S  o
        源路径的最后是否有斜杠有不同的含义:有斜杠,只是复制目录中的文件;没有斜杠的话,不但要复制目录中的文件,还要复制目录本身!
1 j9 @& [; `" s$ j6 K7 y) v& _' ]        目的路径的最后有没有斜杠,对传输没有影响。) O( E+ `0 O% J9 y: T5 I) Q& u. b
    3)rsync -av host:file1 :file2 host:file{3,4} /dest/: B: V# L/ r' Z0 l4 H% [' O# y
         rsync -av host::mod/file{1,2} host::mod/file3 /dest/
9 D2 f1 m! {0 q1 b% q         rsync -av host::mod/file1 ::mod/file{3,4}
% v" u) l/ E- U9 r0 I        这个例子是rsync更高级一点的用法,使用rsync同时传输多个指定文件。: \; p; K4 |+ R# b! \2 M
    rsync可以一次传输多个指定的文件,方法是添加多个远程主机参数,或忽略主机名。如上例。
6 k) l4 Z$ p9 s' i' R& C, p6 H5 O
7 i# C7 n0 T1 \6 f5 l  [+ ?0 [    关于rsync命令中的选项:; q5 ~7 v' a5 l  W
    上面例子中提到了一些选项,rsync的选项有很多,请参考官方文档。常用的选项如下:
! ]# G" ?7 W: j4 j! U' s, B2 q: I9 m7 d( \- q; d+ V! g2 u" K
-a:归档模式,保持文件的所有属性,相当于-rlptgoD -r:递归模式 -e:指定一个远程shell -z:文件传输时进行压缩处理 --delete:镜像中常用,删除DEST中那些SRC中不存在的文件
$ I1 _0 h- G% r1 Z1 \' X daemon也有一些常用选项,下面会有介绍。* B7 }" ~7 e: n+ H7 Q) }9 t
1 c! u$ ?+ k3 I& P0 G- @( _
    client如何连接rsync daemon:
4 V. a* {1 z& j; w$ {7 X    上面第3个例子已经给出了client连接daemon的语法示例。但是官方文档又把本条目单独列了出来,提醒我们在连接rsync daemon时要注意的几点:! y3 ^# n; n; A7 l
    1) daemon模式中的源路径,即SRC,实际上是模块的名称& p  w+ F: f; n2 r
    2) 如果未在双冒号::后面指定源路径,则rsync会列出daemon上所有可能的模块2 h9 i9 D/ V3 D: J
    3) 不要使用--rsh(-e)参数
% j$ ]$ n) @' H4 M: @1 F$ y    4) 有些模块可能需要密码认证,你可以使用--password-file选项,来指定密码文件' S/ [+ G+ ^& `1 x% L1 b) G

0 e' M" Z* l9 ]: T7 s1 |" ^" G, F    启用一个rsync daemon来接受client的连接:
; g* `: b! }' v% ~# a: C6 O9 T% F    除--daemon外,rsync daemon启动时还有其它一些常用选项:$ ~& Z5 A9 c& |8 _
    --daemon:5 f5 [$ f% l: r+ [. X! q: v
      使rsync作为一个daemon运行。daemon有两种启动方式,前面已经说过。对client发出的每一次连接请求,daemon会读取配置文件rsyncd.conf,然后做出相应的回应。
/ T' D, @  L+ h0 l    --bwlimit=KBPS:* N9 C/ C: l  @9 L- R1 |
      指定daemon每秒传输的最大千字节。client在请求连接时也可以指定一个--bwlimit值,但该值不能大于daemon端的设置。
7 |; \& |5 O3 C. c2 }, }    --config=FILE:
; M# m6 G4 ?( h9 p      指定daemon的配置文件。只有当rsync以daemon模式运行的时候,该选项才有效。默认的配置文件为/etc/rsyncd.conf,除非 daemon是通过远程shell运行,并且远程user非超级用户,这种情况下,配置文件rsyncd.conf默认存在于当前目录(在$HOME目录 中比较典型)。关于通过远程shell启用daemon,见上文。
4 {& E6 o- u( |5 i+ Q5 A    --port=PORT:
: o; o( a# c- G% l$ r9 y$ ?      指定daemon监听的端口。
# K" c( \8 J0 V7 v# n    --log-file=FILE:% N. B: a  u; B$ T  h
      该选项告诉daemon不要使用rsyncd.conf中指定的log文件,而要使用此处指定的文件。此选项很少用到
) s3 M8 {9 H* q% i  \
3 j+ k" N+ s/ P- C7 G0 C+ |
) X( _0 ~: d3 J5 N6 B& u' `
( L. o5 G$ J% m# Ursync 远程数据同步工具详解0 q+ a; y, [' l1 B' R) M
3 p! L7 v8 A) ?) p
rysnc(remote synchronize)在CentOS系统默认安装在/usr/bin,此外rysnc在windows平台下也有相应版本。主页地址为: http://rsync.samba.org/
$ ?/ w# U5 ^: X8 P+ L
1 T+ s" T, `2 d2 Orsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远 程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。- j9 _# u5 ]* f' R4 `, x0 U2 r( ~

& @: Z  v- R- _rsync本来是用于替代rcp的一个工具,目前由rsync.samba.org维护,所以rsync.conf文件的格式类似于samba的主配 置文件。rsync可以通过rsh或ssh使用,也能以daemon模式去运行,在以daemon方式运行时rsync server会打开一个873端口,等待客户端去连接。连接时,rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份。
, c( j, ~4 I6 X& |  n6 b% C( g3 A' w+ a+ c
------------------------------------------------------------------------------------------------------------------------------------------------------------" E" i. N- P9 P2 U& q  n( `$ u
/ A3 q6 o& Q+ D2 d3 _' K
rsync的命令格式可以为以下六种:
/ p( |6 |5 z" Y  d+ h. a3 f
6 m6 }! k* T+ o! ~9 x7 W, ]6 X2 J8 {  rsync [OPTION]... SRC DEST
- y% C2 N* p, K8 X  rsync [OPTION]... SRC [USER@]HOST:DEST
% j5 y4 v. q( l9 D  rsync [OPTION]... [USER@]HOST:SRC DEST
9 f2 r5 p8 y: }% q6 d  rsync [OPTION]... [USER@]HOST::SRC DEST
6 v7 u0 \) S, X" |( e  rsync [OPTION]... SRC [USER@]HOST::DEST+ w2 A/ A" t" q+ G
  rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST] * S1 X! ?. c( n; w' O) G! J

5 a- g2 H- P2 H6 N) W8 y9 d) n  对应于以上六种命令格式,rsync有六种不同的工作模式:
% k2 G0 p7 o/ a; `: V3 i8 ^6 c; P' M* D5 Q( z5 o3 u
  1、拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。如:rsync -a /data /backup
2 ]6 \- Y6 `' N2 H2 Z  2、使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。如:rsync -avz *.c foo:src
2 w, E% X* d/ l- b  3、使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。如:rsync -avz foo:src/bar /data8 b2 _0 V( p+ Y2 S6 ?
  4、从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。如:rsync -av root@172.16.78.192::www /databack2 W2 I1 A% s6 A, i. z1 e5 Y
  5、从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。如:rsync -av /databack root@172.16.78.192::www
: Z. `. K7 d% e/ j' X) {6 C: Q  6、列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。如:rsync -v rsync://172.16.78.192/www* k  C  J1 K! ~, W

' F& L7 r/ ~  h6 W$ V9 Krsync 命令常用参数
' k' B2 D' r9 D( g$ c% K" E-a 递归方式传输文件,并保持文件属性,等价-rlptgoD不包含-H
9 r9 d, t0 @/ X$ {4 i: e) Z9 T6 g-r 子目录以递归模式处理
1 K8 S- d5 n: Y) F, T4 B  J4 [-l 保持符号链接文件2 N7 b: v8 C" a
-H 保持硬链接文件
7 e0 ]& K5 _( W) K-p 保持文件权限. I( I. V/ u" O( c! Y) m6 o
-t 保持文件时间信息9 O. J6 G, m5 m' z) m( G8 s! ^' p, X
-g 保持文件归属组信息
% H, Y8 V* \8 u/ \-o 保持文件归属用户信息
( @& b. s) G4 N3 N3 P# j-D 保持设备文件和特殊文件0 j  G2 D4 s) W+ ~
-z 在传输文件时进行压缩处理3 M7 L2 a& H2 j" U- \4 h4 w
--exclude=PATTERN 指定排除一个不需要传输文件匹配模式
. @6 R9 l+ }9 R- f" L$ n" \( ~3 L--exclude-from=FILE 从FILE中读取排除规则3 O0 l4 f) ?; _% L8 E
--include=PATTERN 指定需要传输的文件匹配模式
8 Z+ N4 t4 V9 @8 J--include-from=FILE 从FILE中读取匹配规则
8 K: @+ O& O7 o% j" D, s! T--copy-unsafe-links 复制指向复制源路径目录以外的链接文件
* Y3 i+ i4 h* T--safe-links 忽略指向复制源路径目录以外的链接文件(默认)# S2 K+ U/ L: `3 R
--existing 仅更新那些已经存在于接收端的文件,而不复制新创建文件
7 M# D; Y7 u0 X* D9 [1 v--ignore-existing 忽略那些已经存在于接收端的文件,只复制新创建文件
1 n/ M  i0 `3 E& C! ^, i3 E-b 当有变化时,对目标目录中的旧文件进行备份
3 j5 P1 w& N0 E" w  U--backup-dir=DIR 与-b结合使用,指定备份路径: S9 r: D. f2 s8 i9 X
--link-dest=DIR 当文件未改变时在指定路径创建硬链接文件
9 B/ o: K2 {7 V: K$ W--delete 删除接收端还存在而保存端不存在的文件
  A; r+ u4 }8 N--delete-before 接收端在传输之前进行删除操作(默认)
' W! f- i* E, y+ s* c--delete-during 接收端在传输过程中进行删除操作
4 `& W" N! M- e+ E--delete-after 接收端在传输之后进行删除操作
/ ^+ S% y) x" W) r--delete-excluded 接收端在传输同时进行删除操作: c. J- L& c4 Q( D7 {/ m
--e,--rsh=COMMAND 指定代替rsh的shell程序,例如可以指定为ssh7 g. e& H1 D: e6 r# u
--ignore-erros 即使出现I/O错误也要进行删除7 h( \$ F: ~) O/ S8 E% Z- S' a! ~
--partial 保留因故没有完全传输的文件,以加快随后的再次传输. w2 B/ y- ]: d) n; d) |8 Q
--progress 在传输时显示传输过程
- a3 c0 K3 O" _9 D  {! T-p 等价于—partial—progress2 e7 J2 M8 F! X9 v6 U/ f, y
--delay-updates 将正在更新的文件先保存到.~tmp~临时目录,待传输完毕再更新目标文件
! o; H- m" a7 J& w9 z, j4 ~-v,--verbose 详细输出模式# T# r4 R8 y! u( O# N. C/ J! q
-q,--quiet 精简输出模式
5 }& V2 Q( \9 p; k. E- E-h,--human-readable 输出文件大小% s5 L5 @; W2 l6 V& ], X, ]
-n,--dry-run 显示那些文件将要被传输/ d9 F, R& \1 C% F! x- }' p
--list-only 仅列出文件而不进行复制
7 R& d1 W. P5 X' Z# q/ {& k. g! c% D9 u--rsync-path=PROGRAM 指定远程服务器上的rsync命令所在路径
+ A8 D( N  W/ ?+ _' y) h& m! W--password-file=FILE 指定从FILE中读取口令,避免在终端中输入口令
6 a/ f9 O. o4 T2 z) B* V-4,-6 使用IPv4或者IPv6
; ?' f  Z3 e$ _--version 打印版本信息
0 N8 p8 E/ e; w  `8 K# z7 k: |--help 显示帮组信息  H+ B  r9 R% i6 S! R- C' {- z
6 a* }' Z5 ]- n; G

- ~5 p, X% Z& @# R9 ^: K; d注意: 若用普通用户身份运行rsync命令,同步后的文件的属主将改变为这个普通用户身份;若用超级用户身份运行rsync命令同步后文件属性保持原来用户身份不变。若指定-tg但目标计算机没有指定用户和组,则复制的文件归入501用户 501组
' N& q- @+ z" T6 n
/ d& U$ Y# X  m% v+ @" x' V3 x7 l$ X------------------------------------------------------------------------------------------------------------------------------------------------------------
! E. V% t" A. A) J% }$ v( X* H, q+ ~, _) [# O( R; c
启动 rsync 服务
; k6 R$ n$ a% [6 C% ~5 H* `* D启动 rsync 服务
2 V6 ]+ Q7 v  |# S1 ~9 Bvi /etc/xinetd.d/rsync  把disable = YES改成NO/ s0 A4 V0 j% b1 r5 r7 k7 S, H
service rsync
$ P4 o, ^9 e- N5 ~  j3 V{; R" n0 f8 x4 J( [9 {( C& V, |
        disable = no
* n7 W" p" L1 Q4 r+ C" h        socket_type     = stream3 T8 @. J9 p7 m
        wait            = no
" o  K1 |* _& c& G9 _- b% J        user            = root' }/ K3 D. }- E4 {8 R2 w7 T
        server          = /usr/bin/rsync
" u. q* Y+ T- _( d1 Q: L3 D        server_args     = --daemon& |! L* W9 ?8 E2 S  h: X
        log_on_failure  += USERID
# J0 E8 ^5 u' n/ n' w}3 \9 D* I$ i! V; ^. D0 D

5 t: y- o+ r( \# b# X
4 }: ^$ w, K4 }6 C- A+ c1 c
5 ~" o( o$ V1 w5 R& n3 |& X配置服务端 rsync
  `& C0 [9 t2 [0 s' Arsync 服务器可以独立运行也可以由xinetd运行,CentOS默认以xinetd运行,同时默认监听873端口。需要创建rsync配置文件 vi /etc/rsyncd.conf( ~8 Z9 T) V( ]5 Z
在文件中[module]之外的所有配置行都是全局参数,也可以在全局参数部分定义模块参数,模块参数主要功能定义哪个目录要被同步,可以根据需要来定义多个模块 uid = root ; k9 N1 ~# ]: ?% x) }, c! ^1 i4 z
gid = root
1 |$ K, ~3 P1 H) d& Mmax connections = 10+ p/ y5 E) a9 e/ t& [3 p2 f
use chroot = no 1 h5 o& }1 _& w# Q/ I4 e# V
log file = /var/log/rsyncd.log
2 k- p3 U9 e. `. s. \2 vpid file = /var/run/rsyncd.pid
: \0 B7 F$ W  t; U% f2 G, Ilock file = /var/run/rsyncd.lock
+ D% `7 d2 I! B4 \( m# k( v! i2 V2 [1 K) ?3 R) _
[tongbu] 4 f! K- M/ x5 N
path = /opt/tongbu
# K7 t- O$ f0 F& ]- {, [comment = hello world   i9 Z9 a$ U; ?& U* _' k
ignore errors = yes
8 Q( b. d- f5 [1 ?7 r2 v* T8 O6 pread only = no
& E) ~( S0 B3 B" I9 t. `hosts allow = 192.168.1.125
+ a# B, Z) K, J2 y, O) ahosts deny = *$ Z2 |; n) b! `$ x, b/ d
(可以匿名连接,不安全,详细参考以下)1 S* s5 t/ Q4 Y" Q) ~( k# m
启动并设置随系统启动 rsync,要求 服务端和客户端都启动 ,否则使用的时候报错Connection refused, P/ }/ C5 @4 E: j

  A+ Y* q7 N3 a2 n" [( w
" \) q0 a& j; ]- ]6 H/ |2 trsync --daemon –-config=/etc/rsyncd.conf
, n) Z; P- \8 U7 i; ^: w) {chkconfig rsync on& S, ]. Z- c( W2 i$ V

) ^' M$ ~' K, _0 V6 @/ a# Y
% z+ P0 ?6 d! M------------------------------------------------------------------------------------------------------------------------------------------------------------
$ h# G, w) O) R# m2 j( s/ \3 A, l7 y  p+ @) Q% z
全局参数 5 o8 j# _3 G& ~$ G% E' ~& [% y6 W
address 指定的服务器运行的IP地址。由xinetd运行时将忽略此参数& N7 {' A6 e/ b: ^3 y, X" p" A( f% j
port 指定rsync守护进程监听端口号(默认873)。由xinetd运行时将忽略此参数6 u8 V3 y# `% o) m' l  P  p7 b
motd file 指定一个消息文件,当客户连接服务器时该文件内容将显示给客户
& V8 z5 {% o) ?1 k4 Epid file rsync的守护进程将其PID写入指定的文件
9 i# ^9 z7 G8 rlog file 指定守护进程的日志文件,而不将日志发给syslog8 m; o3 W6 w; h) d1 {( @) B& m
syslog facility 指定发送日志消息给syslog时的消息级别5 I1 U9 L: Q1 E/ F" s" ]" Z9 K
socket options 自定义tcp选项/ B7 f- ]7 e/ h7 E8 m1 v5 L

: c; T) Z* d! K, }" o, R0 g基本模块参数
6 q7 C1 N" n# a# Kpath 指定当前模块在rsync服务器上的同步路径,必须指定
' Q5 w8 N3 w- K) v0 l" Wcomment 给模块指定一个描述
2 ]) ^5 t+ F4 L控制模块参数- w1 i, a0 C7 p  X- q
use 默认为true,传输文件之前先chroot到path参数所指定的目录下,这样做实现额外的安全防护,但缺点需要root权限,并且不能备份指向path外部的符号链接所指向的目录文件# [' h* F3 `5 M: ?; \7 E
uid 制定该模块已指定的UID传输文件
$ [) {" T7 T$ z4 `gid 指定该模块已指定的GID文件% c: b8 m6 y+ I: R' m
max connections 限制最大连接并发数以保护服务器,超过限制则提示稍后操作2 E% Y6 w8 r0 Q& N; r* W
lock file 指定支持max connections参数的锁文件,默认/etc/run/rsyncd.lock& D8 a+ W- n  ?) j( l
list 指定当客户请求列出可以使用的模块列表时(默认ture),该模块是否被列出。如果false,可以创建隐藏的模块
/ K1 K; v/ P0 }  Mread only 是否也许客户上传文件,默认ture则不也许上传。为false并且服务器目录具有读写权限则允许上传+ c! O7 h( Y1 P. [& M7 ^
write only 是否也许客户上传文件,默认ture则不也许下载。为false并且服务器目录具有读写权限则允许下载9 m( l7 W4 Y! ^* L+ x6 |
ignore errors 指定rsync服务器在运行delete操作时是否忽略I/O错误
3 Q0 B8 [4 F+ s7 j9 hignore nonreadable 指定rysnc服务器忽略那些没有访问文件权限的用户4 `6 Q  F* x# j2 K! {- W# Y1 e0 R7 S0 y
timeout 设定连接超时时间,单位为秒) _+ {8 i; X* |2 {. d5 o/ Q- v  M
dont compress 告诉rysnc那些文件在传输前不用压缩,默认已设定压缩包不再进行压缩. S  w( p4 t: q: J$ n, h# d- f/ S
refuse options 定义一些不允许客户对该模块使用的命令选项列表  ^8 R6 s  p* N4 b. _
文件筛选模块参数
  F2 ^4 H" F) W9 ?) @  \$ o- R& {exclude 指定排除的多个文件或目录,由空格隔开* p! P2 z% c' |. Y. w! t/ I2 v
exclude from 从指定文件中读取排除规则0 S! l0 k9 m  q) J3 v3 o
include 指定包含复制多个文件或者目录,由空格隔开; Z" V0 ^* l8 }
include from 从指定文件中读取包含规则" N+ n+ R' e; O; p
用户认证模块参数
* V9 A( s& J2 Kauth users 指定用户才允许连接该模块5 O3 \& s6 j# V3 k" z7 A: V
secrets file 指定一个口令认证文件,格式是 用户:密码,即指定用户和密码连接匹配才行,不匹配的话会提示ERROR: auth failed on module,不设置该参数则可以匿名连接。 : E7 F* Y% A) Y' I* D6 B( [
strict modes 指定是否检测口令文件权限。rsync认证口令文件权限一定是600
8 m: ~4 G# P" Y* K' {- p& u访问控制参数
" t' v: Q" g* ]. U. A5 Dhosts allow 指定哪些IP可以访问该模块) E% s! |- K- [
hosts deny 指定哪些IP不可以访问该模块,*表示全部3 f% x( k$ r9 v4 {# i4 h
; o2 X0 ]3 [" p' T% [' [
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

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

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

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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