rsync服务使用

概述

rsync(remote synchronize)是一款开源、快速、多功能的远程和本地文件同步、备份工具,由Andrew Tridgell开发,是类Unix系统默认自带的工具。

核心优势:

  • 增量传输:只发送文件差异部分,不整文件重传,速度极快;
  • 本地 / 远程同步:支持本机目录、ssh 远程服务器同步;
  • 保留文件属性:权限、属主、时间、软硬链接、设备文件;
  • 压缩传输:传输时压缩,节省带宽;
  • 删除冗余文件:可让目标目录与源完全一致;
  • 支持断点续传、过滤文件、限速同步。

rsync工作原理

rsync的高效性来源于其独特的增量传输算法:

  1. 分块校验:将文件分成固定大小的数据块(默认1024字节-65536字节)
  2. 校验和计算:对每个块计算MD5校验和、滚动校验和(rolling checksum)
  3. 差异比对:比对两端文件的校验和,找出差异块
  4. 增量传输:仅传输差异块和指令,接收端重新组装文件

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-detach

Jul 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第一次备份是全量备份,只有在后续备份时才是增量备份的方式

# 基于上一次备份的目录做硬链接,只备份差异部分
rsync -av --link-dest=/backup/last /data/ /backup/$(date +%Y%m%d)/

rsync支持断点续传

-P参数支持断点续传,传输中断后下次继续传输剩余部分。

rsync -avP /data/ /backup/$(date +%Y%m%d)/
posted @ 2026-07-18 12:46  huangSir-devops  阅读(150)  评论(0)    收藏  举报
作者:你的名字
出处:你的博客链接
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。