rsync服务配置
介绍:rsync 是一个快速增量文件传输工具,它可以用于在同一主机备份内部的备分,我们还可以把它作为不同主机网络备份工具之用;
它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息;
rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过ssh方式来传输文件,这样其保密性也非常好,另外它还是免费的软件。

  rsync 包括如下的一些特性:

  能更新整个目录和树和文件系统;
  有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等;
  对于安装来说,无任何特殊权限要求;
  对于多个文件来说,内部流水线减少文件等待的延时;
  能用rsh、ssh 或直接端口做为传输入端口;
  支持匿名rsync 同步文件,是理想的镜像工具


目的:架设rsync服务器,以实现文件传输、备份和镜像。
环境:
两台测试服务器信息:
服务端:172.16.34.235  CentOS5-A
客户端:172.16.34.236  CentOS5-B

一、服务端配置:
1、首先要安装xinetd,用xinetd服务来管理rsync
xinetd介绍:xinetd即extended internet daemon,xinetd是新一代的网络守护进程服务程序,又叫超级Internet服务器。经常用来管理多种轻量级Internet服务。xinetd提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。
查看是否已经安装
[root@CentOS5-A etc]# rpm -qa |grep rsync
rsync-2.6.8-3.1
[root@CentOS5-A etc]#
如果没有安装,执行 yum -y install xinetd 安装服务。

2、启用xinetd管理rsync
vim /etc/xinetd.d/rsync,将其中的disable = yes改成disable = no
------------------------------------------
service rsync
{
        disable = no
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon
        log_on_failure  += USERID
}
--------------------------------------------
注:配置完成后,重启xinetd服务(service xinetd restart),我们发现只开启rsync的873端口,服务默认是不运行的,只有当客户端连接rysnc服务器时,xinetd才自动开启rsync服务。连接断开后,服务自动关闭,端口仍旧监听。


3、配置rsync
rsync一般默认是安装的,在这里不再实际安装。
rsync的主要有以下三个配置文件rsyncd.conf(主配置文件)、rsyncd.secrets(密码文件)、rsyncd.motd(rysnc服务器信息)
服务器配置文件(/etc/rsyncd.conf),该文件默认不存在,请创建它。

  具体步骤如下:
  #touch /etc/rsyncd.conf  #创建rsyncd.conf,这是rsync服务器的配置文件。
  #touch /etc/rsyncd.secrets  #创建rsyncd.secrets ,这是用户密码文件。
    #echo rsync:rsyncpwd >>/etc/rsyncd.secrets
    chmod 600 /etc/rsyncd.secrets
  #chmod 600 /etc/rsyncd.secrets  #将rsyncd.secrets这个密码文件的文件属性设为root拥有, 且权限要设为600, 否则无法备份成功!
  #touch /etc/rsyncd.motd

下一就是我们修改rsyncd.conf和rsyncd.secrets和rsyncd.motd文件的时候了。

rsyncd.conf是rsync服务器主要配置文件。我们先来个简单的示例,后面在详细说明各项作用。

  比如我们要备份服务器上的/data/soft目录,在/data/soft打算将gitois目录排除在外;


vim  /etc/rsyncd.conf
----------------------

A、全局定义

uid=nobody
gid=nobody
注:服务器端传输文件时,要用哪个用户和用户组来执行,默认是nobody。 如果用nobody 用户和用户组,可能遇到权限问题,有些文件从服务器上拉不下来。所以我就偷懒,为了方便,可以用root 。不过您可以在定义要同步的目录时定义的模块中指定用户来解决权限的问题。

max connections=4
注:客户端最多连接数

motd file = /etc/rsyncd.motd
注:motd file 是定义服务器信息的,要自己写 rsyncd.motd 文件内容。当用户登录时会看到这个信息。比如我写的是:
**********************************************
        Welcome to use rsync services!
                2010------2012
**********************************************

