rsync

rsync


1.rsync简介

rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSHrsync主机同步。

2.rsync特性

rsync支持很多特性:

  • 可以镜像保存整个目录树和文件系统
  • 可以很容易做到保持原来文件的权限、时间、软硬链接等等
  • 无须特殊权限即可安装
  • 快速:第一次同步时rsync会复制全部内容,但在下一次只传输修改过的文件。rsync在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽
  • 安全:可以使用scpssh等方式来传输文件,当然也可以通过直接的socket连接
  • 支持匿名传输,以方便进行网站镜像

3.rsync的ssh认证协议

rsync命令来同步系统文件之前要先登录remote主机认证,认证过程中用到的协议有2种:

  • ssh协议
  • rsync协议

rsync server端不用启动rsyncdaemon进程,只要获取remote host的用户名和密码就可以直接rsync同步文件。
rsync server端因为不用启动daemon进程,所以也不用配置文件/etc/rsyncd.confssh认证协议跟scp的原理是一样的,如果在同步过程中不想输入密码就用ssh-keygen -t rsa打通通道

//这种方式默认是省略了 -e ssh 的,与下面等价:
rsync -avz /SRC -e ssh root@172.16.12.129:/DEST 
    -a  //文件宿主变化,时间戳不变
    -z  //压缩数据传输
 
//当遇到要修改端口的时候,我们可以:
rsync -avz /SRC -e "ssh -p2222" root@172.16.12.129:/DEST  
//修改了ssh 协议的端口,默认是22

4.rsync命令

//Rsync的命令格式常用的有以下三种:
    rsync [OPTION]... SRC DEST					//本地
    rsync [OPTION]... SRC [USER@]HOST:DEST		//远程推
    rsync [OPTION]... [USER@]HOST:SRC DEST		//远程拉
    
    -a	//归档模式传输,等于-tropglD
-v	//详细模式输出,显示速率,文件数量等
-z	//传输时进行压缩,提高效率
-r	//递归传输,传输目录,传输目录时目录名称后加"/"表示传输目录下的所有文件
-t	//保持文件时间信息
-o	//保持文件属主信息
-g	//保持文件属组信息
-p	//保持文件权限
-l	//保留软链接
-H	//保持硬链接
-n 	//进行试运行,不作任何更改
-D	//保持设备文件信息
-P	//显示同步的过程及传输时的进度等信息
-L	//保留软连接指向的目标文件
-e ssh 					//使用SSH加密隧道传输
--delete				//让目标目录和源目录数据保持一致
--delete-excluded 		//指定要在目的端删除的文件
--delete-after 			//默认情况下,rsync是先清理目的端的文件再开始数据同步;如果使用此选项,则rsync会先进行数据同步,都完成后再删除那些需要清理的文件。
--bwlimit				//限速传输
--exclude=PATTERN		//指定排除不需要传输的文件模式
--exclude-from=FILE		//排除FILE中指定模式的文件

//安装rsync

[root@server ~]# dnf -y install rsync
[root@client ~]# dnf -y install rsync
4.1本地用法

[root@server tmp]# touch 1
[root@server tmp]# mkdir 2
[root@server tmp]# rsync -avz 1 2/
sending incremental file list
1

sent 80 bytes  received 35 bytes  230.00 bytes/sec
total size is 0  speedup is 0.00
[root@server tmp]# ls 2
1
//将目录2里的内容复制到3里去
[root@server tmp]# cd 2
[root@server 2]# touch 2 3 4 5
[root@server 2]# ls
1  2  3  4  5
[root@server 2]# cd ..
[root@server tmp]# mkdir 3
[root@server tmp]# rsync -avz 2/ 3/
sending incremental file list
./
1
2
3
4
5

sent 299 bytes  received 114 bytes  826.00 bytes/sec
total size is 0  speedup is 0.00
[root@server tmp]# ls 3
1  2  3  4  5

备份目录时,使目标目录与源目录数据保持一致;若目标目录有多余的文件则会被删除
[root@server tmp]# rm -rf 2/3 5
[root@server tmp]# ls 3
1  2  3  4  5
[root@server tmp]# rsync -avz --delete 2/ 3/
sending incremental file list
deleting 3
./

