rsync同步数据
rsync同步数据常用示例常用示例建议先设置ssh免密登录# 将本机文件同步到远程机rsync -av local.file 192.168.1.22:/path/to/local.file
rsync同步数据
安装rsync
OS声明: Centos7
# 安装rsync
yum -y install rsync
# 查看service名
rpm -ql rsync|grep -i service

# 设置服务开机自启并现在启动
## 守护进程模式适合使用rsync独立用户名和密码 认证
## ssh免密传输可以不需要守护进程
systemctl enable --now rsyncd.service
#检查是否已经成功启动
## rsync的服务端口是TCP/873
netstat -tunlp|grep 873
配置服务端
vim /etc/rsyncd.conf
基本配置方案
# 设置运行rsync 进程的用户
uid = root
gid = root
# 指定非标准端口,默认TCP/873
# port = 874
# 将指定的目录作为根目录,限制了进程的访问范围
# 默认为true,修改为no,增加对目录文件软连接的备份
use chroot = no
# 指定允许的最大连接数,0为不限制
max connections = 4
# 同步过程中忽略出现的错误
ignore errors = yes
# 同步过程中忽略不可读的文件,并继续执行同步操作
ignore nonreadable = yes
# 要排除的文件或目录
## 排除lost+found/
## lost+found/是自动生成的损坏文件和目录的碎片
exclude = lost+found/
# 指定日志文件
log file = /var/log/rsyncd.log
# CentOS7中yum安装不需指定pid file 否则报错
# pid file = /var/run/rsyncd.pid
# 此文件定义完成后系统会自动创建
lock file=/var/run/rsyncd.lock
# 反向DNS查询
reverse lookup = no
# 启用传输日志记录
transfer logging = yes
# 指定 rsync 连接的超时时间(s)
timeout = 900
# 传输时不压缩的文件
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
# ************安全配置***********
# 指定允许访问 rsync 服务器的主机或网段
hosts allow = 10.0.0.0/24
# 不允许哪些主机或网段连接
hosts deny = 0.0.0.0/24
# 列出rsync模块列表
## false 禁止列出模块列表
list = false
# 每个模块名称对应一个不通的path目录,如果名称重复,后一个生效
[backup]
# 对备份模块的注释或说明
comment = mysql数据备份
# 指定要备份的路径
path = /data/mysql/backup
# 是否只读(默认yes)
read only = no
# 只授权指定用户访问backup模块
# 认证的用户名与系统帐户无关,在认证文件做配置
## 默认没有这行则表明是匿名用户访问rsync服务器
auth users = rsyncuser
# 指定密码认证文件,格式(虚拟用户名:密码)
secrets file = /etc/rsync.pas
共享模块配置—示例
# 创建 /etc/rsyncd.conf 配置文件(xx,yy,zz改成自己真实ip)
uid = root
gid = root
use chroot = yes
# 设置服务只读--no
ready only = no
# 锁文件
lock file = /var/run/rsync.lock
# 日志
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
# hosts allow 是允许连接的客户端ip
hosts allow = 10.99.xx.0/24 10.99.yy.0/24 10.99.zz.0/24
# 排查目录
exclude = lost+found/
# 启用详细传输日志
transfer logging = yes
# 客户端连接超时
timeout = 900
# 定义个共享模块
[app-image]
# 该模块的注释说明
comment = app-nginx-images rsync
# 客户端读写都将映射到这个目录
path = /mnt/gxyb/upload/pro
# 是否只读=no
read only = no
# 指定认证的用户名
auth users = root
# 认证用户的密码文件
secrets file = /etc/rsyncd_pass/rsyncd.pass
指定了用户后要手动创建用户
如果手动指定了uid和gid,检查本地是否存在该用户,不存在则需要手动创建用户。
# 创建rsync用户
## -s 指定用户的shell
## -M 不要自动建立用户的登入目录。
useradd -s /sbin/nologin rsync -M

生成rsync认证文件
# 创建认证用户
## 账号和密码以:隔开
echo "rsyncuser:pas123" > /etc/rsync.pas
# 设置600权限--必须修改权限
chmod 600 /etc/rsync.pas
修改完配置重启服务端
# 设置服务器配置文件600权限
chmod 600 /etc/rsyncd.conf
# 重启服务端
systemctl restart rsync
配置客户端
# 创建认证用户
## 账号和密码以:隔开
echo "rsyncuser:pas123" > /etc/rsync.pas
# 设置600权限--必须修改权限
chmod 600 /etc/rsync.pas
客户端测试访问
# 查看远程rsync服务器的模块信息
## 如果带有密码,需要账号密码写入:/etc/rsync.pas
rsync rsync://${rsync服务器ip}

