本文出自 “虚心求教” 博客,请务必保留此出处http://nanwangting.blog.51cto.com/608135/969968

Rsync是用来替代rcp的一个工具,他目前由rsync.samba.org维护,所以其配置文件和samba的配置文件很像。Rsync使用所谓的rsync算法,提供一个快速的文件传输方法是本地和远程主机的文件达到同步,由于他主要是传送2个文件的改动部分,而非每次都整份传送,因此速度相当快。
1.1 Rsync有那些特点:
可以镜像保存整个目录树和文件系统。
可以很容易做到保持原来文件的权限、时间、软硬链接等等。
可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。
支持匿名传输,以方便进行网站镜象。
二:rsync的工作原理
 
1 首先备份主机会开启一个端口873,等待client来连接,连接的时候会检查密码是否复合,如果复合则开始传输文件。
2 第一次连接时会把整个文件传输过去,下次传输之传输改动的数据。
在实际工作中我们可以设置多个备份主机。备份过后,然后我们就可以进行tar,cpio等命令进行文件的归档了。

 

 

1 首先备份主机会开启一个端口873,等待client来连接,连接的时候会检查密码是否复合,如果复合则开始传输文件。
2 第一次连接时会把整个文件传输过去,下次传输之传输改动的数据。
在实际工作中我们可以设置多个备份主机。备份过后,然后我们就可以进行tar,cpio等命令进行文件的归档了。
 
rsync的安装
[root@BackServer mnt]# tar zvxf rsync-3.0.9.tar.gz
[root@BackServer mnt]# cd rsync-3.0.9
[root@BackServerrsync-3.0.9]#./configure--prefix=/usr/local/rsync
[root@BackServer rsync-3.0.9]# make && make install
 
3.1 配置文件组成
rsync的主要有以下三个配置文件
rsyncd.conf(主配置文件)
rsyncd.secrets(密码文件)
rsyncd.motd(rysnc服务器信息)
服务器配置文件(/etc/rsyncd.conf),该文件默认不存在,请创建它。
rsyncd.secrets(密码文件)格式很简单,默认文件也不存在,内容如下,用户名:密码
root:123com
主要:需要给rsyncd.secrets 600权限,否则会报错。
 
配置文件说明
分区全局配置,和目录模块。
//全局文件
pid file=/var/run/rsyncd.pid //指定rsync的pid存放路径
port=873 //指定rsync的端口,默认为873
address=192.168.18.128 //指定rsync服务器地址
uid=root //运行rsync的用户
gid=root //运行rsync的用户组
use chroot=yes
read only=no
hosts allow=192.168.18.0/255.255.255.0 //准许访问的地址,多个地址的话空格隔开
hosts deny=*
max connections=5 //准许的最大连接数
motd file=/etc/rsyncd.motd
log file=/var/log/rsync.log //日志存放目录
log format=%t %a %m %f %b //日志格式
syslog facility = local3
timeout = 300 //超过时间
 
//目录模块1
[client 1]
path=/home/client1 //备份文件存放目录
list=yes //准许列表显示
#ignore errors //忽略传输错误
auth users=root
secrets file=/etc/rsyncd.secrets //密码文件存放目录
comment=this is client1 used //描述
#exclude = easylife/ samba/
//忽略备份的目录
//目录模块2
[client 2]
path=/home/client1 //备份文件存放目录
list=yes //准许列表显示
#ignore errors //忽略传输错误
auth users=root
secrets file=/etc/rsyncd.secrets //密码文件存放目录
comment=this is client2 used //描述
#exclude = easylife/ samba/ //忽略备份的目录
 
 
 
服务器端传输文件时,要发哪个用户和用户组来执行,默认是nobody。 如果用nobody 用户和用户组,可能遇到权限问题,有些文件从服务器上拉不下来。所以我就偷懒,为了方便,用了root 。不过您可以在定义要同步的目录时定义的模块中指定用户来解决权限的问题。use chroot = yes
3.2注意事项
* 用chroot,在传输文件之前,服务器守护程序在将chroot 到文件系统中的目录中,这样做的好处是可能保护系统被安装漏洞侵袭的可能。缺点是需要超级用户权限。另外对符号链接文件,将会排除在外。也就是说,你在 rsync服务器上,如果有符号链接,你在备份服务器上运行客户端的同步数据时,只会把符号链接名同步下来,并不会同步符号链接的内容;这个需要自己来尝试 read only = yes
* read only 是只读选择,也就是说,不让客户端上传文件到服务器上。还有一个 write only选项,自己尝试是做什么用的吧;
#limit access to private LANs
  hosts allow=192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0
