rsync远程同步
rsync(Remote Sync) 是一个Unix/linux系统下的文件同步和传输工具。Rsync通过“rsync算法”提供了一个客户机和远程文件服务器的文件同步的快速方法。每次只传送两个文件的不同部分(即支持增量备份),而不是每次都整份传送
rsync 包括如下的一些特性:
能更新整个目录树和文件系统;
有选择性的保持符号链链、硬链接、文件属性、权限、设备以及时间等;
传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用。
能用rsh、ssh 或直接端口做为传输端口;
支持匿名rsync 同步文件,是理想的镜像工具;
Rsync可以通过rsh或ssh使用,也能以daemon模式去运行,在以daemon方式运行时Rsyncserver会打开一个873端口,等待客户端去连接。
Rsync的官方站点位于http://rsync.samba.org
rsync 服务器架设比较简单,可能我们安装好rsync后,并没有发现配置文件,以及rsync服务器启动程序,因为每个管理员可能对rsync 用途不一样,所以一般的发行版只是安装好软件就完事了,让管理员来根据自己的用途和方向来自己架设rsync服务器;因为这个rsync应用比较广,能在同一台主机进行备份工作,还能在不同主机之间进行工作。在不同主机之间的进行备份,是必须架设rsync 服务器的。
在远程同步任务中,负责发起rsync同步操作的客户机称为发起端,而负责响应来自客机的rsync同步操作的服务器称为备份源。在下行同步(下载)中,备份源负责提供文档的原始位置,发起端应对该位置具有读取权限;在上行同步(上传)中,备份源负责提供文档的目标位置,发起端应对该位置具有写入权限。如下图所示:
使用rsync同步工具时,备份源既可以是SSH服务器,也可以是以服务器模式运行的rsync程序,下面分别讲解配置SSH备份源、rsync备份源的方法。
本文以RHEL6系统中的rsync-3.0.6-5为例)
1、配置SSH备份源:
使用SSH协议的好处是能够基于更安全的远程连接,增强备份的保密性。这种方式的备份源最容易配置,只要确认源文件夹的位置,并准备一个备份操作用户即可,以服务A(备份源)为例,若要将网站目录/var/www/html作为备份源,允许用户rget做下行备份,用户rput做上行备份,操作步骤如下:
在备份源服务器(IP地址为:192.168.0.1)上新建备份用户rget、rput,分别用来实现下载、上传操作:
[root@localhost~]# useradd rget
[root@localhost~]# passwd rget
[root@localhost~]# useradd rput
[root@localhost~]# passwd rput
确认sshd服务正常运行,且允许用户rget、rput能访问ssh服务器。在/etc/ssh/sshd_config文件中添如下配置项,只允许rget和rput能远程登录ssh服务器。并重启sshd服务,确保修改生效。
[root@localhost~]# vim /etc/ssh/sshd_config //添加
调整备份源所提供文档所在目录的权限(如/var/www/html目录),使rget用户有权读取、rput用户有权写入。在linux系统中,正常创建的目录权限为755,文件权限为644,因此对于rget用户来说,默认权限已经满足下行备份的要求。
但是对于rput用户来说,要能够写入才有权限做上行备份,建议使用ACL访问控制机制设置用户rput对/var/www/html的写入权限。
其中”-R”选项表示递归操作,”-m”选项表示修改权限,default表示在html/目录新建的文档用户rput也具有rwx权限。当需要清除所设置的ACL属性时,setfacl命令的-x或-b选项,分别表示用来个别删除和全部删除。到此SSH备份源配置完毕。
有了备份源服务器以后,就可以使用rsync工具来执行远程同步了。本文讲解的备份操作均在客户机(发起端,IP为:192.168.0.3)执行。实际上备份源与发起端可以是同一台主机,其效果相当于本地备份而不是异地备份。
rsync命令的基本用法:
格式:rsync 【选项】 源文件 目标文件
常见的选项:
-a,--archive 归档模式,表示以递归的方式传输文件,并且保持文件属性,等同于-rlptgoD
-r,–recursive 对子目录以递归模式处理
-l,--links 表示拷贝链接文件
-p , --perms 表示保持文件原有权限
-t , --times 表示保持文件原有时间
-g , --group 表示保持文件原有属用户组
-o , --owner 表示保持文件原有属主
-D , --devices 表示块设备文件信息
-z , --compress 表示压缩传输
-H 表示硬连接文件
-A 保留ACL属性信息
-P 显示传输进度
-u, --update 仅仅进行更新,也就是跳过所有已经存在于目标位置,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
--port=PORT 指定其他的rsync服务端口
--delete 删除那些目标位置有而原始位置没有的文件
--password-file=FILE 从FILE中得到密码
--bwlimit=KBPS 限制I/O带宽,KBytes /second
--filter “- 文件名”需要过滤的文件
--exclude= :需要过滤的文件
-v 显示同步过程的详细信息
rsync备份操作示例:
下行同步SSH备份源:
将服务器192.168.0.1中的/var/www/html文件夹与客户机(192.168.0.3)本地的/wwwroot文件夹进行同步,保持文件权限和属性、软/硬链接、ACL属性、删除/wwwroot目录中多余的文件,并在传输过程中进行压缩。
确保备份源服务器中/var/www/html目录下有文件:
在客户机本地创建目标目录:
在客户机上执行rsync命令实现下行同步。
验证同步结果:
上行同步SSH备份源:
将客户机中的/usr/share/doc/HTML/目录中的内容上传同步到SSH服务器的/var/www/html目录下,由于备份用户rput并非root用户,因此”-g”、”-o”等选项将无法使用。
验证结果:在192.168.0.1主机上显示/var/www/html目录下的列表
编写rsync备份脚本:
实际生产环境中的备份工作通常是按计划重复执行的,例如每晚上22:30对服务器网站目录做一次下行同步,定期任务可以交给 crond服务来完成,而实际的备份操作则可以写到shell脚本中。
由于计划备份中的脚本在后台执行,无法根据提示来输入密码,因此编写rsync备份脚本时如何解决交互验证的问题就成为关键所在。
SSH备份源的无交互验证:
对于SSH服务器来说,采用密钥验证是避免交互式登录的最佳方法,只要在客户机中创建无私钥短语的密钥对,然后将公钥文件分发给服务器中的备份用户,就可以实现无密码自动登录了。
在客户机上创建密钥对:
[root@localhost~]# 回车
将公钥文件分发给服务器:
在客户机测试SSH的密钥验证:
成功实现免交互自动登录后,再次使用rsync访问SSH备份源时,也就不再提示需要密码验证了,注意,执行脚本的必须是在客户机中创创建密钥对的用户。
编写SSH备份源的shell脚本:
脚本内容如下:
对建好的备份脚本设置适当权限:
创建crond计划任务:
[root@localhost~]# crontab -e
[root@localhost~]# service crond start
[root@localhost~]# chkconfig crond on
至此SSH备份源的rsync远程备份搭建完毕。
下面接着介绍有关rsync备份源的方法
2、配置rsync备份源:
rsync不仅仅用作远程同步的发起端(客户端),也可以作为守护进程运行,为其他客户机提供备份源,配置rsync备份源需要建立配置文件rsync.conf,创建备份账户,然后将rsync程序以”- -daemon”选项运行。
建立/etc/rsyncd.conf配置文件:
配置文件rsyncd.conf位于/etc/目录下,需自行建立,配置内容的格式与samba服务器类似,具体可以参考man手册页,下面将以源目录/var/www/html、备份账号backuper为例,介绍其配置方法。
在备份源服务器上创建rsyncd.conf文件。该文件要手工创建。
rsync配置文件介绍:
全局参数:对整个rsync服务器生效,如果模块参数和全局参数冲突,针对冲突模块的模块参数生效
模块参数:定义需要通过rsync输出的目录定义的参数
下面是常见的全局配置参数,
port:指定后台程序使用的端口号,默认为873。
uid:该选项指定当该模块传输文件时守护进程应该具有的uid,配合gid选项使用可以确定哪些可以访问怎么样的文件权限,默认值是" nobody" 。
gid:该选项指定当该模块传输文件时守护进程应该具有的gid。默认值为" nobody" 。
max connections:指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试。默认值是0,也就是没有限制。
lock file:指定支持max connections参数的锁文件,默认值是/var/run/rsyncd.lock。
motd file:" motd file" 参数用来指定一个消息文件,当客户连接服务器时该文件的内容显示给客户,默认是没有motd文件的。
log file:" log file" 指定rsync的日志文件,而不将日志发送给syslog。
pid file:指定rsync的pid文件,通常指定为“/var/run/rsyncd.pid”,存放进程ID的文件位置。
hosts allow = 单个IP地址或网络地址 //允许访问的客户机地址
下面是常见的模块配置参数
主要是定义服务器哪个目录要被同步输出。
其格式必须为“[共享模块名]”形式,这个名字就是在rsync客户端看到的名字,其实有点象Samba服务器提供的共享名。而服务器真正同步的数据是通过path来指定的。
Comment:给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。默认没有描述定义。
Path:指定该模块的供备份的目录树路径,该参数是必须指定的。
read only :yes为只允许下载,no为可以下载和上传文件到服务器
exclude:用来指定多个由空格隔开的多个文件或目录(相对路径),将其添加到exclude列表中。这等同于在客户端命令中使用—exclude或----filter来指定某些文件或目录不下载或上传(既不可访问)
exclude from:指定一个包含exclude模式的定义的文件名,服务器从该文件中读取exclude列表定义,每个文件或目录需要占用一行
include: 用来指定不排除符合要求的文件或目录。这等同于在客户端命令中使用--include来指定模式,结合include和exclude可以定义复杂的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名,注意:该文件的权限一定要是600,否则客户端将不能连接服务器。
hosts allow:指定哪些IP的客户允许连接该模块。定义可以是以下形式:
单个IP地址,例如:192.167.0.1,多个IP或网段需要用空格隔开,
整个网段,例如:192.168.0.0/24,也可以是192.168.0.0/255.255.255.0
“*”则表示所有,默认是允许所有主机连接。
hosts deny:指定不允许连接rsync服务器的机器,可以使用hosts allow的定义方式来进行定义。默认是没有hosts deny定义。
list:该选项设定当客户请求可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为false,可以创建隐藏的模块。默认值是true。
Timeout:通过该选项可以覆盖客户指定的IP超时时间。通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户端。超时单位为秒钟,0表示没有超时定义,这也是默认值。对于匿名rsync服务器来说,一个理想的数字是600。
创建rsyncd.conf文件:
内容如下:
注:如果以"use chroot = no"选项运行可写的rsync守护程序的话,攻击者就可能通过诱骗rsync在模块之外创建文件,所以出于安全考虑,建议将该选项设置为yes。
基于安全性考虑,对于rsync 的备份源最好仅允许以只读方式做下行同步,若确实需要做上行同步时,建议改用SSH备份源。另外,下行备份可以采用匿名的方式,只要将其中的”auth users”和”secrets file”配置记录去掉就可以了。
为备份账户创建数据文件:
根据上一步的设置,创建账号数据文件,添加一行用户记录,以冒号分隔,用户名称为backuper,密码为pwd123。由于账号信息采用明文存放,因此应调整文件权限,避免账号信息泄露。
在该文件中添加用户名和密码
设置rsyncd_users.db文件的权限为700或600,权限设置不对的话身份验证会失败
与配置SSH备份源类似,备份用户backuper也需要对源目录/var/www/html/有相应的读取权限。实际上只要other组有读取权限,则备份用户backuper和运行用户nobody也就有了读取权限了。
启动rsync服务程序,执行”rsync --daemon”命令就可以启动rsync服务,以独立监听服务的方式运行,若要关闭rsync服务,可以采用kill进程的方式。
将”rsync --daemon”保存到/etc/rc.local文件中,确保系统启动后自动启动rsync服务。
注:在iptables防火墙上创建规则允许873端口的通信:
上面启动rsync服务程序是通过”rsync --daemon”方式启动rsync服务。考虑到异地备份的特性,通常并不需要全天不间断运行,最好只是在有客户机连接的时候才启用,因此可以将rsync交给超级服务xinetd管理,只要修改相应配置并启动xinetd服务,就可以提供rsync服务了。也就是当xinetd服务接收到客户端的同步请求后,会把rsync同步请求转给rsync程序。
配置方法:
修改后内容如下:
注:将disable = yes 改为no;确信有- -daemon服务选项.
安装xinetd服务软件包:
启动xinetd服务:
若selinux开启要修改selinux的布尔值:
至此rsync备份源配置完毕,下面使用rsync备份工具实现备份操作。
格式1:
rsync 选项用户名@备份源服务器IP::共享模块名目标目录
或
格式2:
rsync 选项 rsync://用户名@备份源服务器IP/共享模块名目标目录
在客户机上执行rsync命令实现下行同步操作:
或
编写rsync备份脚本:
rsync备份源的无交互验证,对于rsync备份源来说,可使用环境变量RSYNC_PASSWORD来存放密码。执行 rsync备份任务时,会自动读取该变量,并在需要时发送给rsync源服务器来进行验证。如下所示:
Rsync备份脚本如下:
内容如下:
设置x权限:
设置计划任务,在 crond计划任务中按指定计划执行脚本。
到此rsync备份源配置完毕。
3、配置rsync+inotify实时同步:
Linux内核从2.6.13版本开始提供了inotify通知接口,用来监控文件系统的各种变化情况,如文件存取、删除、移动等。利用这一机制,可以非常方便地实现文件异动告警、增量备份,并针对目录或文件的变化及时作出响应。
使用rsync工具与inotify机制相结合,可以实现触发式备份(实时同步),只要原始位置的文档发生变化,则立即启动增量备份操作,否则处于静态等侍状态,这样一来,就避免了按固定周期备份进存在的延迟性、周期过密等问题。
正因为inotify通知机制由linux内核提供,因此主要做本机监控,在触发式备份中应用时更适合上行同步,下面介绍其配置过程。
两台服务器,均为RHEL6系统,IP分别为:192.168.0.1和192.168.0.3,把192.168.0.1服务器上的/var/www/html目录时实同步到192.168.0.3主机上的/wwwroot目录中。
在服务器192.168.0.1上执行下面的相关操作,实现实时同步:
查看是否支持inotify,从kernel 2.6.13开始正式并入内核。
看看是否有/proc/sys/fs/inotify/目录,以确定内核是否支持inotify
在linux内核中,默认的inotify机制提供了三个调控参数:max_queued_events、max_user_instances、max_user_watches。分别表示监控事件队列、最多监控实例数、每个实例最多监控文件数
当要监控的目录、文件数量较多或者变化较频繁时,建议加大这三个参数的值。例如可直接修改/etc/sysctl.conf配置文件,将管理队列设为32768,实例数设为1024,监控数设为1048576(建议大于监控目标的总文件数)。
在/etc/sysctl.conf文件中添加如下内容:
执行sysctl -p使修改后的sysctl.conf文件生效。
安装inotify-tools工具,使用inotify机制还需要安装inotify-tools,以便提供inotifywait、inotifywatch辅助工具程序,用来监控、汇总改动情况。
编译安装inotify-tools软件包:
以监控网站目录/var/www/html为例,可以先执行inotifywait命令,然后在另一个终端向/var/www/html目录下添加文件、移动文件,跟踪屏幕输出结果。其中选项”-e”用来指定要监控哪些事件(create,move,delete,modify,attrib 是指监听”创建移动删除写入属性更改” 事件),选项”-m”表示持续监控,”-r”表示递归整个目录,”-q”表示简化输出信息。
其他选项的含义:
-a 存档模式
-h 保存硬连接
-z 压缩文件数据在传输
-t 维护修改时间
--delete 删除于多余文件
在192.168.0.1服务器上执行下面的命令,监控/var/www/html的变化情况:
在另一个终端登录,在/var/www/html目录进行相关的操作,回到原来的终端查看监控变化情况。
使用inotifywait输出的监控结果中,每行记录中依次包括目录、事件、文件。据此可以识别变动情况。
编写触发式同步脚本:
为了简单起见,只要检测到变动时执行rsync上行同步操作即可。需要注意的是,当更新较频繁时,应避免并发执行rsync备份(当rsync进程已经存在则忽略本次同步,或根据rsync进程数量来决定是否同步)
先配置好基于密钥身份验证的SSH服务,确保在服务器192.168.0.1主机上使用adminput用户能无交互式远程登录备份主机192.168.0.3(在192.168.0.3主机上创建adminput用户并确保adminput用户拥有对目标目录/wwwroot属主和属组权限。chownadminput:adminput /wwwroot),设置adminput用户针对/wwwroot的acl权限。
脚本内容如下:
触发式上行同步的验证过程如下所述
1)使用rsync工具执行一次上行同步
2)在192.168.0.1主机上运行/opt/inotify_rsync.sh脚本程序
3)切换到本机的/var/www/html目录,执行增加、删除、修改文件等操作
4)查看192.168.0.3备份主机的/wwwroot目录下的变化情况。
至此有关rsync远程同步的所有操作整理完毕,希望能对大家有所帮助。