概述
rsync(remote synchronize)是一款开源、快速、多功能的远程和本地文件同步、备份工具,由Andrew Tridgell开发,是类Unix系统默认自带的工具。
核心优势:
- 增量传输:只发送文件差异部分,不整文件重传,速度极快;
- 本地 / 远程同步:支持本机目录、ssh 远程服务器同步;
- 保留文件属性:权限、属主、时间、软硬链接、设备文件;
- 压缩传输:传输时压缩,节省带宽;
- 删除冗余文件:可让目标目录与源完全一致;
- 支持断点续传、过滤文件、限速同步。
rsync工作原理
rsync的高效性来源于其独特的增量传输算法:
- 分块校验:将文件分成固定大小的数据块(默认1024字节-65536字节)
- 校验和计算:对每个块计算MD5校验和、滚动校验和(rolling checksum)
- 差异比对:比对两端文件的校验和,找出差异块
- 增量传输:仅传输差异块和指令,接收端重新组装文件
rsync传输模式
rsync主要有三种传输模式
- 本地传输模式:本地文件/目录之间同步
- 远程shell传输模式:通过ssh/rsh通道传输
- 守护进程模式传输:通过rsync daemon服务传输
rsync数据流向
根据数据流向的不同,可以分为两种
- pull:拉取远程数据到本地
- push:将本地数据推送到远程
rsync安装
一般Linux系统中会自带rsync服务,如果没有到话,可以进行安装
CentOS/RHEL系列
yum install -y rsync
Ubuntu/Debian系列
apt install -y rsync
rsync语法及参数
语法:
-
本地同步模式:
rsync [选项] 源路径 目标路径
-
远程同步模式:
本地 → 远程(推送)
rsync [参数] 本地文件 user@远程IP:远程路径
远程 → 本地(拉取)
rsync [参数] user@远程IP:远程路径 本地路径
-
守护进程模式
rsync [参数] user@IP::模块名 本地路径
参数说明:
rsync 常用参数速查表
| 参数 | 完整长参数 | 详细作用说明 | 使用场景 & 示例 |
|---|---|---|---|
-a |
--archive |
归档模式,等价 -rlptgoD;递归同步并完整保留文件所有属性,本地/远程同步日常标配 |
标准同步必带:rsync -avz src/ user@ip:/dst/ |
-r |
--recursive |
递归同步所有子目录及目录内文件 | 单独使用较少,一般被 -a 包含 |
-l |
--links |
保留软链接本身,不跟随软链接同步真实文件 | 备份程序目录、配置软链接环境 |
-p |
--perms |
保留文件读写执行权限(rwx权限位) | 服务器配置、脚本备份,避免权限丢失 |
-t |
--times |
保留文件原始修改时间戳 | 日志、代码备份,方便对比文件变更 |
-g |
--group |
保留文件归属用户组 | 多用户服务器、业务数据同步 |
-o |
--owner |
保留文件属主(仅root用户生效) | 系统全盘备份、服务器迁移 |
-D |
--devices --specials |
保留设备文件、管道、套接字等特殊文件 | 系统完整镜像备份 |
-v |
--verbose |
详细输出,打印同步文件、操作日志 | 日常调试,查看哪些文件被同步 |
-vv |
--verbose --verbose |
超详细日志,输出底层校验、传输细节 | 同步异常、丢文件排错专用 |
-z |
--compress |
文件传输过程中压缩,降低带宽消耗 | 远程ssh同步必加;本地同步无需 |
--delete |
- | 严格对齐目录:删除目标目录存在、源目录不存在的文件/目录;镜像同步核心参数 | 定时镜像备份、发布文件同步 示例:rsync -avz --delete src/ dst/ |
--exclude=xxx |
- | 排除指定文件/目录,支持通配符 | 排除日志、缓存:--exclude=logs/ --exclude=*.tmp |
--exclude-from=file |
- | 从外部文本文件读取多条排除规则,批量过滤 | 大量过滤规则时使用:--exclude-from=/etc/rsync.exclude |
--include=xxx |
- | 强制包含指定文件;必须配合 --exclude 使用,规则顺序生效 |
排除目录但保留指定后缀:--include=*.conf --exclude=* |
--progress |
- | 实时显示单文件传输进度、传输速度、已传输大小 | 大文件同步、长时间备份查看状态 |
--bwlimit=10000 |
- | 传输带宽限速,单位KB/s;示例10000=10MB/s | 业务高峰期备份,避免占满带宽 |
-e ssh |
--rsh=ssh |
指定使用ssh作为远程传输通道;rsync远程同步默认ssh,可省略 | 自定义ssh端口必须搭配使用 |
-e "ssh -p 2222" |
- | ssh自定义端口连接远程服务器 | 远程主机ssh非22端口:rsync -avz -e "ssh -p 2222" src user@ip:/dst |
--size-only |
- | 仅对比文件大小判断是否同步,忽略修改时间戳;不校验时间 | 网络波动大、海量小文件快速同步 |
-n / --dry-run |
--dry-run |
模拟试运行,仅打印将要执行的操作,不真实修改目标文件 | 生产执行前校验规则、防止误删,强烈推荐先测试 |
虽然参数很多,但是实际常用的只有下面几个
- -a
- -v
- -z
- --progress
- -n
实战案例:
本地同步模式
-
将etc传输到/data00/rsync目录下
进行传输,我这里第一次进行传输是全量备份
root@master:~# rsync -avz --progress /etc /data00/rsync/
查看
root@master:~# ll /data00/rsync/
total 12
drwxr-xr-x 119 root root 12288 Jul 9 17:59 etc -
测试对其目录,测试--delete到使用
在/data00/rsync/etc/目录下创建test1.txt文件,然后使用rsync --delete进行传输查看test1.txt文件是否会被删除
root@master:~# touch /data00/rsync/etc/test1.txt
root@master:~# rsync -avz --progress --delete /etc /data00/rsync/
sending incremental file list
deleting etc/test1.txt
etc/
etc/sysop/juno/log/juno.log
5,110,947 100% 112.63MB/s 0:00:00 (xfr#1, to-chk=423/2557)
etc/sysop/juno/temp/healthd2/kernel_log_seq
7 100% 0.16kB/s 0:00:00 (xfr#2, to-chk=410/2557)
etc/sysop/mongoosev3-agent/log/mongoosev3-agent.log
222,852 100% 4.72MB/s 0:00:00 (xfr#3, to-chk=377/2557)
etc/sysop/mongoosev3-agent/plugin/driver/driver.log
2,317,928 100% 27.98MB/s 0:00:00 (xfr#4, to-chk=254/2557)
etc/sysop/network/10.37.97.56/default.20260715_1.log
6,579,780 100% 51.43MB/s 0:00:00 (xfr#5, to-chk=183/2557)
etc/sysop/network/10.37.97.56/error.20260714_0.log
883,926 100% 6.53MB/s 0:00:00 (xfr#6, to-chk=172/2557)sent 645,309 bytes received 532 bytes 1,291,682.00 bytes/sec
total size is 455,738,694 speedup is 705.65发现文件已经没有了
root@master:~# ll /data00/rsync/etc/test1.txt
ls: cannot access '/data00/rsync/etc/test1.txt': No such file or directory
远程push模式
这里默认你的ssh端口都是22,且配置好了ssh密钥认证
远程push模式就是将本地文件推送到远程服务器中
-
将本地etc目录推送到远程/data00/rsync目录下
传输
root@master:~# rsync -avz --progress /etc root@10.37.99.63:/data00/rsync/
查看远程的文件
root@master:~# ssh root@10.37.99.63 'ls -l /data00/rsync/'
total 12
drwxr-xr-x 119 root root 12288 Jul 9 17:59 etc -
假设你的端口不是22,需要指定端口
-e "ssh -p 2222" 指定ssh端口
rsync -avz --progress -e "ssh -p 2222" /local/ root@10.37.99.63:/remote/
远程pull模式
这里默认你的ssh端口都是22,且配置好了ssh密钥认证
远程pull模式就是将远程文件拉取到本地
-
将远程/etc目录拉取到本地
root@master:~# rsync -avz --progress root@10.37.99.63:/etc /data00/rsync/
检查本地文件
root@master:~# ll /data00/rsync/
total 4
drwxr-xr-x 113 root root 4096 Jul 10 15:41 etc
补充,rsync远程连接服务器时指定密钥或者密码
rsync 远程传输底层依赖 ssh,分两种场景:密钥免密登录(推荐)、密码自动输入(不推荐,仅临时使用)
指定密钥传输
rsync默认读取本地/root/.ssh/id_rsa文件,如果是其它密钥文件,可以使用-e "ssh -i 私钥路径" 指定私钥
注意事项:
- 私钥文件权限必须严格:chmod 600 /root/.ssh/id_rsa_bak,否则 ssh 拒绝使用;
- 私钥路径写绝对路径,避免相对路径识别失败;
- 远程服务器 ~/.ssh/authorized_keys 需填入私钥对应的公钥,实现免密。
示例,携带私钥进行传输
rsync -avz --progress -e "ssh -i /root/.ssh/id_rsa_bak" /data/file.tar root@192.168.1.200:/backup/
示例,携带私钥及端口进行传输
# -p 指定ssh端口,-i 指定私钥,写在同一个ssh参数内
rsync -avz --delete -e "ssh -p 2222 -i /root/.ssh/id_rsa_bak" /data/src/ root@192.168.1.200:/data/dst/
指定密码进行传输
指定密码需要借用sshpass工具
-
下载sshpass工具
CentOS/RHEL
yum install sshpass -y
Ubuntu/Debian
apt install sshpass -y
-
直接输入密码
直接明文写密码(不建议生产,命令历史会留存密码)
sshpass -p "你的SSH密码" rsync -avz [其他参数] -e ssh 源 user@ip:目标
示例,指定密码
sshpass -p "Admin@123" rsync -avz --progress /data/logs/ root@192.168.1.100:/log_bak/
自定义端口+密码
sshpass -p "Admin@123" rsync -avz -e "ssh -p 2222" /data/ root@192.168.1.100:/dst/
-
安全优化,将密码放到文件中,避免明文出现在命令行
echo "Admin@123" > /tmp/ssh.pwd
chmod 600 /tmp/ssh.pwd-f 读取文件内密码
sshpass -f /tmp/ssh.pwd rsync -avz /data/ root@192.168.1.100:/dst/
守护进程模式
守护进程 daemon 模式可以理解成rsync 独立后台服务,端口 873,不依赖ssh端口,也不依赖 ssh 账号,适合定时批量备份,分为服务端 (daemon) 和客户端。
守护进程模式优势:
- 权限隔离:单独模块控制读写,不暴露系统账号
- 限速、只读、IP 黑白名单、访问密码独立管理
- 支持匿名 / 密码认证,大量服务器集中备份场景首选
- 独立 873 端口,可防火墙单独放行
守护进程配置步骤
守护进程配置比较复杂,下面来进行配置
服务器配置:
- rsync服务端:备份的机器,也就是将文件推送到这台机器上进行备份
- rsync客户端:需要备份到机器,该机器上的文件需要推送到服务端
服务端配置步骤:
-
服务端下载安装rsync
CentOS/RHEL
yum install rsync -y
Ubuntu/Debian
apt install rsync -y
-
服务端修改配置文件
root@master:~# cat /etc/rsyncd.conf
全局配置字段
#用户名
uid = rsync用户组
gid = rsync
是否使用root传输,yes表示是,no表示否
use chroot = no
只读开启/关闭,true表示开启,false表示关闭
read only = false
最大连接数
max connections = 2000
超时时间
timeout = 600
pid文件
pid file = /var/run/rsyncd.pid
并发锁文件
lock file = /var/run/rsync.lock
日志文件
log file = /var/log/rsyncd.log
是否忽略error
ignore errors
允许列出模块列表,false代表不允许,true代表允许
list = false
访问验证用户(虚拟账号,非系统用户)
auth users = rsync_backup
密码文件
secrets file = /etc/rsync.password
允许访问客户端IP,多个逗号分隔,0.0.0.0/0全部放行
hosts allow = 10.37.0.0/16
拒绝客户端IP访问
hosts deny = 0.0.0.0/0
自定义模块【data】客户端访问标识
[data]
# 模块注释
comment = huangsir devops rsyncd study
# 同步根目录(真实服务器路径)
path = /data00/rsync/rsyncd
单独模块是否只读,优先级高于全局
read only = false
不允许删除文件(按需开启)
refuse options = delete
-
服务端创建备份目录、创建用户
创建目录,和配置文件中的自定义模块backup中的path对齐
root@master:~# mkdir -p /data00/rsync/rsyncd
创建用户,和配置文件中的uid对齐
root@master:~# useradd rsync -M -s /sbin/nologin
检查用户是否存在
root@master:~# id rsync
uid=2005(rsync) gid=2006(rsync) groups=2006(rsync)给目录授权
root@master:~# chown rsync:rsync -R /data00/rsync/rsyncd/
检查
root@master:~# stat /data00/rsync/rsyncd/
File: /data00/rsync/rsyncd/
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fe10h/65040d Inode: 8129044 Links: 2这里已经改变了
Access: (0755/drwxr-xr-x) Uid: ( 2005/ rsync) Gid: ( 2006/ rsync)
Access: 2026-07-15 14:24:20.403479958 +0800
Modify: 2026-07-15 14:20:43.432593738 +0800
Change: 2026-07-15 14:24:20.403479958 +0800
Birth: - -
服务端创建rsync密码文件并修改权限
密码文件固定为rsync.password,其里面的内容为[用户名:密码]
用户名为配置文件中的auth users 配置的用户名,是个虚拟账号
root@master:~# echo 'rsync_backup:1' >> /etc/rsync.password
root@master:~# cat /etc/rsync.password
rsync_backup:1修改文件的访问权限权限
root@master:~# chmod 600 /etc/rsync.password
root@master:~# ll /etc/rsync.password
-rw------- 1 root root 15 Jul 15 14:27 /etc/rsync.password -
启动rsyncd服务,并检查端口是否开启
root@master:~# systemctl start rsync
检查状态
root@master:~# systemctl status rsync
● rsync.service - fast remote file copy program daemon
Loaded: loaded (/lib/systemd/system/rsync.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2026-07-15 14:29:41 CST; 10s ago
Docs: man:rsync(1)
man:rsyncd.conf(5)
Main PID: 2810502 (rsync)
Tasks: 1 (limit: 9830)
Memory: 272.0K
CGroup: /system.slice/rsync.service
└─2810502 /usr/bin/rsync --daemon --no-detachJul 15 14:29:41 master systemd[1]: Started fast remote file copy program daemon.
检查端口
root@master:~# ss -lntup | grep 873
tcp LISTEN 0 5 0.0.0.0:873 0.0.0.0:* users:(("rsync",pid=2810502,fd=3))
tcp LISTEN 0 5 [::]:873 [::]:* users:(("rsync",pid=2810502,fd=5))
tcp LISTEN 0 128 [::]:32873 [::]:* users:(("rpc.mountd",pid=735389,fd=19)) -
服务端本地测试执行
语法 rsync [选项] [文件路径] 虚拟账号名@远程IP::[自定义模块名称]
root@master:~# rsync -avz --progress /etc/hostname rsync_backup@10.37.97.56::data
Password: # 这里输入文件中的密码
sending incremental file list
hostname
7 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)sent 101 bytes received 43 bytes 57.60 bytes/sec
total size is 7 speedup is 0.05
客户端操作
-
客户端下载rsync
CentOS/RHEL
yum install rsync -y
Ubuntu/Debian
apt install rsync -y
-
创建客户端密码文件并修改权限
root@node01:~# echo '1' >> /etc/rsync.client.password
root@node01:~# chmod 600 /etc/rsync.client.password -
客户端使用
语法 rsync [选项] [本地文件路径] 虚拟账号名@远程IP::[自定义模块名称]
--password-file=/etc/rsync.client.password 指定密码文件
root@node01:~# rsync -avz --progress /etc rsync_backup@10.37.97.56::data --password-file=/etc/rsync.client.password
rsync使用注意事项
目录路径后带/和不带/的区别(坑点)
目录路径后带上/,表示传输该目录下的文件及目录下的子目录,不包括该目录。
例如传输/etc时,如果路径中写的是/etc/,那么传送到目标主机上的仅仅是/etc/下的所有文件,不包含/etc这个目录,如果是/etc,那么则包含/etc
示例:
-
目录路径后不带/
/etc后没有带/传输
root@node01:~# rsync -avz --progress /etc root@10.37.97.56:/data00/rsync/
查看远程主机
root@node01:~# ssh root@10.37.97.56 'ls -l /data00/rsync'
total 8
drwxr-xr-x 113 root root 4096 Jul 15 14:35 etc -
目录路径后带/
/etc后带/传输
root@node01:~# rsync -avz --progress /etc/ root@10.37.97.56:/data00/rsync/查看远程主机,发现将/etc/下的文件都传过去了,没有etc目录
root@node01:~# ssh root@10.37.97.56 'ls -l /data00/rsync'
total 972
drwxr-xr-x 3 root root 4096 Feb 4 2024 acpi
-rw-r--r-- 1 root root 2981 Sep 8 2023 adduser.conf
-rw-r--r-- 1 root root 197 Feb 4 2024 aliases
drwxr-xr-x 2 root root 4096 Apr 13 14:51 alternatives
drwxr-xr-x 3 root root 4096 Feb 4 2024 apache2
drwxr-xr-x 3 root root 4096 Sep 8 2023 apm
drwxr-xr-x 2 root root 4096 Sep 8 2023 apparmor
#....后面还有很多文件
rsync第一次传输是全量
rsync第一次备份是全量备份,只有在后续备份时才是增量备份的方式
可以搭配--link-dest参数实现增量快照备份:
# 基于上一次备份的目录做硬链接,只备份差异部分
rsync -av --link-dest=/backup/last /data/ /backup/$(date +%Y%m%d)/
rsync支持断点续传
-P参数支持断点续传,传输中断后下次继续传输剩余部分。
rsync -avP /data/ /backup/$(date +%Y%m%d)/