rsync安装与使用细节

老套的搬用一下rsync的介绍,rsync是Linux系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync。rsync支持大多数的类Unix系统,无论是Linux、Solaris还是BSD上都经过了良好的测试。它的特性如下:

1、可以镜像保存整个目录树和文件系统。
2、可以很容易做到保持原来文件的权限、时间、软硬链接等等。
3、无须特殊权限即可安装。
4、优化的流程,文件传输效率高。
5、可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。

一、安装Rsync。
如果支持yum安装,直接使用:

yum install xinetd

如果是源码安装则到官方http://rsync.samba.org/下载source包即可,安装过程大致如下:

tar zxvf *
cd *
./configure
make
make install
#如果是已安装了RPM版的Rsync,并且要安装新版的Rsync,需要先删除Rsync 
#rpm -e rsync

Redhat会有一个包依赖rsync,可以使用rpm -e rsync –nodeps卸载。另外,RPM版的rsync带了一个服务端的启动脚本,/etc/xinetd.d/rsync可以保留,但是需要注意的是必须在主服务器和同步服务器上都安装rsync,其中主服务器上是以服务器模式运行rsync,而同步上则以客户端方式运行rsync。这样在主服务器上运行rsyn守护进程,在同步上用crond定时运行客户程序来同步主服务器上需要同步的内容。

二、配置rsync服务器端

rsync服务器的配置文件为/etc/rsyncd.conf,其控制认证、访问、日志记录等等。该文件是由一个或多个模块结构组成。一个模块定义以方括弧中的模块名开始,直到下一个模块定义开始或者文件结束,模块中包含格式为name=value的参数定义。每个模块其实就对应需要备份的一个目录树,比方说在我们的实例环境中,有三个目录树需要备份:/www/和/mirror/file0/和/mirror/file1/目录,那么就需要在配置文件中定义三个模块,分别对应三个目录树。配置文件是行为单位的,也就是每个新行都表示一个新的注释、模块定义或者参数赋值。

# default: off
# description: The rsync server is a good addition to an ftp server, as it \
#       allows crc checksumming etc.
service rsync
{
        disable = no
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon
        log_on_failure  += USERID
}

将disable 改为no,另外将配置成随系统启动:

chkconfig rsync on

重新启动:

service xinetd restart  
#重新加载配置
/etc/rc.d/init.d/xinetd reload  

查看进程是否在监听:

netstat -a | grep rsync
#或者
lsof -i :873

配置rsync账户相关:

#配置rsync密码文件,(名字随便写,只要和配置文件里的一致即可),格式(一行一个用户) :
vim /home/rsync.ps
hkshadow:hkshadow
#配置rsync密码文件权限 
chown root.root rsync.ps
#注意:该文件只能是root用户可读写的,注意,出于安全目的,这个文件的属性必需是只有属主可读,否则rsync将拒绝运行。 
chmod 600 rsync.ps

创建配置文件:

uid = nobody # 备份以什么身份进行,用户
ID gid = nobody # 备份以什么身份进行,组ID ,注意这个用户ID和组ID,如果要方便的话,可以设置成root,这样rsync几乎就可以读取任何文件和目录了,但是也带来安全隐患。建议设置成只能读取你要备份的目录和文件即可。 
use chroot = no  max connections = 0  #最大连接数,0代表没有限制  
#port = 873          #默认端口873  
pid file = /var/log/rsync/rsyncd.pid   #运行进程的ID写到哪里 
#lock file = /var/log/rsync/rsync.lock

log file = /var/log/rsync/rsyncd.log  #日志记录文件 
motd file = /var/log/rsync/rsyncd.motd  #欢迎消息 
strict modes =yes         #是否检查口令文件的权限 

[txt]           # 指定认证的备份模块名  
path = /www/htdocs/pub/test/   # 需要备份的目录 
comment = BACKUP attachment           # 注释  
ignore errors              # 忽略一些无关的IO错误  
read only = false          # 设置为非只读,即可以传至服务器的相应目录。 
list = false                # 不允许列文件  
exclude = test/ test.php      #设置不同步的目录或文件用空格隔开 
hosts allow = 210.51.0.80     #允许连接服务器的主机IP地址,如果多个ip则用空格隔开 
hosts deny = 0.0.0.0/0.0.0.0         #禁止连接服务器的主机IP地址,也可为*,表示所有。 
auth users = msyn                     # 认证的用户名,如果没有这行,则表明是匿名 
secrets file = /home/rsync.ps      # 认证文件名,用来存放密码

三、配置客户端(省略)
配置密码文件 (注:为了安全,设定密码档案的属性为:600。rsync.scrt的密码一定要和Rsync Server 密码设定案里的密码一样)