* 在您可以指定单个IP,也可以指定整个网段,能提高安全性。格式是ip 与ip 之间、ip和网段之间、网段和网段之间要用空格隔开;
* motd file 是定义服务器信息的,要自己写 rsyncd.motd 文件内容。当用户登录时会看到这个信息。比如我写的是:
 ++++++++++++++++++++++++++++++++++++++++++++++
  Welcome to use the mike.org.cn rsync services!
2002------2009
  ++++++++++++++++++++++++++++++++++++++++++++++
  
 3.3模块说明:
模块定义什么呢?主要是定义服务器哪个目录要被同步。每个模块都要以[name]形式。这个名字就是在rsync 客户端看到的名字,其实有点象Samba服务器提供的共享名。而服务器真正同步的数据是通过path 指定的。我们可以根据自己的需要,来指定多个模块。每个模块要指定认证用户,密码文件、但排除并不是必须的

 

4.1 启动方式
2中方式,daemon方式和xinetd方式
A--daemon参数方式,是让rsync以服务器模式运行
  #/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf  #--config用于指定rsyncd.conf的位置,如果在/etc下可以不写
B xinet方式
1 修改 vim /etc/services 加入下面内容
rsync  873/tcp  # rsync
  rsync  873/udp  # rsync
 
2 设定 /etc/xinetd.d/rsync, 简单例子如下:
  # default: off
  # description: The rsync server is a good addition to am 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
  }
  上述, 主要是要打开rsync這個daemon, 一旦有rsync client要连接時, xinetd会把它转介給 rsyncd(port 873)。然后service xinetd restart, 使上述设定生效.
4.2检测是否运行
1daemon模式下
方法1
[root@BackServer bin]# ./rsync --daemon
[root@BackServer bin]# netstat -ntlp | grep rsync
tcp 0 0 192.168.18.128:873 0.0.0.0:* LISTEN 6627/./rsync
方法2
[root@BackServer bin]# lsof -i:873
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsync 6627 root 4u IPv4 23126 0t0 TCP 192.168.18.128:rsync (LISTEN)
 
2 Xinetd模式下
方法1
[root@BackServer client]# netstat -ntlp | grep 873
tcp 0 0 :::873 :::* LISTEN 6567/xinetd
方法2
[root@BackServer client]# lsof -i:873
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xinetd 6567 root 5u IPv6 22527 0t0 TCP *:rsync (LISTEN)
服务启动: service xinetd start
服务停止: service xiniet stop
注意:如果没有lsof和xinetd服务,通过yum安装即可。Yum –y install lsof xinetd
加入开机启动
[root@BackServer bin]# echo "/usr/bin/rsync --daemon" >> /etc/rc.local
防火墙配置
rsync服务器和防火墙
  Linux 防火墙是用iptables,所以我们至少在服务器端要让你所定义的rsync 服务器端口通过,客户端上也应该让通过。
#iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT
  #iptables -L 查看一下防火墙是不是打开了 873端口
 
文件同步
6.1 语法 rsync +参数@主机名::目录模块名,备份路径。
 
-r 是递归
  -l 是链接文件,意思是拷贝链接文件;-p 表示保持文件原有权限;-t 保持文件原有时间;-g 保持文件原有用户组;-o 保持文件原有属主;-D 相当于块设备文件;
  -z 传输时压缩;
  -P 传输进度;
  -v 传输时的进度等信息,和-P有点关系,自己试试。可以看文档;
  -e ssh的参数建立起加密的连接。
  -u只进行更新,防止本地新文件被重写,注意两者机器的时钟的同时
  --progress是指显示出详细的进度情况
  --delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致
  --password-file=/password/path/file来指定密码文件,这样就可以在脚本中使用而无需交互式地输入验证密码了,这里需要注意的是这份密码文件权限属性要设得只有属主可读。
6.2举例说明
 
1列出服务器上有那些目录资源
这里为配置文件中的[]中定义的名称。
[root@client bin]# ./rsync --list-only root@192.168.18.128::
++++++++++++++++++++++++++++++++++++++++++++++
  Welcome to use the mike.org.cn rsync services!
2002------2009
++++++++++++++++++++++++++++++++++++++++++++++
client1 this is centos 5 date
client2 this is centos 5 date
我这里定义了2个目录,一个资源为clien1供服务器client1使用,其对应的目录为/home/client1
一个资源为clien2供服务器client2使用,其对应的目录为/home/client2
如果想继续查看资源下有什么文件,可以使用命令
++++++++++++++++++++++++++++++++++++++++++++++
  Welcome to use the mike.org.cn rsync services!
