1. rsync 命令介绍
rsync工具可以基于ssh和rsync协议实现高效率的远程系统之间复制文件,使用安全的shell连接做为传
输方式,比scp更快,基于增量数据同步,即只复制两方不同的文件,此工具来自于rsync包
注意:通信两端主机都需要安装 rsync 软件
# centos
yum -y install rsync
# ubuntu
apt -y install rsync
1.1 rsync配置
rsync 安装后需要手动配置,之后才能重启 rsync 服务
注:ubuntu 和 centos7 安装完 rsync 成后有配置文件,centos8没有,需要手动配置
cat /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
max connections = 2000
timeout = 600
hosts allow = 10.0.0.0/16 172.18.0.0/16
pid file = /var/run/rsyncd.pid
log file = /var/log/rsync.log
ignore errors
read only = false
list = false
host deny = 0.0.0.0/32
[root]
path = /
read only = no
exclude = /root
[rclog]
path = /
read only = yes
exclude = /root
[vmlist]
path = /search/apache/htdocs/machine/vmlist/
read only = no
exclude = /root
管理 rsync 服务
pkill rsync
rsync --daemon < /dev/null
ps -ef|grep rsync
lsof -i:873
1.2 常用参数
参数 | 解释 |
-a archive | 归档模式,表示递归方式传输文件,并保持所有文件属性, 等于vzrtopgDl,但不保留ACL(-A)和SELinux属性(-X) |
-n | 模拟复制过程 |
-v verbose | 详细模式输出,传输时的进度等信息 |
-r | 对子目录以递归模式,即目录下的所有目录都同样传输 |
-z | 传输时进行压缩以提高传输效率,–compress-level=NUM可按级别压缩 |
-t times | 保持文件时间信息 |
-o owner | 保持文件属主信息 |
-p perms | 保持文件权限 |
-g group | 保持文件属组信息 |
-P progress | 显示同步的过程及传输时的进度等信息 |
-D devices | 保持设备文件信息 |
-l links | 将软链接文件本身进行复制(默认) |
-L | 将软链接文件指向的文件复制 |
-u | 如果接收者的文件比发送者的文件较新,将忽略同步 |
-e --rsh=COMMAND | 使用的信道协议,指定替代rsh的shell程序,如:ssh |
–exclude=PATHERN | 指定排除不需要传输的文件模式 |
–delete | 源数据删除,目标数据也自动同步删除 |
2. Rsync大致使用三种主要的传输数据的方式:
- 主机本地间的数据传输(类似于cp命令)
- 借助scp、ssh等通道来传输数据(类似于scp命令)
- 以守护进程(socket)的方式传输数据(生产常用功能)
SYNOPSIS
Local: rsync [OPTION...] SRC... [DEST]
Access via remote shell:
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
2.1 本地模式
语法
Local: rsync [OPTION...] SRC... [DEST]
# SRC:为源,即待拷贝的分区、文件、目录
# DEST:为目的分区、文件、目录
示例
# 拷贝 /etc/hosts 文件到 /tmp 下:
rsync /etc/hosts /tmp <===> cp -p /etc/hosts /tmp
# 拷贝 opt 目录到 /tmp 下:
rsync -avz /opt /tmp/ <===> cp -ap /opt /tmp/
2.2 远程(scp、ssh)传输模式
拉取
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
示例
rsync -aP -e 'ssh -p 4567' root@10.0.0.8:/opt /tmp
rsync -aP /etc/hosts -e 'ssh -p4567' root@10.0.0.8:/tmp/
# -e 'ssh -p 3456',表示通过ssh的通道传输数据,-p 3456可省略
推送
push: rsync [OPTION...] SRC... [USER@]HOST:DEST
示例
rsync -aP /etc/hosts -e 'ssh -p 3456' root@10.0.0.8:/tmp
3、守护进程(socket)模式
拉取(本地作为客户端向rsync服务端拉取文件或目录)
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
示例
# rsync 服务器 172.18.1.15 数据如下
[root@centos8 ~]#pwd
/root
[root@centos8 ~]#ls for*.sh
for1.sh for2.sh for3.sh
[root@centos8 ~]#ls etc.tar.gz
etc.tar.gz
[root@centos8 ~]#
# 从 rsync 服务端 172.18.1.15 拉取所有 for 开头的 .sh 文件
root@ubuntu20:~# rsync -aP rsync://root@172.18.1.15:/root/root/for*.sh /tmp/
receiving incremental file list
for1.sh
114 100% 111.33kB/s 0:00:00 (xfr#1, to-chk=2/3)
for2.sh
117 100% 114.26kB/s 0:00:00 (xfr#2, to-chk=1/3)
for3.sh
132 100% 64.45kB/s 0:00:00 (xfr#3, to-chk=0/3)
root@ubuntu20:~#
# 生产中常用写法
# 从 rsync 服务端 172.18.1.15 的 root 模块下拉取 etc.tar.gz 到本地的 /tmp 目录下
root@ubuntu20:~# rsync -aP 172.18.1.15::root/root/etc.tar.gz /tmp/
receiving incremental file list
etc.tar.gz
5,134,369 100% 132.34MB/s 0:00:00 (xfr#1, to-chk=0/1)
root@ubuntu20:~# ll /tmp/etc.tar.gz
-rw-r--r-- 1 root root 5134369 4月 2 16:51 /tmp/etc.tar.gz
root@ubuntu20:~#
推送(本地作为 rsync 服务端向远程推送文件或目录)
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
示例
# 生产中常用写法
# 将本地的 key.sh 文件推送到 172.18.1.15 的 /tmp 目录下
root@ubuntu20:~# rsync -aP key.sh 172.18.1.15::root/tmp/
sending incremental file list
key.sh
2,074 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)
# 将本地的公钥文件推送到 172.18.1.15 的 /tmp 目录下
root@ubuntu20:~# rsync -aP ~/.ssh/id_rsa.pub 172.18.1.15::root/tmp
sending incremental file list
id_rsa.pub
567 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)
root@ubuntu20:~#
# 生产中不常用的写法
root@ubuntu20:~# rsync -aP hosts.txt rsync://root@172.18.1.15:/root/tmp
sending incremental file list
hosts.txt
24 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)
root@ubuntu20:~#
注意
- 与远程 shell 不同的是,[USER@]HOST::SRC… 和 [USER@]HOST::DEST 结尾处均为双冒号连接 SRC 或 DEST,
- 此处 SRC 和 DEST 不是路径,而是 rsync 守护进程中配置的模块名
示例:排除 /data 下不需要打包的目录
tar -zcvf data.tar.gz --exclude=d --exclude=e data
或
tar -zcvf data.tar.gz --exclude=data/d --exclude=data/e data
示例:主机之间数据完全同步(即无差异同步)–delete
# 1、清空或删除本地目录
# 新建一个空目录
mkdir null
# 用rsync删除目标目录
rsync -avzP --delete-before -d null/ /mnt/
# 使得mnt目录的内容和空目录null一样,即删除目录文件
# 2、清空或删除远程目录
# 新建一个空目录
mkdir null
rsync -avzP --delete null/ rsync_backup@10.0.0.8::backup/
生产应用
# 10.139.36.90 上 df -i 显示 /var 目录 inode 已超过80%
# 查看小文件太多,已无法使用rm删除
cd /var/spool/postfix
# 新建一个空目录
mkdir null
rsync -aP --delete null/ maildrop/
特别提示
# 仅把/opt/目录里面的内容同步过来,opt目录本身并不同步
rsync -av /opt/ /tmp/
#表示把/opt本身及其内容全部同步到/tmp下
rsync -av /opt /tmp/