# 查看带密码验证的远程rsync服务器的模块内容
rsync rsync://${rsync用户名}@${rsync服务器ip}/${模块名}

非交互式查看共享目录
# 手动指定密码文件
rsync --password-file=/etc/rsync.pas rsync://${rsync用户名}@${rsync服务器ip}/${模块名}
rsync客户端测试同步数据
# 本地目录同步到远程rsync服务器
## -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
## -v, --verbose 详细模式输出
## -z, --compress 对备份的文件在传输时进行压缩处理
## --delete 删除那些接收端还有而发送端已经不存在的文件
rsync -avz --delete --password-file=/etc/rsync.pas /localdata/www/ ${rsync用户名}@${rsync服务器ip}::${模块名}
# 将远程rsync服务器上的模块同步到本地目录
rsync -avz --delete --password-file=/etc/rsync.pas ${rsync用户名}@${rsync服务器ip}::${模块名} /localdata/www/
常用参数–Windows版可能不支持
建议先设置ssh免密
参考: https://www.cnblogs.com/wclwcw/p/8242695.html
https://article.itxueyuan.com/46mBPw
注:部分选项无短格式(如
--exclude),故“选项”列留空。
| 选项 | 全称 | 说明 |
|---|---|---|
-a |
--archive |
归档模式,递归传输并保持所有文件属性(等同于 -rlptgoD) |
-b |
--backup |
当目标文件有变化时,对旧版文件进行备份 |
-v |
--verbose |
详细模式输出 |
-r |
--recursive |
递归处理子目录(同步目录时必需) |
-u |
--update |
仅同步源文件中修改时间比目标新的文件 |
--copy-unsafe-links |
拷贝指向源路径目录树以外的符号链接文件 | |
--safe-links |
忽略指向源路径目录树以外的符号链接文件(默认行为) | |
-e |
--rsh=COMMAND |
指定远程 shell(如 ssh、rsh)用于数据同步 |
-z |
--compress |
传输时压缩文件数据 |
-q |
--quiet |
精简输出模式 |
-h |
--human-readable |
以人类可读单位(如 K、M)显示文件大小 |
-n |
--dry-run |
模拟运行,仅显示将被传输的文件 |
--stats |
显示传输统计信息 | |
--timeout=TIME |
设置 I/O 超时时间(秒) | |
--ignore-existing |
忽略接收端已存在的文件,仅传输新文件 | |
--existing |
仅更新接收端已存在的文件,不传输新文件 | |
--exclude=PATTERN |
排除匹配 PATTERN 的文件/目录 | |
--exclude-from=FILE |
从 FILE 读取排除规则 | |
--include=PATTERN |
包含匹配 PATTERN 的文件/目录 | |
--include-from=FILE |
从 FILE 读取包含规则 | |
--backup-dir=DIR |
与 -b 一起使用,将备份文件存入指定 DIR |
|
--link-dest=DIR |
若文件未变,基于 DIR 创建硬链接(节省空间) | |
--list-only |
仅列出文件,不进行实际复制 | |
--rsync-path=PROGRAM |
指定远程服务器上 rsync 可执行文件的路径 | |
--port=PORT |
指定 rsync 服务端口(非 SSH 方式) | |
--log-format=FORMAT |
指定日志格式 | |
--password-file=FILE |
从 FILE 读取密码(用于非交互式认证) | |
--bwlimit=KBPS |
限制 I/O 带宽(单位:KB/s) | |
-4 |
--ipv4 |
强制使用 IPv4 |
-6 |
--ipv6 |
强制使用 IPv6 |
--version |
打印 rsync 版本信息 | |
--help |
显示帮助信息 |
保持权限相关参数
💡 提示:
-a(归档模式)已隐含-rlptgoD,即包含-p、-o、-g、-t、-l、-D等选项(但不包含-H、-S或-P)。
| 选项 | 全称 | 说明 |
|---|---|---|
-p |
--perms |
保持文件权限 |
-o |
--owner |
保持文件属主信息(需 root 权限) |
-g |
--group |
保持文件属组信息 |
-t |
--times |
保持文件修改时间 |
-P |
(无) | 等价于 --partial --progress:断点续传并显示传输进度 |
--partial |
保留因中断未传完的文件,便于后续续传 | |
--progress |
显示文件传输进度 | |
-S |
--sparse |
高效处理稀疏文件(将空数据块转为稀疏块) |
-l |
--links |
保留软链接(符号链接)属性 |
-H |
--hard-links |
保留硬链接关系 |
-D |
(无) | 保持设备文件和特殊文件(仅限 super-user 使用) |
删除相关参数
| 选项 | 全称 | 说明 |
|---|---|---|
-d |
--dirs |
仅传输目录本身,不递归其内容(非递归同步目录) |
--delete |
删除接收端存在但发送端已不存在的文件,用于保持目标与源完全一致(增量全备核心选项) | |
--delete-before |
在传输前删除目标端多余文件(默认行为,适用于确保干净同步) | |
--delete-during |
在传输过程中边同步边删除多余文件(内存效率更高) | |
--delete-after |
在传输完成后再删除多余文件(最安全,可配合 --progress 使用) |
|
--delete-excluded |
同时删除目标端中被 --exclude 排除的文件(谨慎使用) |
|
--delay-updates |
将更新中的文件暂存于临时目录(如 .~tmp~),传输完成后再原子替换,避免中间状态 |
|
--ignore-errors |
即使发生 I/O 错误也继续执行删除操作(通常与 --delete 联用,风险较高) |
💡 使用建议:
- 实现“镜像同步”(目标 ≡ 源):推荐
rsync -av --delete --delete-after。- 避免误删:首次使用
--delete建议先加-n(--dry-run)测试。--delete默认采用--delete-before,可通过显式指定其他策略调整行为。
rsync常用操作
本机中的两个目录同步(最常用)
-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]
scp断点续传–Windows需要使用msys2
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 root@130.10.0.65:/tmp/
rsync快速清空目录下的大量文件
参考: https://www.361way.com/rsync-fast-del-file/4681.html
https://www.jianshu.com/p/b9519e589f62
https://juejin.cn/post/6844903766366371854rsync比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/ /要清空的目录/
清除目标目录的文件–将空目录备份到目标目录
注意:$srcDir结尾不要使用/ ;$desDir结尾要使用/
## -a 以归档模式同步文件,等同于-r、-l、-p、-t、-g、-o选项的组合
## -v 显示详情
## -z 使用压缩
rsync -avz $srcDir $desDir/
Linux删除大文件
# 重定向到 Null 来清空文件内容
> access.log
# 将空字符串的内容重定向到文件
echo > access.log
# 将文件的大小设定为0
truncate -s 0 access.log
# 设定文件大小为26M
# truncate -s 26M access.log
同步yum源到内网
# 开始同步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\
Windows版rsync不能使用ssh
参考: https://blog.miniasp.com/post/2021/12/15/How-to-use-Rsync-with-OpenSSH-for-WindowsWindows版rsync必须使用cwRsync內附的ssh.exe才可以传输.不知道这是一个bug,还是一个特色.
建议还是使用msys2安装rsync吧,
使用xsync脚本优化同步
项目地址: https://gitcode.com/liqiaofei/xsync
将xsync脚本放在~/bin目录下,并赋予可执行权限。
# 创建~/bin目录
mkdir ~/bin
# 下载xsync脚本
wget -P ~/bin/ https://raw.gitcode.com/liqiaofei/xsync/raw/main/xsync
# 赋予xsync可执行权限
chmod +x ~/bin/xsync
# 查看能否检查得到xsync命令
which xsync

添加要同步的主机
vim ~/xsync.txt

xsync脚本内容如下:
项目地址:https://github.com/omaidb/qiaofei_notes/blob/main/shell_code/other/xsync
# 下载最新脚本
wget -c https://raw.githubusercontent.com/omaidb/qiaofei_notes/main/shell_code/other/xsync
需要两端机器都安装rsync,否则会报错。
#!/usr/bin/env bash
# 0.依赖包检查
which rsync >>/dev/null 2>&1 || yum install -y rsync || apt install -y rsync
ls ~/xsync.txt &>/dev/null || touch ~/xsync.txt
# 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"
## -a 表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
## -S 将空序列变成稀疏块
## -H 保留硬链结
## -P 断点续传并打印过程,
rsync -aSHP "$pdir"/"$fname" "$host":"$pdir" # rsync同步文件到远程目录
else
echo "$file" 文件不存在!
fi
done
done
以调试模式运行
# 同步/usr/java/ 目录到 其他机器
## -xv 调试脚本
bash -xv ~/bin/xsync /usr/java/
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)