鸿 网 互 联 www.68idc.cn

rsync详细配置及各种玩法

来源:互联网 作者:佚名 时间:2018-01-28 09:52
名词区分: sync:同步 async:异步 rsync:远程同步 rsync 特点: 1,可以镜像保存整个目录树和文件系统 2,容易做到保留原有的权限(permission,mode),owner,group,时间(修改时间,modify time),软硬链接,文件acl,文件attributes等 3,传输效率高,使用同步

名词区分:
sync:同步
async:异步
rsync:远程同步

rsync 特点:

1,可以镜像保存整个目录树和文件系统
2,容易做到保留原有的权限(permission,mode),owner,group,时间(修改时间,modify time),软硬链接,文件acl,文件attributes等
3,传输效率高,使用同步算法,只比较变化的
4,支持匿名传输,方便网站镜像;也可以做验证,加强安全


rsync 参数介绍 (常用 -av)
-v verbo
-a 归档模式,递归的方式传输文件,并保持文件的属性
-l 保留软链接
-R 保留相对路径
-H 保留硬链接
-p ,-o,-g,-A 分别保留权限,属主,属组,acl等,但如果加了-a,这些就都包括了
-D 等于--devices --specials 表示支持b,c,s,p类型的文件
用法举例:
rsync -av /home/ /backup/ --本机上的同步,把/home目录下的内容同步到/backup目录下(包括隐藏文件)
rsync -av /home/ 10.1.1.218:/backup/ --把本地的/home目录内容,同步到远端218的/backup目录下,需要远程的10.1.1.218的密码
rsync -av 10.1.1.218:/backup/ /backup/ --把远端218的/backup目录下的内容同步到本地的/backup目录,需要远程的10.1.1.21的密码
rsync -a /test/ '-e ssh -p 2222' 10.1.1.218:/test1/ --如果远程机10.1.1.218的ssh端口不为默认的22,比如改成了2222,那么需要这样写
注意的问题:
1.同步时保留原路径,也就是把/home同步到/backup会变成/backup/home/*再内容

--原目录后面加不加/也影响你的同步

下面这三个有区别:
rsync -av /home/ /backup/ --/home下的内容直接同步到/backup下

rsync -av /home /backup/
rsync -aRv /home/ /backup/ --这两上是/home被同步成/backup/home/*

# rsync -av /share/20171225 /backup/ --被同步成/backup/20171225/*

# rsync -aRv /share/20171225 /backup/ --被同步成/backup/share/20171225/*

rsync -aHAX --delete /test/ /test1/ --比较完整的一个写法 (加上--delete 参数,源文件删除了,同步目标文件也会跟着删除)

可以把rsync做成服务(daemon)的形式,并加上一些控制功能,日志记录功能,匿名或验证登录功能等等。

首先

yum -y install rsync

 



要求一:仅做成服务除了首页文件不添加其余参数
第一步
vim /etc/rsyncd.conf --修改配置文件man rsyncd.conf参考帮助
motd file=/etc/rsyncd.welcome --欢迎文件,路径自定义

[notes] --共享给客户端看到的名字,名字自定义
path=/share/20171225/ --实际共享的服务器路径,名字必须是你要共享的实际路径

vim /etc/rsyncd.welcome --手动建立自己定义的motd文件,并写上自定义的欢迎信息,wq保存即可。
第二步
systemctl restart rsyncd
systemctl enable rsyncd
lsof -i:873 --重启服务,并检查端口是否为监听状态
第三步: 客户端查看
rsync -a 192.168.2.9:: --直接这样可以查看192.168.2.9这个服务器共享了哪些
"hello today! @_@" --这就是你rsyncd.welcome里写的欢迎内容
notes --这就是共享的名字

或者直接将分享的文件同步过来(注意服务端IP后面接两个冒号,再接的是你自定义的标签名,无需再添加路径)
rsync -a 192.168.2.9::notes /notes/

要求二:添加特殊控制参数
1.把日志记录到/var/log/rsyncd.log
2.共享模块要求隐藏(也就是说客户端查看不到这个模块名)
3.并且同时只能1个客户端连接进行同步这个module
4.只能允许192.168.2.x(ip你自定义)同步这个vim /etc/rsyncd.conf
vim /etc/rsyncd.conf --依旧是修改配置文件,加上控制参数

motd file=/etc/rsyncd.welcome
syslog facility=local0 --日志载体改为local0

[notes]
path=/share/20171215/
log file=/var/log/rsyncd.log --此日志时间用的是格林威治时间
#syslog facility=local0 --时间没问题,但此参数要写在global参数里并结合rsyslog才能产生日志(应该算是一个小bug,但以前rhel6也有此情况)
list=false --隐藏列表
max connections=1 --控制最大连接数
hosts allow=192.168.2.X --控制访问IP

重启服务
systemctl restart rsyncd

要求三:实现实时同步(源文件发生变化就触发同步)
inotify+rsync


笔记目录下/program/inotify_soft/inotify-tools-3.13.tar.gz --需要安装的软件

# tar xf inotify-tools-3.13.tar.gz -C /usr/src/
# cd /usr/src/inotify-tools-3.13/
# ./configure
# make
# make install

--安装完后,就会产生下面两个命令
/usr/local/bin/inotifywait
/usr/local/bin/inotifywatch

1)实现单向本地目录实时同步
测试本机/src目录里一有(增,删,改,属性改变),就会同步到/dst目录

--使用下面的脚本来做


#vim /tmp/1.sh

#!/bin/bash

/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /src |while read events --第一行表示发生增删改就触发
do
rsync -a --delete /src/ /dst/
echo "`date +'%F %T'`出现事件$events" >> /var/log/rsync.log 2>&1 --指向日志路径
done

 



# nohup sh /tmp/1.sh & --使用nohup挂起到后台执行,终端关闭,这个进程也不会被关闭
--如果你希望实现开机自动启动,可以把此命令加到/etc/rc.local里,或者写成shell服务脚本,让其支持chkconfig开机自动启动


再然后对/src进行各种操作,验证可以实时同步到/dst

--课后可以上网查下sersync工具



2)实现双向本地目录的实时同步
也有相关的软件(比如unison)可以专门来做双向的实时同步
但我们就可以用inotify反向再做一次再写一个脚本也一样可以简单去实现



==============================================================================


需求四:远程实时同步

方法一,使用ssh等效性(ssh密钥登录)让远程机器连接不需要密码,就很容易使用远程监控或同步了


实现把10.1.1.1上的/src目录实时同步到10.1.1.2上的/dst目录
10.1.1.1 /src目录 10.1.1.2 /dst目录


在10.1.1.1上产生一对密钥 --Linux上产生密匙的常用方法,交互式
# ssh-keygen --会让你输入密码文件保存路径
# ssh-copy-id -i 10.1.1.2
# ssh-add /root/.ssh/id_rsa


然后实现远程实时同步,只需要在原来的脚本基础上把远程目录前加上远程IP就可以了(因为做了ssh等效性,不需要密码)

#!/bin/bash

/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /src |while read events
do
rsync -a --delete /src/ 10.1.1.2:/dst/
echo "`date +'%F %T'`出现事件events" >> /var/log/rsync.log 2>&1
done

 



方法二:不做上面方法一的ssh密钥,使用expect脚本来解决密码问题

#!/bin/bash

/usr/local/bin/inotifywait -mrq -e modify,delete,create,move /src |while read events
do
sed -i '/^10.1.1.2 /d' /root/.ssh/known_hosts
expect <<EOF &> /dev/null
spawn rsync -a --delete /src/ 10.1.1.2:/dst/
expect "no)?"
send "yes\r"
expect "password:"
sleep 2
send "123456\r"
expect eof
EOF
echo "`date +'%F %T'`出现事件events" &>> /var/log/rsync.log
done

 



测试:要先把上面执行的脚本进程都kill掉,再重新执行这个脚本来验证




方法三,inotify+rsync+nfs
这个方法的思路是:把远程的目录通过nfs服务挂载到本地,然后当做本地目录一样来使用,这样就避免了rsync同步远程时要输密码的问题
在rhel6.5测试为:使用innotify监控远程nfs挂载的目录再同步到本地目录,无法成功;(在远程机器操作,不会同步到本地。但在挂到本地的目录操作,也会同步到本地。原因:就是inotify只能监控本机上的目录,不能监控另外一台机器上的目录)
但是反过来,使用innotify监控本地目录,再同步到远程nfs挂载的目录,可以成功



实现把10.1.1.1上的/src目录实时同步到10.1.1.2上的/dst目录
10.1.1.1 /src目录 10.1.1.2 /dst目录

步骤1:
在10.1.1.2上
# vim /etc/exports --nfs控制挂载参数的配置文件
/dst *(rw,no_root_squash)
# systemctl restart nfs

步骤2:
在10.1.1.1上
# mkdir /dst/
# mount -t nfs 10.1.1.2:/dst /dst --挂载过来,那么/dst目录就是10.1.1.2上的远程/dst目录了

步骤3:
执行上面讲的两个本地目录同步一样的脚本,测试就可以了

#vim /tmp/1.sh

#!/bin/bash

/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /src |while read events
do
rsync -a --delete /src/ /dst/
echo "`date +'%F %T'`出现事件$events" >> /var/log/rsync.log 2>&1
done

 


#nohup sh /tmp/1.sh &

步骤4:
测试(过程省略)但注意在测试之前把前面例子运行的脚本进程通过ps找出来,并kill掉

--扩展,如果把nfs换成samba服务,通过mount -t cifs指令把远程samba共享目录挂载到本地,是否可行?





方法四,使用rsync的secrets file的方法然后写脚本

例:
本地同步端 ----->远程被同步端
10.1.1.1 10.1.1.2
我要实现把本地同步端10.1.1.1上的/src/目录里的内容实时同步到远程被同步端10.1.1.2的/dst/目录


准备:
关闭iptables和selinux
主机名绑定
时间同步


实现过程
第一大步:在远程被同步端10.1.1.2上操作
# mkdir /dst/ --创建测试的被同步目录

# yum install rsync

# vim /etc/rsyncd.conf
uid=root
gid=root --这里指定使用root身份同步到10.1.1.2,否则默认使用nobody用户(这样你需要把/dst/目录改成757的权限,才有权限写)

[testsource]
path=/dst/
ignore errors
read only=no --服务级别给写权限
auth users=test --验证的用户取名为test(此用户与系统用户无关)
secrets file=/etc/rsyncd.secrets --验证用户test的用户名和密码的存放文件,此文件需要同步端和被同步端都要有(这样我们就可以用
这种方式来进行验证,而不需要远程的ssh密码验证了)
hosts allow=10.1.1.1 --进一步加强安全,只允许10.1.1.1同步


# vim /etc/rsyncd.secrets --创建这个密码文件,用户名要与上面的auth users指定的一致,密码随意(我这里以321来测试)
test:321

# chmod 600 /etc/rsyncd.secrets --为了安全性,把权限改成600,只让root读写(很多其它软件的密码文件也会要求你改成600权限)



# systemctl restart rsyncd --重启服务
# systemctl enable rsyncd

# netstat -ntlup |grep :873 --验证873端口是否启动
tcp 0 0 :::873 :::* LISTEN 50438/xinetd


第二大步:在本地同步端10.1.1.1上操作
先安装inotify软件,步骤参照上面过程,这里省略

# mkdir /src/ --创建测试的同步目录
# vim /etc/rsyncd.secrets --也要创建这个密码文件,里面只写密码就可以了。用户我们在后面的脚本里的命令里指定
321
# chmod 600 /etc/rsyncd.secrets --也改成600的权限

# vim /tmp/rsync.sh --脚本及其内容(这里强调一下,这里是测试方便,所以才放到/tmp下,生产环境可以放到/bin这种目录下做成一个命令)

#!/bin/bash
/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /src |while read events
do
rsync -a --delete --password-file=/etc/rsyncd.secrets /src/ test@10.1.1.2::testsource
done

 




# chmod 755 /tmp/1.sh --给执行权限,方便执行

# nohup sh /tmp/1.sh & --后面挂起执行

# vim /etc/rc.local --加到rc.local里让其开头自动启动
nohup sh /tmp/1.sh &

第三大步:
测试过程省略

网友评论
<