sent 103 bytes  received 20 bytes  246.00 bytes/sec
total size is 0  speedup is 0.00
[root@server tmp]# ls 3
1  2  4  5
[root@server tmp]# ls 2
1  2  4  5

4.2远程用法
//将本地文件备份到其他主机

[root@server ~]# rsync -avz httpd/ root@192.168.159.101:/tmp/
The authenticity of host '192.168.159.101 (192.168.159.101)' can't be established.
ECDSA key fingerprint is SHA256:tGT6Gw1m3L8XMXHgNwagltsGGnnUD1R6rR+tVI2pwRY.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.159.101' (ECDSA) to the list of known hosts.
root@192.168.159.101's password:
sending incremental file list
./
installhttpd.sh
web
file/
file/tanke/
file/tanke/index.html
file/tanke/audio/
file/tanke/audio/attack.mp3
file/tanke/audio/bulletCrack.mp3
file/tanke/audio/move.mp3
file/tanke/audio/playerCrack.mp3
file/tanke/audio/prop.mp3
file/tanke/audio/start.mp3
file/tanke/audio/tankCrack.mp3
file/tanke/css/
file/tanke/css/default.css
file/tanke/images/
file/tanke/images/Thumbs.db
file/tanke/images/menu.gif
file/tanke/images/tankAll.gif
file/tanke/js/
file/tanke/js/Collision.js
file/tanke/js/Helper.js
file/tanke/js/bullet.js
file/tanke/js/const.js
file/tanke/js/crackAnimation.js
file/tanke/js/jquery.min.js
file/tanke/js/keyboard.js
file/tanke/js/level.js
file/tanke/js/main.js
file/tanke/js/map.js
file/tanke/js/menu.js
file/tanke/js/num.js
file/tanke/js/prop.js
file/tanke/js/stage.js
file/tanke/js/tank.js

sent 163,843 bytes  received 614 bytes  29,901.27 bytes/sec
total size is 307,826  speedup is 1.87
[root@client ~]# ls /tmp/
file
installhttpd.sh
web

//将其他主机的内容远程备份到本地
[root@server ~]# rsync -avc root@192.168.159.101:/root/123 .
root@192.168.159.101's password:
receiving incremental file list
123/

sent 28 bytes  received 53 bytes  32.40 bytes/sec
total size is 0  speedup is 0.00
[root@server ~]# ls
123  anaconda-ks.cfg  httpd  lamp  mysql

5.rsync服务模式

远程模式在传输数据时使用ssh远程登录,使用的是系统用户(不安全);服务模式以守护进程的方式运行,使用的是虚拟用户,用户不存在操作系统中。

服务器类型IP地址
源服务器192.168.159.100

目标服务器 192.168.159.101

  • 把源服务器上/etc目录实时同步到目标服务器的/tmp/下
//目标服务器配置
//安装rsync服务
[root@client ~]# dnf -y install rsync rsync-daemon
//配置目标服务器文件/etc/rsync.conf
log file = /var/log/rsyncd.log    # 日志文件位置,启动rsync后自动产生这个文件,无需提前创建
pidfile = /var/run/rsyncd.pid     # pid文件的存放位置
lock file = /var/run/rsync.lock   # 支持max connections参数的锁文件
secrets file = /etc/rsync.pass
[etc_from_client]     # 自定义同步名称
path = /tmp/          # rsync服务端数据存放路径,客户端的数据将同步至此目录
comment = sync etc from client
uid = root        # 设置rsync运行权限为root
gid = root       # 设置rsync运行权限为root
port = 873        # 默认端口
ignore errors     # 表示出现错误忽略错误
use chroot = no       # 默认为true,修改为no,增加对目录文件软连接的备份
read only = no    # 设置rsync服务端为读写权限
list = no     # 不显示rsync服务端资源列表
max connections = 200     # 最大连接数
timeout = 600     # 设置超时时间
auth users = admin        # 执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开
hosts allow = 192.168.159.100   # 允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
hosts deny = 192.168.1.1  	# 禁止数据同步的客户端IP地址,可以设置
多个,用英文状态下逗号隔开

