一、需求
每晚汇总各机器的操作日志,同步到主服务器进行日志分析。上线在测试服开发调试后的代码,文件或目录。
二、基础知识
rsync 分为服务器端、客户端,服务器端搭建比客户端辛苦一些(也是很简单,就是多一些文件配置)。
rsync 服务器是指以 deamon 方式运行 rsync 服务的服务器,需要打开 rsync deamon 和启动 xinetd 服务。默认端口873。
rsync 客户端是发起 rsync 连接的服务器,安装rsync即可。
rsync 客户端发起连接后,rsync 服务器会检查 rsync 客户端提交 rsync 服务器内建的户名和密码是否正确,如果通过认证检测,则开始文件传输,传输的过程是按要求先比对文件的大小、属性、权限、MD5值等信息,如果两端文件信息不一致,则按要求同步文件的区别块。
三、安装
大多数Linux操作系统都自带 rsync 服务,如果想升级可以使用 yum 等,也可以使用源码包自己安装。
- yum安装如下(笔者通过yum安装):
- yum insatll rsync
- 源码安装如下:
wget https://download.samba.org/pub/rsync/rsync-3.1.2.tar.gz
tar -xzf rsync-3.1.2.tar.gz
cd rsync-3.1.2
- ./configure --prefix=/usr/local/rsyncd
make && make install
四、服务端配置
rsync 配置文件安装完有时候并不存在,不必惊慌,可以手动创建。创建配置文件目录及文件如下:
| - /etc/rsyncd(文件夹)
| - rsyncd.conf(rsync 服务器的配置文件)
| - rsyncd.secrets(用户密码文件,客户端使用其中的账号密码访问,需要 600 权限)
| - rsyncd.motd(自定义用户登录后显示的服务器信息,即 messageoftoday,)
mkdir /etc/rsyncdtouch /etc/rsyncd/rsyncd.conftouch /etc/rsyncd/rsyncd.secretstouch /etc/rsyncd/rsyncd.motdchmod 600 /etc/rsyncd/rsyncd.secrets
/etc/rsyncd/rsyncd.conf
#进程 pid 文件所在位置,服务启动后会在这个目录下生成pid文件pid file = /var/run/rsyncd.pid#指定监听端口,默认是873,可以自己指定port = 873#服务器监听的IP地址,可省略,也就是本机的ip地址address = 192.168.79.128#守护进程所属的uid,默认是nobody,可能会碰到文件或目录权限问题,此处偷懒用的 root,这里的用户是指登录服务器的用户uid = root #守护进程的gidgid = root#chroot,即改变程序执行时所参考的根目录位置,在传输文件之前,服务器守护程序在将chroot 到文件系统中的目录中#这样做的好处是可能保护系统被安装漏洞侵袭的可能。缺点是需要超级用户权限。另外对符号链接文件,将会排除在外#也就是说,你在rsync服务器上,如果有符号链接,你在备份服务器上运行客户端的同步数据时,只会把符号链接名同步下来,并不会同步符号链接的内容use chroot = yes#只读选择,只让客户端从服务器上读取文件,则设置为no或者注释掉都可以,笔者亲测,想要本客户端文件传输到到服务器,需求将这项设置为false,否则会报module read only 错误read only = false#只写选择,只让客户端到服务器上写入,这项笔者直接注释掉了,使用后没发现问题#write only = yes#允许访问的IP,可以指定单个IP,也可以指定整个网段,能提高安全性。格式是 ip 与 ip 之间、ip 和网段之间、网段和网段之间要用空格隔开;hosts allow = 192.168.79.128/192.168.79.130#客户端最多连接数max connections = 5 #当用户登录时会看到这个信息。比如显示当前时间、公告等,当客户端使用命令同步文件时,会显示在客户端的界面上,当然也可以不设置此项motd file = /etc/rsyncd/rsyncd.motd#rsync 服务器的日志;log file = /var/log/rsync.log#记录传输文件的日志transfer logging = yes#日志格式log format = %t %a %m %f %b#日志级别syslog facility = local3#通过该选项可以覆盖客户指定的IP超时时间。可以确保rsync服务器不会永远等待一个崩溃的客户端。超时单位为秒钟,0表示没有超时定义,这也是默认值。对于匿名rsync服务器来说,一个理想的数字是600。timeout = 300 #模块定义#主要是定义服务器哪个目录要被同步。#每个模块都要以[name]形式。这个名字就是在 rsync 客户端看到的名字。#但是服务器真正同步的数据是通过 path 指定的。可以依次创建多个模块。#每个模块要指定认证用户、密码文件,但排除并不是必须的。#模块名,以下配置都属于此模块,如果想创建多个模块,复制以下内容,并修改相应的模块信息即可。[ logs ]#文件目录所在位置,服务器端与客户端进行同步的文件夹path = /test #当查看服务器上提供了哪些目录时是否列出来,no比较安全list = no#忽略I/O错误ignore errors#指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系,是 rsyncd.secrets 中的用户名!#如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份。#这里使用的 challenge/response 认证协议。#用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)。
#说明:这里的用户不是登录系统的用户,而rsync服务中的配置一个用户名,与svn配置用户名意义一样,配置后可以使用这个用户进行文件同步操作,这里笔者就是起了个一个叫root的用户名auth users = root#密码文件,这个路径就是一开始新建的几个配置文件中密码文件的路径secrets file = /etc/rsyncd/rsyncd.secrets#忽略的文件或目录,要忽略进行同步的文件或目录放在这里,这个笔者还没有测试过exclude = error_log httpd.pid#本模块注释,可选,comment后的内容自己任意写即可comment this is my log
/etc/rsyncd/rsyncd.secrets 密码文件,用户名称与密码以冒号分隔,多个用户名和密码可以多行
root:123456
/etc/rsyncd/rsyncd.motd 登录公告
+++++++++++++++++++++++++++++++您正在进行rsync同步+++++++++++++++++++++++++++++++
五、启动服务端
启动服务端有两种方式。
1.直接使用 --daemon 参数
/usr/local/rsync/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
2.xinet方式
1).修改 /etc/services,加入以下内容,如果已经有可以不加,如果端口改了,需要改掉 873 端口为指定端口
rsync 873/tcp # rsync rsync 873/udp # rsync
2).修改 /etc/xinetd.d/rsync,主要是要打开rsync这个daemon, 一旦有rsync client要连接時, xinetd会把它转介給 rsyncd(port 873)。
service rsync{ disable = no socket_type = stream wait = no user = root server = /usr/bin/rsync server_args = --daemon --config=/etc/rsyncd/rsynd.conf log_on_failure += USERID}
3).重启 xinetd
service xinetd restart
说明:如果报xinetd服务未找找到,则使用yum install xinetd时行安装,笔者重启时就是提示服务未找到。xinetd关闭、开启、重启命令:
service xinetd stop/start/restart
六、客户端配置
创建密码文件,/etc/rsyncd/rsyncd.pass,并修改为 600 权限。
说明:这里的文件名后缀不一定要和服务器端一样,只要同步命令使用时的引用的密码文件路径正确即可。
touch /etc/rsyncd/rsyncd.passchmod 600 /etc/rsyncd/rsyncd.pass
/etc/rsyncd/rsyncd.pass 其内密码需要和服务端内/etc/rsyncd/rsyncd.secrets指定用户的密码保持一致
说明:客户端的密码文件中,每行中只有密码,没有前面的用户名和冒号,这个要注意。
123456
七、客户端向服务端传输文件,如果是 873 端口,可以把 --port 去掉
rsync -vzrtopg --progress /rtest/haha.php root@192.168.79.128::logs --password-file=/etc/rsyncd/rsyncd.pass
也可以使用以下命令:
rsync -avzP /rtest/client.txt root@192.168.79.128::logs --password-file=/etc/rsyncd/rsyncd.pass
说明:-vzrtopg 控制同步时显示的一些信息,一般情况下这几个选项参数就可以了,如果还有别的需求可以参考手册设置,--progress 显示同步的进步,/rtest/haha.php 客户端要传
输到服务器端的文件或目录,root@192.168.79.128::logs 用户名@服务器ip地址::模块名称(服务器端conf中配置的)
若有需要也可以从服务端拉取文件,需要把服务器的 /etc/rsyncd/rsyncd.conf 中的 write only = yes 给去掉
rsync -vzrtopg --progress root@192.168.79.128::logs /rtest/haha.php --password-file=/etc/rsyncd/rsyncd.pass
rsync -avzP root@192.168.79.128::logs /rtest/client.txt --password-file=/etc/rsyncd/rsyncd.pass
说明:和传输文件的命令相比,就是服务器端目录在前,客户端在后,其实就相当于一个远程的目录复制功能,前面文件夹内的内容复制到后面文件夹中
注意:以上两个同步文件的命令都是客户端上执行的。
八、附赠 /etc/init.d/rsync
#!/bin/bash # chkconfig: - 85 15# description: rsyncstatus1=$(ps -ef | egrep "rsync --daemon.*rsyncd.conf" | grep -v 'grep') pidfile="/var/run/rsyncd.pid" start_rsync="rsync --daemon --config=/etc/rsyncd/rsyncd.conf" function rsyncstart() { if [ "${status1}X" == "X" ]; then rm -f $pidfile ${start_rsync} status2=$(ps -ef | egrep "rsync --daemon.*rsyncd.conf" | grep -v 'grep') if [ "${status2}X" != "X" ]; then echo "rsync service start.......OK" fi else echo "rsync service is running !" fi } function rsyncstop() { if [ "${status1}X" != "X" ]; then kill -9 $(cat $pidfile) status2=$(ps -ef | egrep "rsync --daemon.*rsyncd.conf" | grep -v 'grep') if [ "${statusw2}X" == "X" ]; then echo "rsync service stop.......OK" fi else echo "rsync service is not running !" fi } function rsyncstatus() { if [ "${status1}X" != "X" ]; then echo "rsync service is running !" else echo "rsync service is not running !" fi } function rsyncrestart() { if [ "${status1}X" == "X" ]; then echo "rsync service is not running..." rsyncstart else rsyncstop rsyncstart fi } case $1 in "start") rsyncstart ;; "stop") rsyncstop ;; "status") rsyncstatus ;; "restart") rsyncrestart ;; *) echo echo "Usage: $0 start|stop|restart|status" echo esac
九、附赠配置参数
全局参数
在文件中[module]之前的所有参数都是全局参数,当然也可以在全局参数部分定义模块参数,这时候该参数的值就是所有模块的默认值。port
指定后台程序使用的端口号,默认为873。motd file
"motd file"参数用来指定一个消息文件,当客户连接服务器时该文件的内容显示给客户,默认是没有motd文件的。log file
"log file"指定rsync的日志文件,而不将日志发送给syslog。比如可指定为“/var/log/rsyncd.log”。pid file
指定rsync的pid文件,通常指定为“/var/run/rsyncd.pid”。syslog facility
指定rsync发送日志消息给syslog时的消息级别,常见的消息级别是:uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3,local4, local5, local6和local7。默认值是daemon。模块参数
主要是定义服务器哪个目录要被同步。其格式必须为“[module]”形式,这个名字就是在rsync 客户端看到的名字,其实有点象Samba服务器提供的共享名。而服务器真正同步的数据是通过 path 来指定的。我们可以根据自己的需要,来指定多个模块,模块中可以定义以下参数:comment
给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。默认没有描述定义。path
指定该模块的供备份的目录树路径,该参数是必须指定的。use chroot
如 果"use chroot"指定为true,那么rsync在传输文件以前首先chroot到path参数所指定的目录下。这样做的原因是实现额外的安全防护,但是缺 点是需要以roots权限,并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true。uid
该选项指定当该模块传输文件时守护进程应该具有的uid,配合gid选项使用可以确定哪些可以访问怎么样的文件权限,默认值是"nobody"。gid
该选项指定当该模块传输文件时守护进程应该具有的gid。默认值为"nobody"。max connections
指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试。默认值是0,也就是没有限制。list
该选项设定当客户请求可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为false,可以创建隐藏的模块。默认值是true。read only
该选项设定是否允许客户上载文件。如果为true那么任何上载请求都会失败,如果为false并且服务器目录读写权限允许那么上载是允许的。默认值为true。exclude
用来指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到exclude列表中。这等同于在客户端命令中使用--exclude来指定模式,一个 模块只能指定一个exclude选项。但是需要注意的一点是该选项有一定的安全性问题,客户很有可能绕过exclude列表,如果希望确保特定的文件不能 被访问,那就最好结合uid/gid选项一起使用。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名,需要限式指定一个(例如:/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。transfer logging
使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中。log format
通过该选项用户在使用transfer logging可以自己定制日志文件的字段。其格式是一个包含格式定义符的字符串,可以使用的格式定义符如下所示:%h 远程主机名
%a 远程IP地址%l 文件长度字符数%p 该次rsync会话的进程id%o 操作类型:"send"或"recv"%f 文件名%P 模块路径%m 模块名%t 当前时间%u 认证的用户名(匿名时是null)%b 实际传输的字节数%c 当发送文件时,该字段记录该文件的校验码默认log格式为:"%o %h [%a] %m (%u) %f %l",一般来说,在每行的头上会添加"%t [%p] "。在源代码中同时发布有一个叫rsyncstats的perl脚本程序来统计这种格式的日志文件。
timeout
通过该选项可以覆盖客户指定的IP超时时间。通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户端。超时单位为秒钟,0表示没有超时定义,这也是默认值。对于匿名rsync服务器来说,一个理想的数字是600。refuse options
通过该选项可以定义一些不允许客户对该模块使用的命令参数列表。这里必须使用命令全名,而不能是简称。但发生拒绝某个命令的情况时服务器将报告错误信息然后退出。如果要防止使用压缩,应该是:"dont compress = *"。dont compress
用来指定那些不进行压缩处理再传输的文件,默认值是*.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz十、附赠rsync命令
-v, --verbose 详细模式输出 -q, --quiet 精简输出模式 -c, --checksum 打开校验开关,强制对文件传输进行校验 -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD -r, --recursive 对子目录以递归模式处理 -R, --relative 使用相对路径信息 -b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。 --backup-dir 将备份文件(如~filename)存放在在目录下。 -suffix=SUFFIX 定义备份文件前缀 -u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件) -l, --links 保留软链结 -L, --copy-links 想对待常规文件一样处理软链结 --copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结 --safe-links 忽略指向SRC路径目录树以外的链结 -H, --hard-links 保留硬链结 -p, --perms 保持文件权限 -o, --owner 保持文件属主信息 -g, --group 保持文件属组信息 -D, --devices 保持设备文件信息 -t, --times 保持文件时间信息 -S, --sparse 对稀疏文件进行特殊处理以节省DST的空间 -n, --dry-run现实哪些文件将被传输 -W, --whole-file 拷贝文件,不进行增量检测 -x, --one-file-system 不要跨越文件系统边界 -B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节 -e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步 --rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息 -C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件 --existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件 --delete 删除那些DST中SRC没有的文件 --delete-excluded 同样删除接收端那些被该选项指定排除的文件 --delete-after 传输结束以后再删除 --ignore-errors 及时出现IO错误也进行删除 --max-delete=NUM 最多删除NUM个文件 --partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输 --force 强制删除目录,即使不为空 --numeric-ids 不将数字的用户和组ID匹配为用户名和组名 --timeout=TIME IP超时时间,单位为秒 -I, --ignore-times 不跳过那些有同样的时间和长度的文件 --size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间 --modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0 -T --temp-dir=DIR 在DIR中创建临时文件 --compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份 -P 等同于 --partial --progress 显示备份过程 -z, --compress 对备份的文件在传输时进行压缩处理 --exclude=PATTERN 指定排除不需要传输的文件模式 --include=PATTERN 指定不排除而需要传输的文件模式 --exclude-from=FILE 排除FILE中指定模式的文件 --include-from=FILE 不排除FILE指定模式匹配的文件 --version 打印版本信息 --address 绑定到特定的地址 --config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件 --port=PORT 指定其他的rsync服务端口 --blocking-io 对远程shell使用阻塞IO -stats 给出某些文件的传输状态 --progress 在传输时现实传输过程 --log-format=formAT 指定日志文件格式 --password-file=FILE 从FILE中得到密码 --bwlimit=KBPS 限制I/O带宽,KBytes per second -h, --help 显示帮助信息
十一、rsync使用时常见的报错
问题 @ERROR: chroot failed@ERROR: chroot failed rsync error: error starting client-server protocol (code 5) at main.c(1503) [receiver=3.0.6]原因:服务器端的目录不存在或无权限。解决办法:创建目录并修正权限可解决问题。问题 skipping non-regular filereceiving incremental file listskipping non-regular file “vendor/bin/doctrine”skipping non-regular file “vendor/bin/doctrine.php”sent 1990 bytes received 489209 bytes 327466.00 bytes/sec total size is 182515746 speedup is 371.57原因:source源文件有软链接。解决方法:修改为 rsync -va,其中 -a == -rlptgoD (no -H,-A,-X) 或者 rsync -rvltOD 也可以。解决后:receiving incremental file listvendor/bin/doctrine -> ../doctrine/orm/bin/doctrinevendor/bin/doctrine.php -> ../doctrine/orm/bin/doctrine.phpsent 1998 bytes received 489279 bytes 327518.00 bytes/sec total size is 182515746 speedup is 371.51问题@ERROR: module is read onlysending incremental file listERROR: module is read onlyrsync error: syntax or usage error (code 1) at main.c(866) [receiver=3.0.6]rsync: read error: Connection reset by peer (104)rsync error: error in rsync protocol data stream (code 12) at io.c(759) [sender=3.0.6]原因:source源服务器端权限设置read为only只读权限。解决方法:read only = false
问题@ERROR: auth failed on module tee@ERROR: auth failed on module tee rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.6]原因:服务器端该模块(tee)需要验证用户名密码,但客户端没有提供正确的用户名密码,认证失败。解决方法:提供正确的用户名密码解决此问题。
问题 @ERROR: Unknown module ‘tee_nonexists’@ERROR: Unknown module ‘tee_nonexists’ rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.6]原因:服务器不存在指定模块。解决方法:提供正确的模块名或在服务器端修改成你要的模块以解决问题。问题 password file must not be other-accessiblepassword file must not be other-accessiblecontinuing without password filePassword:原因:这是因为rsyncd.pwd rsyncd.secrets的权限不对,应该设置为600。解决方法:chmod 600 rsyncd.pwd
问题 rsync: failed to connect No route to hostrsync: failed to connect to 192.168.1.10: No route to host (113) rsync error: error in socket IO (code 10) at clientserver.c(104) [receiver=3.0.6]原因:对方没开机、防火墙阻挡、通过的网络上有防火墙阻挡,都有可能。解决方法:在iptables 中开放该端口,语句如下:iptables -I INPUT -p tcp –dport 873 -j ACCEPTrsync默认端口873,其实就是把tcp udp的873端口打开。
问题 rsync error: error starting client-server protocolrsync error: error starting client-server protocol (code 5) at main.c(1524) [Receiver=3.0.6]原因:/etc/rsyncd.conf配置文件内容有错误。请正确核对配置文件。
问题 rsync: chown “” failed: Invalid argument (22)rsync: chown “” failed: Invalid argument (22)原因:权限无法复制。去掉同步权限的参数即可。(这种情况多见于Linux向Windows的时候)
问题 @ERROR: daemon security issue — contact admin@ERROR: daemon security issue — contact admin rsync error: error starting client-server protocol (code 5) at main.c(1530) [sender=3.0.6]原因:同步的目录里面有权限不足的软连接文件,需要服务器端的/etc/rsyncd.conf打开use chroot = yes。问题 rsync: read error: Connection reset by peer (104)rsync: read error: Connection reset by peer (104) rsync error: error in rsync protocol data stream (code 12) at io.c(794) [receiver=3.0.6]解决:很大可能是服务器端没有开启 rsync 服务,开启服务。问题 @ERROR: failed to open lock file@ERROR: failed to open lock file rsync error: error starting client-server protocol (code 5) at main.c(1495) [receiver=3.0.6]解决:配置文件 rsync.conf 中添加 lock file = rsyncd.lock 即可解决。