use chroot=no
注:用chroot,在传输文件之前,服务器守护程序在将chroot 到文件系统中的目录中,这样做的好处是可能保护系统被安装漏洞侵袭的可能。缺点是需要超级用户权限。另外对符号链接文件,将会排除在外。也就是说,你在 rsync服务器上,如果有符号链接,你在备份服务器上运行客户端的同步数据时,只会把符号链接名同步下来,并不会同步符号链接的内容;这个需要自己来尝试。

log file=/var/log/rsyncd.log
注:rsync 服务器的日志;

pid file=/var/run/rsyncd.pid
注:告诉进程写到 /var/run/rsyncd.pid 文件中;

port = 873
注:指定运行端口,默认是873,您可以自己指定;

address = 172.16.34.235
注:指定服务器IP地址

lock file=/var/run/rsyncd.lock
host allow=172.16.34.0/16

B、模块定义

  模块定义什么呢?主要是定义服务器哪个目录要被同步。每个模块都要以[name]形式。这个名字就是在rsync 客户端看到的名字,其实有点象Samba服务器提供的共享名。而服务器真正同步的数据是通过path 指定的。我们可以根据自己的需要,来指定多个模块。每个模块要指定认证用户,密码文件、但排除并不是必须的。


[soft] #模块它为我们提供了一个链接的名字,在本模块中链接到了/data/soft目录;要用[name] 形式

path=/data/soft/ #指定文件目录所在位置,这是必须指定的

comment=soft share #注释可以自己定义

ignore errors #忽略IO错误

read only=yes
注:read only 是只读选择,也就是说,不让客户端上传文件到服务器上。还有一个 write only选项,自己尝试是做什么用的吧;

list=no #list 意思是把rsync 服务器上提供同步数据的目录在服务器上模块是否显示列出来。默认是yes 。如果你不想列出来,就no ;如果是no是比较安全的,至少别人不知道你的服务器上提供了哪些目录。你自己知道就行了;

exclude = gitosis/  *.sh 注:exclude是排除的意思,也就是说,要把/data/soft目录下的gitosis排除在外; gitosis/和*.sh之间有空格分开

auth users=rsync #认证用户是rsync ,是必须在服务器上存在的用户

secrets file=/etc/rsyncd.secrets #密码存在哪个文件

[soft2]
path=/data/soft2/
comment=soft2 share
ignore errors
read only=no
list=yes
--------------------

[root@CentOS5-A xinetd.d]# ps -ef|grep rsync
nobody    3962  3958 44 10:12 ?        00:00:01 rsync --daemon
root      3964  3686  0 10:12 pts/1    00:00:00 grep rsync


4、启动服务
   service xinetd restart
5、检查是否已经监听
    netstat -na | grep 873
    输出为
     [root@CentOS5-A xinetd.d]#  netstat -na | grep 873
tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN     
unix  2      [ ]         DGRAM                    8738  

二、客户端配置
1、echo rsyncpwd >>/etc/rsyncd.secrets # rsync服务器密码(注:只要密码)
2、rsync -arv rsync@172.16.34.235::soft /data/soft/ --password-file=/etc/rsyncd.secrets 测试通过,证明服务可用
3、crontab -e #增加定时同步任务即可
自动同步备份:
  1. 在tmp下建一个rsync.sh文件
  #vi /tmp/rsync.sh
  把以下内容写到里面去
  #!bin/sh
  rsync -arv rsync@172.16.34.235::soft /data/soft/ --password-file=/etc/rsyncd.secrets
  :wq
  2 第2步就要涉及到crontab了,在命令行输入
  #crontab -e
  然后把 * * * * * sh /tmp/rsync.sh //* * * * *部分代表每一分钟,然后 sh /tmp/rsync.sh 表示运行 rsync.sh脚本(在下面我再补充说明),-e 使用环境变量EDITOR或RVISUAL指定的编辑器编辑crontab文件。新创建的crontab文件会放在/var/spool/cron目录下,文件名就是用户名,用cd /var/spool/cron后 会看到用户文件,然后用 vi root(我是在root用户下的)就会看到* * * * * sh /tmp/rsync.sh已经被转到这里来了。
  这样就完成了,之后就是看看 有没有运行了,打开日志文件,日志文件在 #vi /var/log/cron 就会看到有没有运行了。

