rsync详细讲解
RSYNC
rsync ---->全量和增量,本地或远程
http://www.samba.org/ftp/rsync/rsync.html
rsync可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似于scp命令,但优于scp命令的功能;当然,rsync还可以在本地主机的不同分区或目录之间全量及增量的复制数据,这类似于cp命令,同样也优于cp命令。
提示:rsync还可以实现类似rm的删除功能!
在同步备份数据时,默认情况下,rsync通过其独特的“quick check”算法,它仅同步大小或者最后修改时间发生变化的文件或目录,当然也可根据权限、属主等属性的变化同步,但需要指定相应的参数,甚至可以实现只同步一个文件里有变化的内容部分,所以可以实现快速的同步备份数据。。
rsync的特性如下:
支持拷贝特殊文件如链接、设备等。
可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。
可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变。
可实现增量同步,既只同步发生变化的数据,因此数据传输效率很高。
可以使用rcp,rsh,ssh等方式来配合传输文件。
可以通过socket(进程方式)传输文件和数据。
支持匿名的或认证(无需系统用户)的进程模式传输,可实现方便安全的进行数据备份及镜像。
rsync的工作方式:
1.主机本地间的数据传输(此时类似于cp命令的功能)
2.借助rcp,ssh等通道来传输数据(此时类似于scp命令的功能)
3.以守护进程(socket)的方式传输数据(这个是rsync的重要功能)
一、本地数据传输模式(local-only mode)
语法: rsync [OPTION..] SRC... [DEST]
语法说明:1、rsync为同步的命令
2、[OPTION...]为同步时的参数选项;
3、SRC为源,即待拷的分区、文件或目录等;
4、[DEST]为目的分区、文件或目录等;
实例1.把系统的hosts文件同步到/opt目录
rsync /etc/hosts /opt<---------cp /etc/hosts /opt
实例2. 把opt目录拷贝到/mnt下
rsync -avz /opt /mnt<---------cp -ap /opt /mnt
二、通过远程shell进行数据传输(remote shell mode)
通过远程shell(rcp,ssh等)传输可以分为两种情况,其语法分别为
拉取pull:rsync [OPTION...] [USER@]HOST:SRC... [DEST]
推送push:rsync [OPTION...] SRC... [USER@]HOST:DEST
语法说明:
1.rsync为同步的命令;
2.[OPTION...]为同步的参数选项
3.[USER@]HOST...为rsync同步的远程的连接用户和主机地址
4.SRC为源,即待拷的分区、文件或目录等,和HOST之间用一个冒号连接
5.[DEST]为目的分区、文件或目录等。
拉取实例:
rsync -vzrtopgP -e 'ssh -p 22' user1@192.168.1.147:/opt /mnt
推送实例:
rsync -vzrtopP -e 'ssh -p 22' /etc user1@192.168.1.147:/tmp
关键语法说明:
1.-vzrtopg相当于上文的-avz,表示同步文件和目录属性不变。
2.--progress显示同步的过程,可以用-P替换
3.-e 'ssh -p 22' ,表示通过ssh的通道传输数据,-p 22可省略。
4.user1@192.168.1.147:/opt远程的主机系统用户,地址,路径。
5./tmp本地的路径
三、使用守护进程的方式数据传输(daemon mode)
通过守护进程方式传输同样分为两种情况,每种情况又有两种语法写法,分别为:
拉取:(1) rsync [OPTION...] [USER@]HOST::SRC... [DEST]
(2) rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
推送: (1) rsync [OPTION...] SRC... [USER@]HOST::DEST
(2) rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
特别值得注意的是,与远程shell方式的命令不同的是,第(1)种语法格式,本节命令
[USER@]HOST::SRC和[USER@]HOST::DEST结尾处,均为双冒号连接SRC或DEST,另外,这个SRC或DEST也不再是路径了,而是守护进程中配置的模块名称。下文会以例子详细说明。
第2种方法实例(rsync://):
拉取实例命令:rsync -vzrtopgP rsync://rsync_backup@10.0.0.141:/peng /test --password-file=/etc/rsync.password
推送实例命令:rsync -vzrtopgP /test/ rsync://rsync_backup@10.0.0.141:/peng --password-file=/etc/rsync.password
特别说明:以上的用法是个不错的方法,它在拉取和推送时的写法极其类似,尤其是后面讲守护进程服务时,第一种方法通过双冒号加模块名的方法不利于记忆,所以对于初学者,建议大家也可以记忆此语法格式。
以守护进程(socket)的方式传输数据(重点)
部署环境:
操作系统:
[root@server ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.4 (Santiago)
内核版本:
[root@server ~]# uname –r
2.6.32-358.el6.x86_64
[root@server ~]# uname -m
x86_64
[root@www ~]# lsb_release –a ------》可以查看系统版本信息
LSB Version: :core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor ID: RedHatEnterpriseA-server
Description: Red Hat Enterprise Linux A-server release 6.2 (Santiago)
Release: 6.2
Codename: Santiago
主机网络参数配置:
主机名 |
网卡eth0 |
默认网关 |
用途 |
A-server |
192.168.1.145 |
192.168.1.254 |
rsync服务端 |
B-server |
192.168.1.147 |
192.168.1.254 |
rsync节点 |
C-server |
192.168.1.150 |
192.168.1.254 |
rsync节点 |
提示: 如无特殊要求,子网掩码都是255.255.255.0
具体要求: 要求在A-server上以rsync守护进程的方式部署rsync服务,使得所有rsync节点客户端主机,可以把本地数据通过rsync的方式备份到数据备份服务器A-server上。本例的客户端仅以B-server、C-server为例。
备份拓扑:
开始部署rsync服务—Rsync服务器端操作过程 :
1) 配置rsyncd.conf
首先确认软件是否安装:
[root@server ~]# rpm -qa rsync
rsync-3.0.6-9.el6.x86_64
2) 开始编辑 /etc/rsyncd.conf
[root@server ~]# cat /etc/rsyncd.conf
#rsync_config____________start
#created by peng 13:05 2014-12--9
##rsyncd.conf start##
uid = rsync
gid = rsync
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[peng]
path = /peng/
ignore errors
read only = false
list = false
hosts allow = 192.168.1.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#rsync_config__________end
[root@A-server ~]# dos2unix /etc/rsyncd.conf ---------》windows下的文件粘贴到linux下,尽可能的执行dos2unix查看下!
dos2unix: converting file /etc/rsyncd.conf to UNIX format ...
3) 配置文件常用参数选项说明:
Rsyncd.conf参数 |
参数说明 |
uid = rsync |
rsync使用的用户,缺省uid为-2,通常为nobody. |
gid = rsync |
rsync使用的组(用户所在的组),缺省gid为-2,通常为nobody. |
use chroot = no |
如果为true, daemon会在给客户端传输文件前“chroot to the path” ,这是rsync 安全的一个配置,因为我们大多数都是在内网使用rsync,所以不配也可以。 |
max connections = 200 |
设置最大连接数,默认为0,意为无限制,负值为关闭这个模块。 |
timeout = 300 |
默认为0,意为no timeout ,建议为300-600(5分钟-10分钟) |
pid file = /var/run/rsyncd.pid |
rsync daemon服务启动后将进程号写入此文件中,如果这个文件已经存在,rsync进程不会覆盖该文件,而是会终止。 |
lock file = /var/run/rsyncd.lock |
指定lock文件用来支持“max connections” 参数,使得总连接数不会超过限制,默认为 /var/run/rsyncd.lock。 |
log file = /var/log/rsyncd.log |
不设置或者设置错误,rsync会使用syslog输出相关日志信息 |
ignore errors |
忽略i/o错误 |
read only = false |
指定客户端是否可以上传文件,默认对所有模块都为true. |
list = false |
是否允许客户端可以查看可用模块列表,默认为可以。 |
hosts allow = 192.168.1.0/24 |
指定可以联系的客户端主机名或ip地址或地址段,默认情况没有此参数,即都可以连接。 |
hosts deny = 0.0.0.0/32 |
指定不可以联系的客户端主机名或ip地址或地址段,默认情况没有此参数,即都可以连接。 |
auth users = rsync_backup |
指定以空格或逗号分隔的用户可以使用哪些模块,用户不需要在本地系统中存在,默认所有用户无密码的访问 |
secrets file = /etc/rsync.password |
指定用户名和密码存放的文件,格式为用户名:密码,密码不超过8位。 |
[peng] |
这里是模块名称,需要用中括号括起来,起名称没有特殊的要求,但最好是有意义的名称,便于以后维护。 |
path = /peng/ |
在这个模块中,daemon使用的文件系统或目录,目录的权限要注意和配置文件中的权限一致,否则会遇到读写的问题。 |
#exclude = a c b/2 |
排错的文件或目录,相当路径。 |
man rsyncd.conf查看配置参数细节:
特别说明:
1) 模块中的参数项可以拿到全局配置中使用
2) 以上配置文件中的参数,为经常使用的参数。
3) 以上配置文件中没有提到的参数请参考man rsyncd.conf查看
4) 如果配置中的path = /peng/提到的路径不存在则需要创建,命令为:
mkdir /peng -p
useradd rsync -s /sbin/nologin -M
chown -R rsync.rsync /peng/ -----》授权权限可以根据配置文件中的属主来 !
配置用于rsync同步的账号,密码及账号文件权限
操作过程:
[root@A-server ~]# echo "rsync_backup:redhat">>/etc/rsync.password
注意:其中rsync_backup:redhat 中的rsync_backup为同步传输用到的虚拟账号,这个账号仅为rsync的账号,不需要系统账号。后面的redhat为密码,不超过8位。账号和密码中间用冒号分隔。
[root@A-server ~]# cat /etc/rsync.password
rsync_backup:redhat
[root@A-server ~]# chmod 600 /etc/rsync.password ------》必须为600权限。
启动rsync服务
以守护进程方式来启动rsync服务:
rsync --daemon ----》--daemon表示以守护进程的方式启动rsync服务。
拓展:
--address --》绑定指定ip地址提供服务
--config=FILE ---》更改配置文件路径,而不是默认的/etc/rsyncd.conf
--port=PORT --》更改其他端口提供服务,而不是缺省的873端口
提示:以上几个选项为了解内容,生产场景使用的不多。
[root@server ~]# rsync --daemon
[root@server ~]# netstat -tunlp |grep 873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 10983/rsync
tcp 0 0 :::873 :::* LISTEN 10983/rsync
[root@server ~]# ps -ef |grep rsync |grep -v grep
root 10983 1 0 03:47 ? 00:00:00 rsync –daemon
设置服务开机自启动:
echo “/usr/bin/rsync –daemon” >> /etc/rc.local
注意:当然还可以用chkconfig rsync on 命令,但是必须要编写适合chkconfig操作的脚本才行。
(脚本:
#!/bin/bash
#rsync Start/Stop Rsync service
#chkconfig: 35 13 91
#description:This is Rsync service management shell script
#processname:rsyncd
#Source function library
. /etc/rc.d/init.d/functions
start() {
rsync --daemon
if [ $? -eq 0 -a `ps -ef |grep -v grep |grep rsync|wc -l` -gt 0 ];then
action "Starting Rsync:" /bin/true
sleep 1
else
action "Starting Rsync:" /bin/false
sleep 1
fi
}
stop() {
pkill rsync;sleep 1;pkill rsync
#if [ $? -eq 0 -a `ps -ef|grep -v grep|grep rsync |wc -l` -lt 1 ];then
if [ `ps -ef|grep -v grep|grep "rsync --daemon"|wc -l` -lt 1 ];then
action "Stopping Rsync:`ps -ef|grep -v grep|grep rsync|wc -l`" /bin/true
sleep 1
else
action "Stopping Rsync:`ps -ef|grep -v grep|grep "rsync --daemon"|wc -l`" /bin/false
sleep 1
fi
}
case "$1" in
start)
start;
;;
stop)
stop;
;;
restart|reload)
$0 stop;
$0 start;
;;
*)
echo $"Usage: $0 {start|stop|restart|reload}"
;;
esac
)
保存成rsyncd,放到/etc/init.d/rsyncd
chmod 700 /etc/init.d/rsyncd
chkconfig rsyncd on
chkconfig –list |grep rsyncd
/etc/init.d/rsyncd start
netstat -tunlp |grep 873
开始部署rsync客户端:
在192.168.1.147和192.168.1.150上操作
请注意与服务端的配置区别
echo "redhat" > /etc/rsync.password ------》这里仅配置了密码,不需要账号了。这是与服务端的区别。
chmod 600 /etc/rsync.password ------》必须为600权限
检查部署的rsync服务:
默认情况下,以下均在rsync客户端执行操作:
在192.168.1.147客户端上操作:
[root@www www]# pwd
/var/www
[root@www www]# tar -zcvf html_$(date +%F)_tar.gz ./html/ ---》压缩份文件
./html/
./html/index.html
[root@www www]# ll
drwxr-xr-x. 2 root root 4096 Dec 10 14:57 html
-rw-r--r--. 1 root root 173 Dec 10 14:58 html_2014-12-10_tar.gz
开始推送到192.168.1.145服务器上:
[root@B-server www]# rsync -avzP html_2014-12-10_tar.gz rsync_backup@192.168.1.145::peng----------->服务器端模块的名字
Password: -----》需要输入密码
sending incremental file list
html_2014-12-10_tar.gz
173 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)
sent 260 bytes received 27 bytes 114.80 bytes/sec
total size is 173 speedup is 0.60
在服务端192.168.1.145上查看已经收到此文件
[root@A-server peng]# ls
html_2014-12-10_tar.gz
或不提示输入密码操作:
[root@www www]# rsync -avzP html_2014-12-10_tar.gz rsync_backup@192.168.1.145::peng --password-file=/etc/rsync.password
sending incremental file list
sent 43 bytes received 8 bytes 102.00 bytes/sec
total size is 173 speedup is 3.39
或
[root@www www]# rsync -avzP html_2014-12-10_tar.gz rsync://rsync_backup@192.168.1.145/peng --password-file=/etc/rsync.password
sending incremental file list
html_2014-12-10_tar.gz
173 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)
sent 260 bytes received 27 bytes 574.00 bytes/sec
total size is 173 speedup is 0.60
或者从客户端192.168.1.147推送到服务端192.168.1.145的/peng/test目录下
先在服务端设置:
[root@A-server peng]# mkdir test
[root@A-server peng]# chown rsync test ------》要对创建的子目录赋予权限
开始在客户端推送:
[root@B-serve www]# rsync -avzP html_2014-12-10_tar.gz rsync://rsync_backup@192.168.1.145/peng/test --password-file=/etc/rsync.password
sending incremental file list
html_2014-12-10_tar.gz
173 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)
sent 260 bytes received 27 bytes 574.00 bytes/sec
total size is 173 speedup is 0.60
也可以写成:[root@B-server www]# rsync -avzP html_2014-12-10_tar.gz rsync://rsync_backup@192.168.1.145:/peng/test - -password-file=/etc/rsync.password
问题排查:NO route to host问题
解决办法:可能是防火墙阻挡了,telnet ip 873检查,如果出现connection refuse字样表示防火墙阻挡或服务没开启。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
rsync命令同步参数选项:
-v,--verbose 详细模式输出,传输时的进度等信息
-z,--compress 传输时进行压缩以提高传输效率,--compress-level=NUM可按级别压缩
-r,--recursive 对子目录以递归模式,即目录下的所有目录都同样传输,注意是小写r
-t,--times 保持文件时间信息
-a,--archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rtopgDl
-D,--devices 保持设备文件信息
-l,--links 保持软链接
-o,--owner 保持文件属主信息
-p,--perms 保持文件权限
-g,--group 保持文件属组信息
-P,--progress 显示同步的过程及传输时的进度等信息
-e,--rsh=COMMAND 使用的信道协议,指定替代rsh的shell程序。例如:ssh
--exclude=PATTERN 指定排除
保持同步目录及文件属性:
这里的-avzP相当于 -vzrtopgDlP(还多了Dl功能),生产环境常用的参数选项为-avzP或-vzrtopgP,如果是放入脚本中,也可以把-v和-P去掉,这里的--progress可以用-P代替。
特别注意:
请注意一下两命令的差别:
1)rsync -avz /opt/ /tmp
2)rsync -avz /opt /tmp
1)中的/opt/意思是,仅把/opt/目录里面的内容同步过来,opt目录本身并不同步;而
后者2)中/opt表示把opt本身及其内部内容全都同步到/tmp下,仅一个/(斜线之差),意义就大不相同,请读者注意使用的差别。
2)在后面讲的通过远程shell进行数据传输的内容也会有类似的问题,要牢记!
分发脚本:
[root@www ~]# cat fenfa.sh
#!/bin/bash
. /etc/init.d/functions
if [ $# -ne 1 ];then
echo "Usage:$0 argv"
exit
fi
for ip in 150
do
scp -P22 $1 root@192.168.1.$ip:/test >&/dev/null
rsync -avzP $1 -e "ssh -p 22" root@192.168.1.$ip:/test >&/dev/null
if [ $? -eq 0 ];then
action "fenfa $1 successful." /bin/true
else
action "fenfa $1 failure." /bin/false
fi
done