rysnclinux系统下数据备份工具之一。字面理解就是remote sync(远程同步)。备份数据是多数系统管理员的必备日常工作。不仅仅要备份本地文件,还要对web服务器或者远端数据进行备份,这就需要我们熟练的掌握rysnc工具,rysnc不仅仅能对不同位置的文件和目录进行同步,还可以差异计算,压缩传输文件来最小化数据传输,和cp命令相比,rysnc的优势在于搞笑的差异算法。并且,rysnc还支持网络数据传输,在复制文件的同时,会把源端与目的端的文件进行比较,只有当文件不一样的时候在进行复制。

 

rsync格式:

我们可以通过“man rysnc”来查看rysnc 的命令格式。

src为源,dest指目的地址)

 

[root@one ~]# man rsync
 
rsync(1)                         rsync(1)
 
NAME
       rsync — a fast, versatile, remote (and local) file-copying tool
 
SYNOPSIS
       Local:  rsync [OPTION...] SRC... [DEST]    
 
       Access via remote shell:
         Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
         Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
 
       Access via rsync daemon:
         Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
             rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
         Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
             rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
 
 Usages with just one SRC arg and no DEST arg will list the source files instead of copying.


 

可以看到rsync的命令格式,以下为rysnc命令格式的实例:

远程ip地址为192.168.124.129

 

pull把远程的数据拉到本机来。push是把本机的数据推送到远程去。

Access via remote shell
#rsync -av 192.168.124.129:/tmp/1.txt    /tmp/
#rsync -av /tmp/1.txt    192.168.124.129:/tmp/

 

不加username,默认为当前用户。

加上username的格式为:

#rsync -av [email protected]:/tmp/1.txt    /tmp/

 

Access via rsync daemon:  

alonglinux是模块名,在rsyncd.conf中定义的,[]里面的,就是模块名)
#rsync -av  192.168.124.129::alonglinux/123/1.txt   /tmp/ 
#rsync -av  /tmp/1.txt     192.168.124.129::alonglinux/123/ 

 

 

 

rsync的常用选项:

-a ,归档,以递归的模式传输文件,并保持所有属性,等同于-rlptgpD

-r ,--recursive,对子目录以递归模式处理,只针对目录,如果单独传一个文件不需要加-r,传输目录必须加-r选项。

-v, --verbose 可视化,详细模式输出,比如速率,文件数量等。
-u ,==--update 避免把目的机器的新数据覆盖掉
-q, --quiet 精简输出模式
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-R, --relative 使用相对路径信息

-P, --progress 可以看到文件传输的进度。
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST(不覆盖目的端的更新文件)
-l, --links 保留软链接,如果软连接在远程指定的文件不存在,那么软链接就是一个废文件。
-L, --copy-links 想对待常规文件一样处理软链结,如果是SRC中有软连接文件,则加上该选项后会把软连接指向的目标拷贝到DEST

-z ,压缩传输。
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
--safe-links 忽略指向SRC路径目录树以外的链结
-o, --owner 保持文件属主信息
-g, --group 保持文件属组信息
-I, --ignore-times 不跳过那些有同样的时间和长度的文件
--exclude=PATTERN 指定排除不需要传输的文件模式
--include=PATTERN 指定不排除而需要传输的文件模式

--delete 删除目的端上存在,而源端不存在的文件,保证源端和目的端保持一致。

 

例:

rsync -av 111/  /tmp/322/

//111目录以及目录下所有文件同步到tmp322下。

111后不加/,只同步111目录。


diff可以对比两个文件的变化。#diff /tmp/1.txt /111/12.txt


# rsync -avL --delete 111/  /tmp/322/ 

//--delete 删除源中没有的文件。


#rsync -avLu 111/ /tmp/322/

 -u不删除和源文件中不一样的文件。


#rsync -avLu 111/ --exclude=“23” /tmp/322/ 

源文件中的23不会备份过去。可以通配--exclude=“*.txt”

