一、rsync简介
rsync是Linux/UNIX系统下的文件同步和数据传输工具,它采用“rsync算法”使一个客户机和远程文件服务器之间的文件同步。通过rsync可以将同一个服务器的数据从一个分区备份到另一个分区,也可以将本地系统的数据通过网络传输方式备份到任何一个远程主机上;rsync工作特性第一可以在中断之后恢复传输,第二只传输源文件和目标文件之间不一致的部分,第三可以执行完整备份或者增量备份。
rsync基本特点:
- 可以镜像保存整个目录树和文件系统;
- 可以很容易做到保持原来文件的权限、时间、软硬链接等;
- 无须特殊权限即可安装;
- 优化的流程,文件传输效率高;
- 可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接;
- 支持匿名传输。
二、rsync命令的常用选项
-n:测试,在不确定命令是否能按照意愿执行时,务必要实现测试
-v:详细输出模式,--verbose
-q:--quiet,静默模式
-c:--checksum,开启校验功能,强行对文件传输进行校验
-r:--recursive,递归复制
-a: --archives.归档,保留文件的原有属性,等同于-rlptgoD
-p:--perms 保留文件的权限
-t: --times 保留文件的时间戳
-l:--links 保留文件的符号链接
-g:--group保留文件的属组
-o:--owner 保留文件的属主
-D:--devices 保留设备文件
-e ssh:表示使用ssh协议作为继承
-z:对文件压缩后传输
--progress:显示进度条
在使用时要注意:如果源目录的末尾有斜线,则只会复制源目录下的文件,而不复制源目录本身。若源目录没有斜线则会复制整个目录包含内的文件到指定的地方。
三、rsync的应用模式及相关举例
1、rsync的应用模式
- shelll应用模式,也称为本地模式;
- 远程shell模式,它利用SSH执行底层连接和加密传输;
- 查询模式,与ls命令实现类是的功能,仅列出源的内容;
- 服务器模式,此时,rsync可以工作在守护进程,能够接收客户端的数据请求;在使用时,可以在客户端使用rsync命令把文件发送到守护进程,也可以像服务器请求获取文件。
2、本地shell模式应用举例
下面两个实验可以很好的说明在同步时源目录后带与不带/,这两个细小的微调所带来的结果的很大不同。
[[email protected] ~]# rsync -av shell /tmp/ sending incremental file list shell/ shell/cpcmd.sh shell/cpcom.sh shell/jingxiang.sh sent 4470 bytes received 73 bytes 9086.00 bytes/sec total size is 4232 speedup is 0.93 [[email protected] ~]# rsync -av shell/ /tmp/ sending incremental file list ./ cpcmd.sh cpcom.sh jingxiang.sh sent 4455 bytes received 72 bytes 9054.00 bytes/sec total size is 4232 speedup is 0.93 [[email protected] ~]# ls /tmp/ cpcmd.sh cpcom.sh jingxiang.sh shell
3、远程shell模式
默认情况下rsync是使用ssh做为传输机制,由于线上的机器都会把ssh默认的连接端口22给改掉,所以下面是ssh端口改掉后的应用举例:
[[email protected] ~]# rsync -av shell -e ‘ssh -p 5231‘ 192.168.1.20:/tmp Enter passphrase for key ‘/root/.ssh/id_rsa‘: sending incremental file list shell/ shell/cpcmd.sh shell/cpcom.sh shell/jingxiang.sh sent 4470 bytes received 73 bytes 534.47 bytes/sec total size is 4232 speedup is 0.93
4、查询模式
在这个模式下,rsync与ls相类似,例如以root身份查看远程主机192.168.1.20的/tmp下的内容:
[[email protected] ~]# rsync -a 192.168.1.20:/tmp Enter passphrase for key ‘/root/.ssh/id_rsa‘: drwxrwxrwt 4096 2015/08/03 21:01:35 tmp drwxrwxrwt 4096 2015/08/03 20:12:10 tmp/.ICE-unix drwxr-xr-x 4096 2015/07/31 21:22:59 tmp/shell -rw-r--r-- 500 2015/07/28 21:44:11 tmp/shell/cpcmd.sh -rwxr-xr-x 483 2015/07/25 02:33:21 tmp/shell/cpcom.sh -rwxr-xr-x 3249 2015/07/29 01:16:26 tmp/shell/jingxiang.sh
5、服务器模式
这种模式是基于C/S模式的,在这种模式下,rsync在后台启用了一个守护进程,这个守护进程在rsync服务器端永久运行,用于接受文件传输请求,因此,客户端既可以把文件发送给守护进程,也可以向守护进程请求文件。rsync的服务器模式非常适合做为异地的中心备份服务器或数据异地存储库来使用。关于其具体的使用方法下面在应用举例。
四、rsync以基于C/S模式进行远程备份
1、实验环境介绍
hostname | IP | 系统 | |
服务端 | webserver | 192.168.1.20 | CentOS 6.6 |
客户端 | hpf-linux | 192.168.1.8 | CentOS 6.6 |
2、服务端操作
安装守护进程软件:
[[email protected] ~]# yum install -y xinetd
为rsync提供配置文件:
[[email protected] ~]# vim /etc/rsyncd.conf //系统默认没有此文件需要手动创建 uid = nobody (指定当前该模块传输文件时守护进程应该具有的用户ID,默认是nobody) gid = nobody (指定当前该模块传输文件时守护进程应该具有的用户组ID,默认是nobody) use chroot = no (是否禁锢用户家目录) max connections = 10 (指定模块的最大并发连接数) strict modes = yes (是否完全检查口令文件的权限,yes为检查权限,no为不检查,所设置为yes,密码文件的权限必须为root用户权限) pid file = /var/run/rsyncd.pid (指定rsync守护进程对应的PID文件路径) log file = /var/log/rsyncd.log (指定rsync守护进程对应的传输日志文件) [test] (定义模块名称) path = /data (指定需要备份文件或目录) ignore errors = yes (是否忽略一些无关的I/O错误) read only = no (设置no表示客户端可以上传文件,设置yes表示只读) write only = no (设置no表示客户端可下载文件,设置yes表示不能下载) hosts allow =192.168.1.8 (白名单) hosts deny = * (黑名单 ) 说明: 由于没有被白名单匹配到的会由默认规则处理,即为允许,所以为了安全这里只定义仅允许一台机器可以同步,剩下的拒绝任何人同步。 list = false (设定当客户端请求可以使用的模块列表时,该模块是否被列出。设置文false则是隐藏模块,反之为true) uid = root gid = root auth users = userdata (定义可以连接该模块的用户名,多个用户以空格或逗号分隔开。这里的用户与linux系统的用户没有任何关系) secrets file = /etc/rsync.passwd (用户密码的存放位置需要手动创建)
创建密码文件并更改权限:
[[email protected] ~]# cat /etc/rsyncd.passwd userdata:redhat [[email protected] ~]# chmod 600 /etc/rsyncd.passwd
启动守护进程rsync:
[[email protected] ~]# chkconfig rsync on [[email protected] ~]# /etc/init.d/xinetd start 正在启动 xinetd: [确定] [[email protected] ~]# ss -tunl |grep 873 //rsync默认监听在873端口 tcp LISTEN 0 64 :::873 :::*
3、客户端测试rsync服务
将客户端文件推到服务端:
[[email protected] ~]# ls shell/ cpcmd.sh cpcom.sh jingxiang.sh [[email protected] ~]# rsync shell/* [email protected]::testPassword: [[email protected] ~]# ls /data/ cpcmd.sh cpcom.sh jingxiang.sh
注意:这里的test是服务端所定义的模块,同时在模块内定义了文件存放的目录/data,密码是在服务端定义/etc/rsync.passwd文件密码。在基于C/S模式进行同步时,一定要将同步的文件写好路径,若不知道文件名称可以用*代替但不能不写。
不用手动输入密码将服务端的数据拉带客户端的/tmp目录下:
[[email protected] ~]# cat /etc/rsync.passed redhat [[email protected] ~]# chmod 600 /etc/rsync.passed [[email protected] ~]# rsync --password-file=/etc/rsync.passed [email protected]::test/* /tmp [[email protected] ~]# ls /tmp/ cpcmd.sh cpcom.sh jingxiang.sh
通过选项 --password-file=/etc/rsync.passed 的使用就不用在手动输入密码了,这样做的好处是在使用周期任务crontab是不用手动输入密码了。
这篇文章主要讲了rsync在C/S模式下的使用及配置,关于rsync的常用选项的介绍我在原先学习中总结过,虽然不是很全但够用就好,若还想扩展还是直接man rsync,查看使用帮助手册。然而由于在同步文件时只能借助与crontab进行周期性任务计划,若需要使用实时同步还要借助于inotify+rsync的组合,具体使用下篇在做介绍。