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)/