2002------2009
++++++++++++++++++++++++++++++++++++++++++++++
 
 
Password:
drwxr-xr-x 4096 2012/08/21 00:51:02 .
-rw-r--r-- 0 2012/08/21 00:50:51 test
drwxrwxrwx 4096 2012/08/20 22:03:23 mnt
drwxr-xr-x 4096 2012/08/21 00:51:02 www
 
当我们输入完密码后这会显示目录模块下所有的文件
2把客户端/var/www上的目录同步到服务器上。
 
root@client bin]# ./rsync -avHS /var/www/ root@192.168.18.128::client1
当我们输入上面的命令后,这会把本机的/var/www目录同步到128服务器的client目录模块上,其对应的目录为/home/client1,执行完命令同步后我们可以通过—list-only参数查看更新的数据受否更新。
[root@client bin]# ./rsync --list-only root@192.168.18.128::client1
++++++++++++++++++++++++++++++++++++++++++++++
  Welcome to use the mike.org.cn rsync services!
2002------2009
++++++++++++++++++++++++++++++++++++++++++++++
 
 
Password:
drwxr-xr-x 4096 2012/08/21 01:26:18 .
-rw-r--r-- 0 2012/08/21 00:50:51 test
drwxr-xr-x 4096 2012/08/21 01:26:18 aa
drwxr-xr-x 4096 2012/02/22 23:58:08 cgi-bin
drwxr-xr-x 4096 2012/08/03 10:36:29 error
drwxr-xr-x 4096 2012/02/22 23:58:07 html
drwxr-xr-x 4096 2012/08/03 10:39:14 icons
drwxrwxrwx 4096 2012/08/20 22:03:23 mnt
drwxr-xr-x 4096 2012/08/21 00:51:02 www
 
如果我们不想交互式的输入密码可以加上—password-file参数指定密码文件如。./rsync -avHS /var/www/ --password—file=/etc/rsyncd.secrets root@192.168.18.128::client1
 
服务器是重量级应用,所以数据的网络备份还是极为重要的。我们可以在生产型服务器上配置好rsync 服务器。我们可以把一台装有rysnc机器当做是备份服务器。让这台备份服务器,每天在早上4点开始同步服务器上的数据;并且每个备份都是完整备份。有时硬盘坏掉,或者服务器数据被删除,完整备份还是相当重要的。这种备份相当于每天为服务器的数据做一个镜像,当生产型服务器发生事故时,我们可以轻松恢复数据,能把数据损失降到最低;是不是这么回事?
1首先我们建立密码文件并赋予相关权限。
echo "123com" >> /etc/rsyncd.secrets
chmod 600 /etc/rsyncd.secrets
2编写脚本文件,编写完成后赋予可执行权限。
#!/bin/bash
rsync="/usr/bin/rsync"
para="-avHS --numeric-ids"
pwdfile="--password-file=/etc/rsyncd.secrets"
user="root"
host="192.168.18.128"
dirmod="client1"
 
$rsync $para $pwdfile /var/www $user@$host::$dirmod
$rsync $para $pwdfile /home $user@$host::$dirmod
 
脚本内容本身并不难理解,这里不再多解释。
7.1 添加计划任务。
有时候我们的脚本可能不只是一个,有可能多个这个时候可以建立一个脚本文件夹,把相同计划任务的脚本房子一起。
比如我们这里简历一个文件夹名为
mkdir /usr/cron/cron.daily.rsync
cd /usr/con/cron.daily.rsync
然后把相关rsync脚本放在cron.dialy.rsync目录下
crontab -e
加入下面的内容:
# Run daily cron jobs at 4:10 every day backup rhel4 data:
 10 4 * * * /usr/bin/run-parts /usr/cron/cron.daily.rsync 1> /dev/nul
l注:
第一行是注释,是说明内容,这样能自己记住。
第二行表示在每天早上4点10分的时候,运行 /etc/cron.daily.rsync 下的可执行脚本任务
配置好后,要重启crond 服务器;
  # killall crond 注:杀死crond 服务器的进程;
  # ps aux |grep crond 注:查看一下是否被杀死;
  # /usr/sbin/crond 注:启动 crond 服务器;
  # ps aux |grep crond 注:查看一下是否启动了?
  root 3815 0.0 0.0 1860 664 ? S 14:44 0:00 /usr/sbin/crond
  root 3819 0.0 0.0 2188 808 pts/1 S+ 14:45 0:00 grep crond
 