//创建虚拟用户密码文件并设置权限
[root@client ~]# echo "admin:123456" > /etc/rsync.passwd
[root@client ~]# ll /etc/rsync*
-rw-r--r-- 1 root root 1663 Sep 22 19:06 /etc/rsyncd.conf
-rw-r--r-- 1 root root   13 Sep 22 19:09 /etc/rsync.passwd
[root@client ~]# chmod 600 /etc/rsync*
[root@client ~]# ll /etc/rsync*
-rw------- 1 root root 1663 Sep 22 19:06 /etc/rsyncd.conf
-rw------- 1 root root   13 Sep 22 19:09 /etc/rsync.passwd

//设置rsync服务开机自启以及开启他
[root@client ~]# systemctl enable --now rsyncd

//源服务器配置
//首先关闭防火墙和selinux
[root@server ~]# systemctl stop firewalld.service
[root@server ~]# systemctl disable firewalld.service
[root@server ~]# setenforce 0
setenforce: SELinux is disabled
[root@server ~]# yum -y install epel-release
//安装rsync服务端软件,只需要安装,不要启动,不需要配置
[root@server ~]# yum -y install rsync
//创建认证密码文件
[root@server ~]# echo '123456' > /etc/rsync.pass
[root@server ~]# cat /etc/rsync.pass
123456
//设置文件权限,只设置文件所有者具有读取、写入权限即可
[root@server ~]# chmod 600 /etc/rsync.pass
[root@server ~]# ll /etc/rsync.pass
-rw------- 1 root root 7 Sep 22 20:46 /etc/rsync.pass
//在源服务器上创建测试目录,然后在源服务器运行以下命令
[root@server ~]# mkdir -pv /root/etc/test
mkdir: created directory '/root/etc'
mkdir: created directory '/root/etc/test'

[root@server ~]# rsync -avH --port 873 --progress --delete /root/etc/ admin@192.168.159.101::etc_from_client --password-file=/etc/rsync.pass
sending incremental file list
deleting vmware-root_1035-4256545071/
deleting systemd-private-fd8a8f19f64645e08f8e922720c5c6e2-ModemManager.service-N2UoLi/tmp/
deleting systemd-private-fd8a8f19f64645e08f8e922720c5c6e2-ModemManager.service-N2UoLi/
./
test/

sent 77 bytes  received 225 bytes  604.00 bytes/sec
total size is 0  speedup is 0.00

//运行完成后,在目标服务器上查看,在/tmp目录下有test目录,说明数据同步成功
[root@client ~]# ls /tmp/
test
//安装inotify-tools工具,实时触发rsync进行同步
[root@server ~]# yum -y install inotify-tools
[root@server ~]# yum -y install make gcc gcc-c++

//写同步脚本
[root@server ~]# mkdir /scripts
[root@server ~]# touch /scripts/inotify.sh
[root@server ~]# chmod 755 /scripts/inotify.sh
[root@server ~]# vim /scripts/inotify.sh
host=192.168.159.101
src=/etc
des=etc_from_client
password=/etc/rsync.pass
user=admin
inotifywait=/usr/bin/inotifywait

$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files;do
    rsync -avzP --delete  --timeout=100 --password-file=${password} $src $user@$host::$des
    echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done

//启动脚本
[root@server ~]# nohup bash /scripts/inotify.sh &
[1] 11246
[root@server ~]# nohup: ignoring input and appending output to 'nohup.out'
//在源服务器上生成一个新文件
[root@server ~]#  echo 'hello world' > /etc/runtime
//查看inotify生成的日志
[root@server etc]# echo 'hello world' > /etc/runtime
[root@server etc]# tail /tmp/rsync.log
20220922 21:35 /etc/runtimeATTRIB was rsynced
20220922 21:35 /etc/runtimeATTRIB was rsynced
20220922 21:35 /etc/runtimeATTRIB was rsynced

设置脚本开机自启

[root@server etc]# chmod +x /etc/rc.d/rc.local
[root@server etc]#  echo 'nohup /bin/bash /scripts/inotify.sh' >> /etc/rc.d/rc.local
[root@server etc]# tail /etc/rc.d/rc.local
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local

nohup /bin/bash /scripts/inotify.sh

到目标服务器上去查看是否把新生成的文件自动传上去了:

[root@client tmp]# pwd
/tmp
[root@client tmp]# ls
etc  test

[root@client tmp]# cat etc/runtime
hello world

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1we11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值