下一步是一个运行rsync的例子:

rsync -vzrltogp --progress --delete user@x.x.x.168::attachment  /usr/local/apache/htdocs/pub/html/ --password-file=/home/rsync.ps

上面这个命令行中-vzrtopg代表的意思是:
-v表示verbose(详细)
-z表示zip(压缩)
-r表示recursive(递归目录)
-topg是保持文件原有属性如o=owner(属主)、t=times(时间)、p=perms(权限)、g=group(组)的参数 -H表示保持硬连接
-l:保留软链结 -u:表示只更新源文件比目标时间新的文件
–progress是指显示出详细的进度情况
–delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致。 user@x.x.x.168::attachment 是表示对服务器x.x.x.168中的attachment模块进行备份,登录帐号是user
–password-file = /etc/rsync.scrt来指定密码文件,这里需要注意的是这份密码文件权限属性要设得只 有属主可读(权限为600),属主为正在运行此命令的用户。
-a:(-a, –archive equivalent to -rlptgoD)以archive模式操作,复制目录、符号连接在这里面

==========================================================================
另外,可以创建一个脚本运行这个命令,并记录日志:

# cat /usr/local/bin/rsync.sh  
#!/bin/bash    
DATE=`date +%w`  
rsync -avzH --progress --delete inburst@192.168.168.52::inburst /home/quack/backup/$DATE --password-file=/etc/rsync.pass > /var/log/rsync.$DATE   

修改/etc/crontab做好定时更新(配置文件 /etc/crontab)

crontab -e  15 4 * * 6 root rsync.sh  
crontab -l    
//查看所有自定义任务 
/etc/init.d/crond restart    //重启动任务计划 

#crontab Crontab文件的格式: 
#第1列分钟1~59  
#第2列小时1~23(0表示子夜) 
#第3列日1~31  
#第4列月1~12  
#第5列星期0~6(0表示星期天)

扩展阅读:
关于 rsync 中: 和 :: 及 rysnc 和 ssh 认证协议的区别

(1)双冒号 “::”的用法:
rsync 传输文件前需要登录认证,那么这个过程用到的协议有两种:ssh 和 rsync
何时用ssh 协议呢?
我们平时用的 rsync -av /SRC root@192.168.99.36:/DEST 就是默认用的 ssh 协议
这种方式默认是省略了 -e ssh 的,与下面等价:

rsync -av /SRC -e ssh root@192.168.99.36:/DEST

当遇到要修改端口的时候,我们可以:

rsync -av /SRC -e "ssh -p36000" root@192.168.99.36:/DEST

何时用rysnc协议呢?

rsync -av /SRC rsync://root@192.168.99.36:36000/modual/DestPath

注意:这条语句显示的指明了使用rsync认证协议,port后的modual是rsync服务端配置文件rsyncd.conf
里面配置的模块名,模块里面会包含一些用户名、密码、路径等认证信息。
使用rsync认证,还有一种写法:

1
rsync -av /SRC –port=36000 root@172.17.256.211::modual/DestPath
注意:这种写法不需显示指定 rsync 协议,而是根据 :: 来识别的,端口自己用 –port 指定。
而且这里 modual 前面没有 / 的。

总结: 双冒号:: 是用在 rsync 协议里面的,: 一般用在ssh协议里面,这两种用法各有千秋:
rsync协议你需要在rsync服务端配置模块,这增加了运维工作量,但是安全,因为不需要对客户公开帐号密码。
ssh协议方便,不需配置,拿到帐号密码即可开工,但是对客户是暴露的,有安全风险。
还需要注意的是用rsync协议认证的时候,后面跟的是模块名,而不是路径,这点要注意。

(2)关于 rsync –port 的man文档如下:
rsync 客户端 –port
–port=PORT
This specifies an alternate TCP port number to use rather than
the default of 873. This is only needed if you are using the
double-colon (::) syntax to connect with an rsync daemon (since
the URL syntax has a way to specify the port as a part of the
URL).
rsync 服务端 –port
–port=PORT
This specifies an alternate TCP port number for the daemon to
listen on rather than the default of 873. See also the “port”
global option in the rsyncd.conf manpage.

(3)附一些参考文档:
rsync实例用法及参数详解
http://hi.baidu.com/leejun_2005/item/672c31d4c12a8b1b20e25041

rsync命令用法入门
http://hi.baidu.com/leejun_2005/item/a04d17c4cf24547088ad9e7c

rsync 的核心算法
http://hi.baidu.com/leejun_2005/item/11651fc379229f52bdef69b7