补充:
Linux 防火墙是用iptables,所以我们至少在服务器端要让你所定义的rsync 服务器端口通过,客户端上也应该让通过。
  iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT
  手动启动rsync服务:
  /usr/bin/rsync --daemon --config=/etc/rsyncd.conf
  
rsync 的相关知识:
在配置完rsync服务器后,就可以从客户端发出rsync命令来实现各种同步的操作。rsync有很多功能选项,下面就对介绍一下常用的选项:

  rsync的命令格式可以为:
  
  1. rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
  2. rsync [OPTION]... [USER@]HOST:SRC DEST
  3. rsync [OPTION]... SRC [SRC]... DEST
  4. rsync [OPTION]... [USER@]HOST::SRC [DEST]
  5. rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
  6. rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

  rsync有六种不同的工作模式:

  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。
  2. 使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。
  3. 使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。
  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。
  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
  -a 以archive模式操作、复制目录、符号连接 相当于-rlptgoD

  rsync中的参数

  -r 是递归
  -l 是链接文件,意思是拷贝链接文件;-p 表示保持文件原有权限;-t 保持文件原有时间;-g 保持文件原有用户组;-o 保持文件原有属主;-D 相当于块设备文件;
  -z 传输时压缩;
  -P 传输进度;
  -v 传输时的进度等信息,和-P有点关系,自己试试。可以看文档;
  -e ssh的参数建立起加密的连接。
  -u只进行更新,防止本地新文件被重写,注意两者机器的时钟的同时
  --progress是指显示出详细的进度情况
  --delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致
  --password-file=/password/path/file来指定密码文件,这样就可以在脚本中使用而无需交互式地输入验证密码了,这里需要注意的是这份密码文件权限属性要设得只有属主可读

一些实例
1.列出rsync 服务器上的所提供的同步内容;

  首先:我们看看rsync服务器上提供了哪些可用的数据源
[root@CentOS5-B soft]# rsync --list-only rsyn@172.16.34.235::
**********************************************
        Welcome to use rsync services!
                2010------2012
**********************************************

 

soft            soft share

注:前面是rsync所提供的数据源,也就是我们在rsyncd.conf中所写的[soft]模块。而“soft share”是由[soft]模块中的 comment = soft share 提供的;为什么没有把soft2数据源列出来呢?因为我们在[soft2]中已经把list=no了。

[root@CentOS5-B soft]# rsync --list-only rsync@172.16.34.235::soft2
**********************************************
        Welcome to use rsync services!
                2010------2012
**********************************************

 

drwxr-xr-x        4096 2012/11/07 17:45:00 .
-rw-r--r--    20439796 2012/11/07 17:44:59 postgresql-9.1.5.tar.gz
-rw-r--r--     2277926 2012/11/07 17:44:59 readline-6.2.tar.gz
-rw-r--r--    34014774 2012/11/07 17:45:00 soft.tar.gz
-rw-r--r--      397048 2012/11/07 17:45:00 uuid-1.6.2.tar.gz

后面的rsync@ip中,rsync是指定密码文件中的用户名,之后的::soft2这是soft2模块名

[root@CentOS5-B soft]# rsync --list-only rsync@172.16.34.235::soft --password-file=/etc/rsyncd.secrets
**********************************************
        Welcome to use rsync services!
                2010------2012
**********************************************

 

