0.前言
最近在做gitlab仓库代码多机异地备份方案,之前远程拷贝文件一直使用的是scp命令,这次想使用rsync文件同步命令,于是乎又重新学习测试了rsync命令,备份、部署、迁移、内容分发等方面都很好用,简直就是运维神器。这里就记录一下rsync命令的原理和详细的使用案例,希望能够帮助更多的人了解rsync命令。
1.rsync简介
rsync(remote sync) 是一个快速且功能强大的文件同步工具,支持本地与远程同步,采用“增量同步算法”,仅同步变化部分,性能非常高效。
rsync核心优势:
-
增量同步:只传输变更部分,节省带宽
-
支持压缩:可减少传输数据量
-
支持多种协议:本地、SSH、rsync 守护进程等
-
拥有断点续传、权限保留、删除同步等高级特性
rsync还能在两种模式下运行:
-
命令行模式(push/pull):使用 rsync 命令手动或定时执行同步。
-
服务端守护模式(daemon):以守护进程方式运行,支持匿名或认证客户端访问共享模块。
2.rsync工作原理
- 利用 “rsync算法” 比较源与目标文件内容,只传输差异数据块。
- 使用 SSH、RSH 或 rsync 协议 作为传输通道。
这种“块级差异传输 + 校验算法”机制,让 rsync 同步比 cp/scp 更高效、稳定,尤其适用于大文件、慢网速、跨地部署等场景。
3.实验准备
本次实验,我们使用两台服务器来测试rsync的功能,服务器配置如下:
| IP | 主机名 | 角色 | 操作系统 |
|---|---|---|---|
| 192.168.159.172 | server | 源服务器 | Rocky Linux release 9.4 |
| 192.168.159.173 | backup | 备份服务器 | Rocky Linux release 9.4 |
我们本次测试将源服务器的文件同步到备份服务器当中。
4.安装rsync
默认情况下最小模式安装的Rocky9 Linux操作系统是没有rsync命令的,所以首先我们安装一下,安装命令如下:
yum install -y rsync
...
Installed:
rsync-3.2.5-3.el9.x86_64
Complete!
显示以上字样,说明安装完成。
5.rsync命令行
首先我们先来看下rsync的命令行模式,该模式下只需要使用rsync命令并指定相应参数,就可以完成文件的拷贝。
5.1 基本语法
rsync [选项] 源文件 目标文件
5.2 常用参数
| 选项 | 全称 | 说明 |
|---|---|---|
| -a | --archive | 归档模式,保留所有文件属性(相当于 -rlptgoD) |
| -v | --verbose | 显示详细传输信息 |
| -z | --compress | 传输时压缩数据 |
| -r | --recursive | 递归复制目录 |
| -l | --links | 保留符号链接 |
| -p | --perms | 保留文件权限 |
| -t | --times | 保留文件修改时间 |
| -g | --group | 保留文件所属组 |
| -o | --owner | 保留文件所有者 |
| -D | --devices | 保留设备文件(仅限超级用户) |
| -h | --human-readable | 以人类可读格式输出数字 |
| --progress | 显示传输进度 | |
| --delete | 删除目标中源没有的文件 | |
| --exclude=PATTERN | 排除匹配 PATTERN 的文件 | |
| --include=PATTERN | 包含匹配 PATTERN 的文件 |
5.3 常用的命令形式
本地同步:
rsync -av /path/to/source/ /path/to/destination/
从本地同步到远程:
rsync -avz /local/path/ username@remote_host:/remote/path/
从远程同步到本地:
rsync -avz username@remote_host:/remote/path/ /local/path/
5.4 实际操作案例
我们创建一个测试目录,并生成一些测试文件,命令如下:
mkdir ~/test
mkdir ~/test2
cd ~/test
echo aaa > a.txt
echo bbb > b.txt
echo ccc > c.txt
(1)本地同步(目录)
rsync -av ~/test/ ~/test2/
sending incremental file list
./
a.txt
b.txt
c.txt
看下test2目录下的内容:
ls test2
total 12
-rw-r--r-- 1 root root 4 Jan 15 11:22 a.txt
-rw-r--r-- 1 root root 4 Jan 15 11:22 b.txt
-rw-r--r-- 1 root root 4 Jan 15 11:22 c.txt
可以看到,这种方式会将test目录整个拷贝到test2目录下。
(2)从本地同步到远端
在源服务器执行以下命令:
rsync -avz /root/test/ root@192.168.159.173:/root/
sending incremental file list
test/
test/a.txt
test/b.txt
test/c.txt
在备份服务器上看下目录是否存在:
ls /root/test
total 12
-rw-r--r--. 1 root root 4 Jan 15 2026 a.txt
-rw-r--r--. 1 root root 4 Jan 15 2026 b.txt
-rw-r--r--. 1 root root 4 Jan 15 2026 c.txt
可以看到,文件确实拷贝到了备份服务器上。
注意:因为默认使用的rsync协议,两台服务器都要安装rsync,才能保证同步成功,否则会报错。
(4)远端同步到本地
在备份服务器test目录新增文件:
cd ~/test
echo eee > e.log
在源服务器执行以下命令:
rsync -avz root@192.168.159.173:/root/test/ /root/test/
receiving incremental file list
created directory /root/test
./
a.txt
b.txt
c.txt
e.log
sent 103 bytes received 326 bytes 858.00 bytes/sec
total size is 16 speedup is 0.04
查看源服务器test目录:
ls ~/test
total 16
-rw-r--r-- 1 root root 4 Jan 15 11:22 a.txt
-rw-r--r-- 1 root root 4 Jan 15 11:22 b.txt
-rw-r--r-- 1 root root 4 Jan 15 11:22 c.txt
-rw-r--r-- 1 root root 4 Dec 26 21:36 e.log
可以看到新增的e.log文件拷贝到了源服务器。
(5)带过滤的同步
在源服务器test目录新增以下文件:
echo "temp file" > f.tmp
之后在源服务器执行以下命令:
rsync -av --exclude=*.tmp' --execlude="*.log"' ~/test/ ~/test3/
sending incremental file list
created directory /root/test3
a.txt
b.txt
c.txt
sent 238 bytes received 107 bytes 690.00 bytes/sec
total size is 12 speedup is 0.03
最后查看下源服务器的test3目录:
ls ~/test3
total 12
-rw-r--r-- 1 root root 4 Jan 15 11:22 a.txt
-rw-r--r-- 1 root root 4 Jan 15 11:22 b.txt
-rw-r--r-- 1 root root 4 Jan 15 11:22 c.txt
确实没有以tmp和log结尾的文件。
(6)双端保持完全一致
新建一个test3目录,然后添加一个原本test中不存在的文件,命令如下:
mkdir test3
echo hello > test3/h.txt
然后同步test和test3目录并保持双端一致,命令如下:
rsync -av --delete test/ test3/
查看test3目录:
ls test3
total 16
-rw-r--r-- 1 root root 4 Jan 15 11:22 a.txt
-rw-r--r-- 1 root root 4 Jan 15 11:22 b.txt
-rw-r--r-- 1 root root 4 Jan 15 11:22 c.txt
-rw-r--r-- 1 root root 4 Dec 26 21:36 e.log
可以看到目标地址的h.txt文件被删掉了。
5.5 高阶用法
(1)使用SSH自定义端口
rsync -avz -e 'ssh -p 22' test/ root@192.168.159.173:test/
可以按需将22端口改为其他端口。
(2)带宽限制
rsync -avz --bwlimit=500 test/ root@192.168.159.173:test/
可以根据网络带宽需求修改带宽大小。
(3)文件大小限制
rsync -av --min-size=100k test/ test3/
6.服务端守护模式
接下来我们来体验下守护模式的rsync服务。
6.1 修改配置文件
安装rsync之后,会生成/etc/rsyncd.conf配置文件,我们先修改下配置文件:
vim /etc/rsyncd.conf
# 指定rsync守护进程运行时的用户身份(为了安全,一般设为nobody)
uid = nobody
# 指定rsync守护进程运行时的组身份
gid = nobody
# 是否启用chroot(默认是yes),设置为no可避免对文件路径限制,有利于备份大路径结构
use chroot = no
# 最大并发连接数,超出连接将被拒绝,防止资源耗尽
max connections = 20
# rsync守护进程运行时的日志文件
log file = /var/log/rsyncd.log
# PID文件路径,用于进程管理
pid file = /var/run/rsyncd.pid
# 守护进程监听的端口,默认873,确保防火墙已放通
port = 873
# 认证用户,仅这些用户可以访问该模块(对应下面的secrets file)
auth users = root
# 指定认证文件,格式为:用户名:密码,一行一个用户
secrets file = /etc/rsync.password
# 是否启用日志记录同步的文件详细信息
transfer logging = yes
# 设置为只读,客户端只能拉取数据
read only = false
# 是否允许客户端查看该模块(可选
list = yes
# 设置白名单,只允许设置的网段进行访问
hosts allow = 192.168.159.0/24
# 设置黑名单,限制访问
hosts deny = 0.0.0.0/32
# 在进行数据备份传输过程过程中,忽略一些I/O产生的传输错误
ignore errors
[data] # 模块名,客户端使用 ::webdata 来访问这个模块
path = /data/test/files # 实际要共享的本地目录
comment = test files sync # 模块说明,可选
# 可以添加多个模块
指定的data模块对应目录为:/data/test/files,将test目录里面的文件拷贝到该目录下:
cp test/* /data/test/files
6.2 认证文件
配置文件里面我们指定的认证文件为/etc/rsync.password,以下命令可以创建改配置文件:
源服务器执行以下操作:
echo "root:12345678" > /etc/rsync.password
chmod 600 /etc/rsync.password
备份服务器执行以下操作:
echo "12345678" > /etc/rsync.password
chmod 600 /etc/rsync.password
注意:
(1)/etc/rsync.password文件的权限必须为600;
(2)源服务器和备份服务器密码格式不一样;
(3)生产环境的root密码一定要设置的复杂一些。
6.3 systemd管理
创建rsyncd.service文件,使用systemd的方式管理rsyncd服务,命令如下:
cat >> /etc/systemd/system/rsyncd.service << EOF
[Unit]
Description=Rsync Daemon
After=network.target
[Service]
ExecStart=/usr/bin/rsync --daemon --no-detach
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
[Install]
WantedBy=multi-user.target
EOF
启用并启动服务,命令如下:
systemctl daemon-reload
systemctl enable --now rsyncd
6.4 传输测试
以上安装,认证文件生成和systemd管理操作在源服务器和备份服务器执行,都操作完成之后就可以在备份服务器进行传输测试了,命令如下:
rsync -avz --delete --password-file=/etc/rsync.password root@192.168.159.172::data/test/file /data/test/
然后检查下数据目录是否有对应文件:
ll /data/test/
total 16
-rw-r--r--. 1 root root 4 Jan 15 17:18 a.txt
-rw-r--r--. 1 root root 4 Jan 15 17:18 b.txt
-rw-r--r--. 1 root root 4 Jan 15 17:18 c.txt
-rw-r--r--. 1 root root 4 Jan 15 17:18 e.log
可以看到文件同步到了备份服务器上。
7.总结
上述我们对rsync命令行和后台模式进行了详细的讲解,命令行基本可以满足大部分使用需求,而后台模式则可以让我们更好的管理rsync的使用,根据需要创建rsync模块,分配用户和管理权限,如果是定时同步的还可以将以上命令定时执行,合理的使用rsync命令不仅可以取代scp,还可以将备份部署工作事半功倍。