我们现在创建一个脚本来自动完成备份服务器配置文件和备份客户端脚本的创建,以提高我们的工作效率。
#!/bin/bash
###############################################################################
##声明变量区,声明脚本的相关服务器地址,安装目录,配置文件目录,命令参数等信息
###############################################################################
servername=`hostname`
server_add='192.168.18.129'
rsync="/usr/bin/rsync"
user="root"
pwd="123com"
backdir="/var/www /mnt"
modir="client"
para="-avHs --numeric-ids"
server_conf="$servername/etc/rsyncd.conf"
pwd_file="$servername/etc/rsyncd.secrets"
bk_save="/home/$modir"
 
client_script="$servername/client/client.sh"
client_pwd="$servername/client/rsyncd.secrets"
cronfile="$servername/client/cron/daily.con.sh"
install="$servername/install.sh"
 
install_client=/usr/local/rsynclient
 
##############################################################################
######################创建目录函数,创建配置文件的存放目录####################
mk_dir(){
 
if [ -d $servername ];then
echo "$servername.目录已经存在,请移除目录,或删除目录?
else
mkdir -p "$servername/etc"
mkdir -p "$servernname/client"
mkdir -p "$servername/client/cron"
fi
 
}
# ##############################################################################
########定义3个函数,客户端密码函数,客户端脚本函数,以及任务计划函数#########
client_pwd(){
cat <<eof >$client_pwd
$pwd
eof
chmod 600 $client_pwd
}
 
client_run_script(){
 
cat <<eof >$client_script
#!/bin/bash
eof
 
 
for dir in $backdir
do
cat <<eof >>$client_script
$rsync $para $dir --password-file=$install_client/rsyncd.secrets $user@$server_add::$modir
eof
done
 
chmod u+x $client_script
}
 
crontab(){
cat <<eof >$cronfile
 
0 1 * * * $ client_script
Eof
}
 
##############服务器配置文件函数,密码函数##########安装函数###################
rsync_conf(){
 
cat <<eof >$server_conf
log file=/var/log/rsyncd.log
[$modir]
 
path=$bk_save
auth user="$user"
uid=root
gid=root
secrets file=/etc/rsyncd.secrets
read only=no
eof
}
 
 
rsync_pwd(){
cat <<eof >$pwd_file
$user:$pwd
eof
chmod 600 $pwd_file
}
 
mk_install(){
cat <<eof >$install
#!/bin/bash
 
install_to_server(){
cp -pf ../$server_conf /etc
cp -pf ../$pwd_file /etc
if [ ! -d $bk_save ];then
mkdir -p $bk_save
fi
 
}
 
 
install_to_client(){
 
if [ ! -d $install_client ];then
mkdir -p $install_client
fi
cp -pf ../$client_script $install_client
cp -pf ../$client_pwd $install_client
cp -pf ../$cronfile $install_client
echo " 0 1 * * * $install_client/client.sh" > $install_client/daily.con.sh
 
chmod u+x $install_client/daily.con.sh
chmod 600 $install_client/rsyncd.secrets
}
 
 
usage(){
 
echo "后加参数"
exit 1
 
}
 
 
case \$1 in
server)
install_to_server
;;
client)
install_to_client
;;
*)
usage
;;
esac
eof
 
chmod u+x $install
 
}
 
tar_it(){
 
tar zcvf $servername.tgz $servername
 
rm -rf $servername
 
}
 
###############主程序区#################################################
mk_dir
client_pwd
crontab
client_run_script
rsync_conf
rsync_pwd
mk_install
tar_it
 
 
脚本的用法:当我们赋予脚本执行权限后,然后会生成一个主机名为名,tgz后缀结尾的压缩文件,通过tar –zvxf命令解压后会有3个文件,其中2个为目录,一个问安装脚本。
如下图:
[root@BackServer BackServer]# ls
client etc install.sh
[root@BackServer BackServer]#
其中etc下主要存放为备份服务器的配置文件和密码文件,脚本中指定的服务器地址,和密码。Client目录下存放着为客户端的备份脚本和客户端的密码文件,以及任务计划文件。Install.sh为安装文件,用法很简单。如果是服务器端使用则为install sever 客户端使用的话为install后跟 client,是不是很简单。当服务器端执行脚本后,其实等于是把etc下的配置文件和密码文件copy到/etc下的一个过程。执行完脚本化我们进入/usr/bin目录下执行./rsync –daemon使其运行。
然后报名吧脚本文件copy到client端,加压,进入目录后,执行install.sh client命令,这时会在/usr/local/rsynclient目录下生成client.sh daily.con.sh rsyncd.secrets文件。当我们手动自信client.sh后,则会按照脚本中指定的目录进行备份。daily.con.sh文件为计划任务文件,默认是凌晨1点运行,大家可以自己修改。修改过后加入计划任务中即可。