drwxr-xr-x        4096 2012/11/09 12:44:33 .
-rw-r--r--    11722546 2010/11/27 23:32:55 Python-2.7.1.tar.bz2
-rw-r--r--     4063446 2012/11/09 12:40:22 git-latest.tar.gz
-rw-r--r--        4683 2012/09/05 21:40:42 pg_hba.conf
-rw-r--r--    20439796 2012/09/07 11:06:41 postgresql-9.1.5.tar.gz
-rw-r--r--       19245 2012/09/06 11:19:53 postgresql.conf
-rw-r--r--     2277926 2012/09/01 14:58:04 readline-6.2.tar.gz
-rw-r--r--         208 2012/09/06 23:20:44 recovery.conf
-rw-r--r--      256862 2009/10/20 22:07:46 setuptools-0.6c11.tar.gz
-rw-r--r--      140222 2012/11/09 12:39:01 setuptools-0.6c11.tar.gz.1
-rw-r--r--    34014774 2012/09/07 00:04:32 soft.tar.gz
-rw-r--r--      397048 2008/07/05 04:53:30 uuid-1.6.2.tar.gz
drwxr-x---        4096 2012/11/09 12:31:33 Python-2.7.1
drwxrwxr-x       20480 2012/11/09 12:43:03 git-2012-09-10
drwxr-xr-x        4096 2012/11/01 17:04:38 ipvsadm-1.24
drwxrwxrwx        4096 2012/09/07 11:11:39 postgresql-9.1.5
drwxrwxr-x        4096 2012/09/07 10:24:40 readline-6.2
drwxrwxr-x        4096 2012/11/09 12:37:10 setuptools-0.6c11
drwxr-xr-x        4096 2012/09/07 11:10:27 uuid-1.6.2

2.rsync客户端同步数据;

#rsync -avzP rsync@172.16.34.235::soft /data/soft/
Password: 这里要输入rsync的密码,是服务器端rsyncd.secrets提供的。在前面的例子中我们用的是rsyncpwd,输入的密码并不回显,输好就回车。

注:这个命令的意思就是说,用rsync用户登录到服务器上,把soft数据,同步到本地当前目录soft上。当然本地的目录是可以你自己定义的。如果当你在客户端上当前操作的目录下没有soft这个目录时,系统会自动为你创建一个;当存在soft这个目录中,你要注意它的写权限。

3.通过rsync只复制目录结构,忽略掉文件呢?
#rsync -av --include '*/' --exclude '*' rsync@172.16.34.235::soft /data/soft/

4.通过ssh进行rsync,而且无须输入密码?
服务端、客户端都切换到rsync用户下,配置通过ssh-keygen 实现ssh 172.16.34.235 无需密码访问。

[rsync@CentOS5-B data]$ rsync -arv rsync@172.16.34.235:/data/soft2/* /data/soft2/
receiving file list ... done
postgresql-9.1.5.tar.gz
readline-6.2.tar.gz
soft.tar.gz
uuid-1.6.2.tar.gz

sent 108 bytes  received 57136863 bytes  16324848.86 bytes/sec
total size is 57129544  speedup is 1.00
[rsync@CentOS5-B data]$

crontab的用法:
  crontab [ -u user ] { -l | -r | -e }
  -u user 表示指定用户user的crontab文件,这个前提事你必须要有其权限才能其他用户的crontab文件。如果使用该选项的化,默认设定当前用户的crontab文件。
  -l  列出目前的crontab文件的内容
  -r 删除目前的crontab文件
  -e 使用环境变量EDITOR或RVISUAL指定的编辑器编辑crontab文件。新创建的crontab文件会放在/var/spool/cron目录下,文件名就是用户名。
  crontab内容的格式如下:
  分<>时<>日<>月<>星期<>要运行的命令
  其中<>表示空格
  分:1-59   时:0-23(0表示子夜)   日:1-31    月:1-12    星期:0-6(0表示星期天)
  crontab 文件中的每一行内容必须有上面这5个时间域,并用空格隔开。在时间域中可以用横杆“-”表示一个时间范围,如星期一到星期五:1-5,还可以使用逗号 “,”,如要在星期一和星期三执行任务,可以写成1,3表示。可以用星号“ * ”表示连续的时间段,如果对某个时间域没有特定的限制就可以在该域中写入*。 在crontab文件中注释的行在行首用“ # ”表示。下面举例说明哈。
  #每一分钟执行一次
  * * * * *  test.sh
  #每五分钟执行一次
  */5 * * * * test.sh
  #星期一和星期五的12点到18点之间每两小时整执行一次
  0 12-18/2 * * 1,5 test.sh