OS声明: Centos7
# 安装rsync
yum -y install rsync
# 设置服务开机自启并现在启动
systemctl enable --now rsyncd.service
#检查是否已经成功启动
## rsync的服务端口是TCP/873
netstat -tunlp|grep 873
# 编辑配置文件
vim /etc/rsyncd.conf
基本配置方案
# 设置运行rsync 进程的用户
uid = root
gid = root
use chroot = no
max connections = 4
# CentOS7中yum安装不需指定pid file 否则报错
# pid file = /var/run/rsyncd.pid
# 此文件定义完成后系统会自动创建
lock file=/var/run/rsyncd.lock
log file = /var/log/rsyncd.log
exclude = lost+found/
transfer logging = yes
timeout = 900
# 同步时跳过没有权限的目录
ignore nonreadable = yes
# 传输时不压缩的文件
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
修改完配置重启服务端
# 重启服务端
systemctl restart rsync
Windows
版可能不支持
建议
先设置ssh免密
参考: https://www.cnblogs.com/wclwcw/p/8242695.html
https://article.itxueyuan.com/46mBPw
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-b --backup:当有变化时,对目标目录中的旧版文件进行备份
-v, --verbose 详细模式输出
-r, --recursive 对子目录以递归模式处理。同步目录的时候要加上这个参数
–copy-unsafe-links:拷贝指向SRC路径目录树以外的链接文件
–safe-links:忽略指向SRC路径目录树以外的链接文件(默认)
-e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
-z, --compress 对备份的文件在传输时进行压缩处理
-q ––quiet:精简输出模式
-h ––human-readable:输出文件大小使用易读的单位(如,K,M等)
-n ––dry-run:显示哪些文件将被传输
–stats 给出某些文件的传输状态
––partial:保留那些因故没有完全传输的文件,以是加快随后的再次传输
–progress 打印同步的过程
-P:等价于 ––partial ––progress,断点续传并打印过程
–timeout=TIME 同步过程中,IP超时时间,单位为秒
–ignore-existing:忽略那些已经存在于接收端的文件,仅备份那些新创建的文件
–exsiting:仅仅更新那些已经存在于接收端的文件,而不备份那些新创建的文件
–exclude=pattern:指定排除一个不需要传输的文件匹配模式
–exclude-from=file:从file中读取排除规则
–include=file:指定需要传输的文件匹配模式
–include-from=file:从file中读取包含规则
–backup-dir=dir:与 -b 结合使用,将备份的文件存到 DIR 目录中
–link-dest=dir:当文件未改变时基于DIR创建硬链接文件
––list-only:仅仅列出文件而不进行复制
––rsyncpath=PROGRAM:指定远程服务器上的 rsync 命令所在路径
–port=PORT 指定其他的rsync服务端口
–log-format=formAT 指定日志文件格式
––password-file=FILE:从 FILE 中读取口令,以避免在终端上输入口令,通常在 cron 中连接 rsync 服务器时使用
–bwlimit=KBPS 限制I/O带宽,KBytes per second
-4 ––ipv4:使用 IPv4
-6 ––ipv6:使用 IPv6
–version 打印版本信息
––help:显示帮助信息
-p, --perms 保持文件权限
-o, --owner 保持文件属主信息
-g, --group 保持文件属组信息
-t ––times:保持文件时间信息
-l, --links 保留软链结,加上这个参数,同步过来的文件会保持之前的软链接属性不变
-H, --hard-links 保留硬链结
-D:保持设备文件和特殊文件 (super-user only)
–dirs -d 不递归传输目录
–delete 删除那些接收端还有而发送端已经不存在的文件。这个是rsync做增量方式的全备份的最佳选择方案!!!!!!
–delete-before 接收者在传输之前进行删除操作 (默认)。即先将目标目录中文件全部删除,再将源目录文件拷贝过去。这是rsync保持目标目录跟源目录一致的方案!!!
–delete-during:接收者在传输过程中进行删除操作
–delete-after 在同步操作之后做比较,删除那些目标目录中有而源目录中没有的多余文件
–delete-excluded 删除目标目录中那些被该选项指定排除的文件
–delay-updates:将正在更新的文件先保存到一个临时目录(默认为 “.tmp”),待传输完毕再更新目标文件
–ignore-errors 即使出现IO错误也进行删除,忽略错误
-a
参数会保持文件权限属性
本地备份可以用-aP
参数
# 本机中的两个目录进行同步
## -a 递归同步、保留符号链接、保留权限、保留时间戳、保留所有者和组
## -P:等价于 ––partial ––progress,断点续传并打印过程
rsync -aP /源目录/ /root/目的地目录/
如果是内网传输,不要使用-z
参数来压缩,会严重影响传输速度
# 将本机文件同步到远程机
## -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
## -v, --verbose 详细模式输出
## -z, --compress 对备份的文件在传输时进行压缩处理
## -P:等价于 ––partial ––progress,断点续传并打印过程
rsync -avzP local.file 192.168.1.22:/path/to/local.file
如果是内网传输,不要使用-z
参数来压缩,会严重影响传输速度
# 将远程主机上的文件同步到本地
## -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
## -v, --verbose 详细模式输出
## -z, --compress 对备份的文件在传输时进行压缩处理
## -P:等价于 ––partial ––progress,断点续传并打印过程
rsync -avzP 192.168.1.22:/path/to/local.file /data
# 从远程同步到本地,并删除目标目录比源目录多余的文件
## -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
## -v, --verbose 详细模式输出
## -z, --compress 对备份的文件在传输时进行压缩处理
## -P:等价于 ––partial ––progress,断点续传并打印过程
## --delete 删除那些接收端还有而发送端已经不存在的文件
## -e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
rsync -avzP --delete -e 'ssh -p port' root@[$Remote_Host]:[$Remote_Dir] [$Local_Dir]
https://blog.csdn.net/omaidb/article/details/125937221
# 传输大文件到远端主机
## -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
## -v, --verbose 详细模式输出
## -z, --compress 对备份的文件在传输时进行压缩处理
## -r, 递归,传输目录时使用
## -t, ––times:保持文件时间信息
## -P:等价于 ––partial ––progress,断点续传并打印过程
## --delete 删除那些接收端还有而发送端已经不存在的文件,增量备份时使用
rsync -avzrtP --delete --rsh=ssh localfile [email protected]:/tmp/
参考: https://www.361way.com/rsync-fast-del-file/4681.html
https://www.jianshu.com/p/b9519e589f62
https://juejin.cn/post/6844903766366371854
rsync
比rm
删除快的原因:
rm
删除内容时,将目录的每一个条目逐个删除(unlink)
,需要循环重复遍历很多次;rsync
删除内容时,建立好新的空目录,替换
掉老目录,不需要进行大量的遍历操作。!!!
不要忘记目录后的/
# 先建立一个空白目录
mkdir /tmp/empty
会丢失目录原权限
—常用原理是用空目录
替换要删掉的目录
# 清空目录,目标目录的权限会和变成源目录的权限一样
## -d 不递归传输目录
## -v 详细输出模式
## -delete-before 接收者在传输之前进行删除操作
# rsync -dv --delete-before 空白目录/ 要清空的目录/
rsync -dv --delete-before /tmp/empty/ /要清空的目录/
保持之前的目录权限
# 清除目标目录的文件,并保持之前的目录权限
## --delete 删除那些接收端还有而发送端已经不存在的文件
## -d --dirs 不递归传输目录
## -l 保持软链接
## -p 保持权限
## -t ––times:保持文件时间信息
## -o, --owner 保持文件属主信息
## -g, --group 保持文件属组信息
## -H, --hard-links 保留硬链结
## -D:保持设备文件和特殊文件 (super-user only)
rsync --delete -dlptogHD /tmp/empty/ /要清空的目录/
# 开始同步Centos7的docker-ce源
## -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
## -v, --verbose 详细模式输出
## -z, --compress 对备份的文件在传输时进行压缩处理
## -P:等价于 ––partial ––progress,断点续传并打印过程
## --delete 删除那些接收端还有而发送端已经不存在的文件,增量备份时使用
## --exclude=debug:指定排除不需要debug
rsync -avzP --delete --exclude=debug rsync://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/ .\7\x86_64\stable\
参考: https://blog.miniasp.com/post/2021/12/15/How-to-use-Rsync-with-OpenSSH-for-Windows
Windows
版rsync
必须使用cwRsync
內附的ssh.exe
才可以传输.不知道这是一个bug
,还是一个特色
.
建议还是使用msys2
安装rsync
吧,
将xsync
脚本放在~/bin
目录下,并赋予可执行权限
。
# 创建~/bin目录
mkdir ~/bin
# 创建xsync脚本
touch ~/bin/xsync
# 赋予xsync可执行权限
chmod +x ~/bin/xsync
# 查看能否检查得到xsync命令
which xsync
vim ~/xsync.txt
xsync
脚本内容如下:
#!/usr/bin/env bash
# 0.依赖包检查
which rsync >>/dev/null 2>&1 || yum install -y rsync || apt install -y rsync
# 1.判断参数个数,没有参数就会退出
## $#:获取参数个数,-lt 1:减1
if [ $# -lt 1 ]; then
# 打印使用示例
echo "必需有一个参数"
echo "使用示例: xsync 目录"
echo "意思是将指定目录同步到远程目录"
exit
fi
# 2. 遍历所有服务器
# ******************注意:for循环这里,需要根据情况将机器列表改成相应的主机名******************
for host in $(cat ~/xsync.txt); do
echo =======当前主机: "$host"=================
# 3. 遍历所有目录并发送
# $@: 获取所有参数
echo ****************** 以列表形式显示所有的输入参数: "$@" ******************
for file in "$@"; do
# 4. 判断文件是否存在
if [ -e "$file" ]; then
# 5. 获取父目录
pdir=$(
cd -P $(dirname "$file") || exit
pwd
)
echo ------父亲目录是: "$pdir"------
# 6. 获取当前文件名
fname=$(basename "$file")
echo ----------------当前文件:"$fname"-----------
ssh "$host" "mkdir -p $pdir" # 在目标主机上创建父目录
rsync -aP "$pdir"/"$fname" "$host":"$pdir" # rsync同步文件到远程目录
else
echo "$file" 文件不存在!
fi
done
done
以调试模式模式
# 调试脚本
bash -xv ~/bin/xsync /usr/java/