首次连接会提示输入密码。

[root@one ~]# rsync -av 11111.txt 192.168.124.129:/tmp/
reverse mapping checking getaddrinfo for bogon [192.168.124.129] failed - POSSIBLE BREAK-IN ATTEMPT!
[email protected]'s password: 
sending incremental file list
 
sent 46 bytes  received 12 bytes  1.51 bytes/sec
total size is 11  speedup is 0.19


 

 

rsync同步之ssh隧道方式:

 

telnet是探测远程机器的某一个端口是否开启。

telnet 192.168.124.129 22    //探测它的22端口是否打开。

 

指定ssh端口
#rsync -avPz -e “ssh -p 10022” 192.168.11.190/tmp/111 

如果远程机器sshd端口并非是22,那么在rsync时如何指定端口?
#rsync -e "ssh -p xxx"
#rsync "--rsh=ssh -p xxx”

 

使用ssh方式同步时,如何避免让用户输入密码?使用密钥认证,在创建密钥时,不设置密钥密码。
实验环境:one192.168.124.128      two192.168.124.129

 

首先确认一下主机one上是否有这个文件/root/.ssh/id_rsa.pub(公钥文件)

如果没有就生成这个文件,步骤如下:

[root@one~]#ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key(/root/.ssh/id_rsa):
Enter passphrase(empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
Tey key fingerprint is:


 

生成密钥的过程中有一些交互过程,直接回车,处于安全问题应该输入密码的,但是我们的目的是为了自动化的同步数据,所以不输入密码。最后生成私钥(/root/.ssh/id_rsa)和公钥文件(/root/.ssh/id_rsa.pub

 

[root@one ~]# cat /root/.ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAs3OQebENX/8/KMaBGC0txh7/YBwXplPLcF2+0YrsCIwIryWH3hcgi3rSbRPqxu+p2HUH7UcJ5+dbitDSn8h3p7zleJEj/RMCJACjLHocjqO5eKgSllY4TguwmmV04lAhBSvsfJgcJZ4CaIX3gNBE10ji9Ya/spY3ozQAutfktALsf0V2mhj8HWoH0YYW6FRHMGnST/M+tZclHMsMZCyzc/meLl4Csy/OQJaDtw8PsMbiJeUogT+skxUFm3TSdPksfqBrqAdVdwjhtP4XORIEAGbkCOZzx5jLEpRyFJ6WBbBs7y200qGIcIrE4y+jcQ1HsLT4yvwLxqmJ6ugR/SzwpQ== root@one


 

two主机把one上的id_rsa.pub 内容复制到.ssh/authorzied_keys文件里。

然后修改权限为600

[root@two ~]# chmod 600 /root/.ssh/authorized_keys

然后再one上登陆two

[root@one ~]# ssh 192.168.124.129
Last login: Sat Mar 19 23:53:49 2016 from 192.168.124.128
[root@two ~]#

登陆已经不需要密码了,rysnc文件传输也不需要输入密码。

我们来试验一下rysnc

[root@one ~]# rsync -av 11111.txt 192.168.124.129:/var/
sending incremental file list
11111.txt -> /root/1.txt
 
sent 49 bytes  received 15 bytes  128.00 bytes/sec
total size is 11  speedup is 0.17


 

 

rsync后台服务方式:

daemon

如何去配置一太rsync服务器:

 

配置文件 vim /etc/rsyncd.conf 其实名字可以自定义,自定义配置文件,启动的时候需要指定,需要让系统找到它,默认的就不需要指定,

vim /etc/rsyncd.conf 

port=873
log file = /var/log/rsync.log
pid file=/var/run/rsync.pid 
address=192.168.124.129   //监听的ip 默认不写就监听所有的ip
 
[along]           //模块名 ,关于具体模块的配置
path=/tmp/rsyncuse
chroot=yes           //yes或者no,ture或者false
max connections =4      // 最大连接数
read only=no         //推送的时候肯定需要写文件。
list=yes
uid=root
gid=root             //推送的文件肯定要有属组和属组
auth users=along        //用户
secretc file=/etc/rs.passwd   //用户密码文件
host allow=192.168.10.3     //允许那些机器连接


 

 


启动的命令 rsync --daemon

开机启动,把“rsync --deamon --config=/etc/rsyncd.conf”加入到/etc/rc.d/rc.local文件中。

更改了用户配置后不需要重启,是即时生效的。

 

rsync --port 8370 192.168.124.128::

 //列出模块名。


密码文件格式:模块名:密码
#vim /etc/rs.passwd

along:123124

:wq

 

修改密码文件的权限

#chmod 400 /etc/rs.passwd


在客户端:

在同步的时候,指定密码文件,可以省去输入密码的步骤:

rsync -av --password-file=/etc/rs.passwd [email protected]::along/test1 /tmp/test



配置详解:

comment

给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。默认没有描述定义。

path
指定该模块的供备份的目录树路径,该参数是必须指定的。
use chroot
如果"use chroot"指定为true,那么rsync在传输文件以前首先chrootpath参数所指定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要以roots权限,并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true
uid
该选项指定当该模块传输文件时守护进程应该具有的uid,配合gid选项使用可以确定哪些可以访问怎么样的文件权限,默认值是"nobody"

gid
该选项指定当该模块传输文件时守护进程应该具有的gid。默认值为"nobody"

max connections
指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试。默认值是0,也就是没有限制。

list
该选项设定当客户请求可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为false,可以创建隐藏的模块。默认值是true
rsync --port 8370 192.168.124.128::   //列出模块名。

 


read only
该选项设定是否允许客户上载文件。如果为true那么任何上载请求都会失败,如果为false并且服务器目录读写权限允许那么上载是允许的。默认值为true

exclude
用来指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到exclude列表中。这等同于在客户端命令中使用--exclude来指定模式,一个模块只能指定一个exclude选项。但是需要注意的一点是该选项有一定的安全性问题,客户很有可能绕过exclude列表,如果希望确保特定的文件不能被访问,那就最好结合uid/gid选项一起使用。

exclude from
指定一个包含exclude模式的定义的文件名,服务器从该文件中读取exclude列表定义。

include
用来指定不排除符合要求的文件或目录。这等同于在客户端命令中使用--include来指定模式,结合includeexclude可以定义复杂的exclude/include规则。

include from
指定一个包含include模式的定义的文件名,服务器从该文件中读取include列表定义。

auth users
该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)

secrets file
该选项指定一个包含定义用户名:密码对的文件。只有在"auth users"被定义时,该文件才有作用。文件每行包含一个username:passwd对。一般来说密码最好不要超过8个字符。没有默认的secures file名,需要限式指定一个(例如:/etc/rsyncd.passwd)。注意:该文件的权限一定要是600,否则客户端将不能连接服务器。

strict modes
该选项指定是否监测密码文件的权限,如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认值为true

hosts allow
该选项指定哪些IP的客户允许连接该模块。客户模式定义可以是以下形式:
单个IP地址,例如:192.167.0.1
整个网段,例如:192.168.0.0/24,也可以是192.168.0.0/255.255.255.0
多个IP或网段需要用空格隔开,“*”则表示所有,默认是允许所有主机连接。

hosts deny
指定不允许连接rsync服务器的机器,可以使用hosts allow的定义方式来进行定义。默认是没有hosts deny定义。
ignore errors
指定rsyncd在判断是否运行传输时的删除操作时忽略server上的IO错误,一般来说rsync在出现IO错误时将将跳过--delete操作,以防止因为暂时的资源不足或其它IO错误导致的严重问题。

ignore nonreadable
指定rysnc服务器完全忽略那些用户没有访问权限的文件。这对于在需要备份的目录中有些文件是不应该被备份者得到的情况是有意义的。
lock file
指定支持max connections参数的锁文件,默认值是/var/run/rsyncd.lock