rsync
1.rsync简介
rsync
是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync
可以远程同步,支持本地复制,或者与其他SSH
、rsync
主机同步。
2.rsync特性
rsync
支持很多特性:
- 可以镜像保存整个目录树和文件系统
- 可以很容易做到保持原来文件的权限、时间、软硬链接等等
- 无须特殊权限即可安装
- 快速:第一次同步时
rsync
会复制全部内容,但在下一次只传输修改过的文件。rsync
在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽 - 安全:可以使用
scp
、ssh
等方式来传输文件,当然也可以通过直接的socket
连接 - 支持匿名传输,以方便进行网站镜像
3.rsync的ssh认证协议
rsync
命令来同步系统文件之前要先登录remote
主机认证,认证过程中用到的协议有2种:
ssh
协议rsync
协议
rsync server
端不用启动rsync
的daemon
进程,只要获取remote host
的用户名和密码就可以直接rsync
同步文件。
rsync server
端因为不用启动daemon
进程,所以也不用配置文件/etc/rsyncd.conf
。ssh
认证协议跟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