rsync增量备份

8090 字
40 分钟
rsync增量备份

rsync增量备份#

[TOC]


概述#

  1. rsync是个服务也是命令

  2. 它既支持全量备份也支持增量备份

    ==传输数据的时候是增量备份==

  3. 使用方便,有多种模式

  • 全量备份:无论多少数据==全部==推送走 cp每次都是全量备份

  • 增量备份:只会把==修改,新建==了的文件传输走

    • 缺点:
      • 小文件较多的情况下消耗大量的内存
        • 在业务的低谷期进行备份
      • 同步数据前消耗比较大

❤️不管是全量还是增量复制,他们的第一次备份都是全量复制

scp全量备份#

✅ 全量拷贝 scp 默认执行的是 全量拷贝 ,即每次拷贝都会 重新传输(覆盖) 整个文件或目录

🔒 加密拷贝

  • scp 使用 SSH 协议进行数据传输,所有传输的数据(包括文件内容、用户名、密码等)都经过加密,确保安全性
  • 底层依赖 SSH 的加密机制,防止中间人攻击和窃听
  • 常配合 ssh免密 使用

常见选项

  • ==-r==:递归复制 整个目录目录下的文件

/home ,或者 /home/ 用的着

  • ==-P==:( 大写的P ),指定ssh端口

🎧因为它是基于 ssh协议 进行传输的,如果服务器修改了 22端口 ,我们就需要更改对应的 ssh服务的端口号​

ssh 命令使用 小写的p 选项来指定端口

Terminal window
# 更改ssh服务 端口号 后的数据传输
[root@nfs ~]#scp /home/nfs.txt 172.16.1.41:/tmp
ssh: connect to host 172.16.1.41 port 22: Connection refused
lost connection
# 默认连接22端口,但是我的backup.41服务器ssh端口改为了2222
[root@nfs ~]#scp -P 2222 /home/nfs.txt 172.16.1.41:/tmp
# -P指定ssh服务端口
Authorized users only. All activities may be monitored and reported.
root@172.16.1.41's password: # 输入root密码'
nfs.txt 100% 0 0.0KB/s 00:00

scp 命令在跨主机拷贝时 文件属主(ownership)和权限 的行为:

Terminal window
# 在主机 A 上执行命令:
scp 1.txt test@B:/home/test/
'scp 不会保留源文件的属主信息'
1.主机 B 上存在用户 test
2.在目标主机 B 上,文件是由 登录用户 test 创建/写入的,因此新文件的属主就是 test:test
如果你尝试:
scp 1.txt test@B:/root/
❗会报错:Permission denied
# 普通用户 test 没有在/root/目录写入的权限!

🍔上传 or 下载​

Terminal window
# 本地复制上传到远程主机(推)
scp /本地/文件 user@远程IP:/远程/目录/
# 从远程主机复制下载到本地(拉)
scp user@远程IP:/远程/文件 /本地/目录/

⛵关于 后面有详细的介绍​

实例:#

1️⃣环境准备​

Terminal window
1.backup备份服务器
[root@backup ~]#rm -rf /home/*
[root@backup ~]#cd /home
[root@backup home]#ll
total 0
# 先来到备份服务器,把/home/下的文件全部删除掉
2.nfs服务器
[root@nfs ~]#cd /home
[root@nfs home]#ll
total 0
[root@nfs home]#touch oldboy{1..5}.txt
[root@nfs home]#ll
total 0
-rw-r--r-- 1 root root 0 Jan 15 09:46 oldboy1.txt
-rw-r--r-- 1 root root 0 Jan 15 09:46 oldboy2.txt
-rw-r--r-- 1 root root 0 Jan 15 09:46 oldboy3.txt
-rw-r--r-- 1 root root 0 Jan 15 09:46 oldboy4.txt
-rw-r--r-- 1 root root 0 Jan 15 09:46 oldboy5.txt

2️⃣三种不同的形式

  1. ==*号== 目录下的所有文件
Terminal window
[root@nfs home]#scp /home/* root@backup:/home/

image-20260115095533894
image-20260115095533894

  1. ==/home/== 同步一整个目录
Terminal window
# 同步前先把backup服务中/home里面的文件全部都删除了
[root@backup home]#rm -rf /home/*
[root@backup home]#ll
total 0

image-20260115101808547
image-20260115101808547

image-20260115101059838
image-20260115101059838

  1. ==/home== 同上,也是同步整个目录

❤️先删除之前backup服务器中的文件,rm -rf /home/*

image-20260115101649716
image-20260115101649716

image-20260115102014028
image-20260115102014028

小结:

  • 在scp中你传 /home 和 /home/ 是一样的

    都是带上这个home目录,以及目录下的内容

    需要加上 -r 这个选项

  • /home/* 它只传送了home目录下的所有文件,并没有目录

在rsync中,它的 /home 和 /home/ 不一样,前者带上这个目录+目录下内容,后者只有目录下的内容

==在rsync中,尽量避免使用/home/*,会有隐藏的bug== 特别是在多层目录加文件的时候,和—delete中

rsync增量备份#

①本地模式#

  • 类似于cp命令,但是rsync是增量的 了解即可,本地模式不经常用

-avz#

==rsync -avz== 是常用的命令组合,各选项含义如下:

  1. -a(归档模式):包含递归同步、保留权限/时间戳/属主/属组等 一个**-a**等同于好多选项

image-20260115104605082
image-20260115104605082

  1. -v:显示同步过程的详细信息
  2. -z(压缩):传输时压缩数据,减少网络带宽占用
Terminal window
[root@backup ~]#rm -rf /opt/*
[root@backup ~]#rm -rf /home/*
# 先清空这两个文件夹里面的内容
[root@backup ~]#touch /home/1.txt
[root@backup ~]#rsync -avz /home/ /opt
# 两个/:只传输目录下的文件,不传目录
sending incremental file list
./
1.txt
# 这里明显看出来只传了一个文件
sent 103 bytes received 38 bytes 282.00 bytes/sec
total size is 0 speedup is 0.00
[root@backup ~]#ll /opt/
total 0
-rw-r--r-- 1 root root 0 Jan 15 12:34 1.txt
# 也确实只有一个1.txt文件
# 接着创建第二个文件
[root@backup ~]#touch /home/2.txt
[root@backup ~]#rsync -avz /home/ /opt
sending incremental file list
./
2.txt
# 因为是增量备份所以只传输了2.txt
sent 125 bytes received 38 bytes 326.00 bytes/sec
total size is 0 speedup is 0.00
[root@backup ~]#ll /opt/
total 0
-rw-r--r-- 1 root root 0 Jan 15 12:34 1.txt
-rw-r--r-- 1 root root 0 Jan 15 12:36 2.txt
[root@backup ~]#rsync -avz /home /opt
# 这次是只有一个/,它传输目录及目录下的所有文件
sending incremental file list
home/
home/1.txt
home/2.txt
sent 175 bytes received 58 bytes 466.00 bytes/sec
total size is 0 speedup is 0.00
[root@backup ~]#ll /opt/
total 0
-rw-r--r-- 1 root root 0 Jan 15 12:34 1.txt
-rw-r--r-- 1 root root 0 Jan 15 12:36 2.txt
drwxr-xr-x 2 root root 32 Jan 15 12:36 home
# 这个目录就是刚才传输过来的
[root@backup ~]#ll /opt/home/
total 0
-rw-r--r-- 1 root root 0 Jan 15 12:34 1.txt
-rw-r--r-- 1 root root 0 Jan 15 12:36 2.txt

image-20260115130539215
image-20260115130539215

小结:

  • 在rsync中 /home 和 /home/ 不同,前者带上这个目录+目录下的文件,后者只有目录下的内容
  • /home/*/home/==不等价==,在下面—delete案例有体现,还有多层目录及文件中 ==尽量不用==,用/home/来替代它

②远程命令模式#

作用:服务器和服务器之间的数据传输

👑选项通用,后面的选项,我们也能用​

  • 可以将本地服务器的文件上传到其他服务器上**(推)**
  • 也可以将其他服务器上的数据下载到本地服务器上**(拉)**

image-20260115225051117
image-20260115225051117

命令拆分:rsync -avz /home/* root@backup:/home/

  • root # 对方的root用户*(此用户必须存在于远程服务器上)*

如果不跟用户名,则用和nfs服务器当前登录一样的用户 nfs当前登录的是root,推送至backup服务器上时,也用root用户操作backup服务器

  • @ # 分隔符必须得有

  • backup # 远程服务器的IP地址,域名,主机名称(可以ping通)

这里映射出来的IP为10.0.0.41,但最好用内网IP地址,172.16.1.41,速度快一点

  • : # 后面写路径

❤️**提问:*如果我们把root用户改为oldboy普通用户,还能进行数据的推送吗? rsync -avz /home/ oldboy@172.16.1.41:/home/

  • 在nfs上操作,上传到backup服务器上
Terminal window
1.backup服务器上创建用户,并给个密码
[root@backup ~]#useradd oldboy
[root@backup ~]#echo "oldboy123.com" | passwd --stdin oldboy
Changing password for user oldboy.
passwd: Authentication token manipulation error
# 这条命令格式没有问题,为什么会报错呢???
# 因为在kylin中,用户的密码不能包含用户名oldboy
[root@backup ~]#echo "heima123.com" | passwd --stdin oldboy
Changing password for user oldboy.
passwd: all authentication tokens updated successfully.
# 这次就成功了,successfully
2.nfs服务器中
[root@nfs ~]#rm -rf /home/*
[root@nfs ~]#touch /home/{1..5}.txt
[root@nfs ~]#rsync -avz /home/* oldboy@172.16.1.41:/home/
Authorized users only. All activities may be monitored and reported.
oldboy@172.16.1.41's password: '
# 这里输入的是oldboy用户的密码
sending incremental file list
1.txt
2.txt
3.txt
4.txt
5.txt
rsync: mkstemp "/home/.1.txt.ybev06" failed: Permission denied (13)
rsync: mkstemp "/home/.2.txt.rGQyz1" failed: Permission denied (13)
rsync: mkstemp "/home/.3.txt.A0EC8V" failed: Permission denied (13)
rsync: mkstemp "/home/.4.txt.3szGHQ" failed: Permission denied (13)
rsync: mkstemp "/home/.5.txt.5syKgL" failed: Permission denied (13)
sent 292 bytes received 471 bytes 89.76 bytes/sec
total size is 0 speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1189) [sender=3.1.3]
# 很明显在报错,权限不足???

这里是推送至backup服务器中,换句话说是在backup服务器中创建一摸一样的文件,以什么样的身份创建?

  • oldboy的身份

oldboy在/home目录下的并没有创建文件的权限

  • 因为/home目录的权限为rwxr-xr-x,oldboy为局外人只有r-x,没有目录的w权限,自然是不能创建文件的

❤️提问:拉取过程中,把root用户改为oldboy普通用户,还能进行拉取吗

rsync -avz oldboy@172.16.1.41:/home/* /home/

  • 拉取backup服务器里面的内容,到nfs服务器中
Terminal window
1.backup服务器
[root@backup ~]#rm -rf /home/*
[root@backup ~]#touch /home/{1..3}.txt
2.nfs服务器
[root@nfs ~]#rm -rf /home*
[root@nfs ~]#rsync -avz oldboy@172.16.1.41:/home/* /home/
Authorized users only. All activities may be monitored and reported.
oldboy@172.16.1.41's password: '
Could not chdir to home directory /home/oldboy: No such file or directory
receiving incremental file list
created directory /home
1.txt
2.txt
3.txt
sent 81 bytes received 188 bytes 31.65 bytes/sec
total size is 0 speedup is 0.00
[root@nfs ~]#ll /home/
total 0
-rw-r--r-- 1 root root 0 Jan 15 23:38 1.txt
-rw-r--r-- 1 root root 0 Jan 15 23:38 2.txt
-rw-r--r-- 1 root root 0 Jan 15 23:38 3.txt
# 非常成功的拉取下来了

我们来分析一下:

  • backup服务器中这些被创建的文件(root创建)的权限为rw-r—r—

  • oldboy为局外人,只有r—权限,

    文件能被读,就能够被复制

    拉取的本质,就是从backup服务器中复制到本地

③守护进程模式#

image-20260116085636497
image-20260116085636497

  • rsync守护进程模式(即作为服务运行)提供服务时,默认监听 端口 873

  • 我们推送数据的时候,不使用root用户,不安全

    添加虚拟用户

  • 下面我们先介绍 服务端 的安装与配置

1️⃣安装部署#

Terminal window
1.安装,更新
yum install -y rsync
# 这里重新安装就相当于是更新
# 不要在服务使用的过程中更新
2.检查是否安装
[root@backup ~]#rpm -aq rsync
rsync-3.1.3-7.ky10.x86_64
# 有内容就是安装成功了的
3.查看软件包安装的文件及其路径
[root@backup ~]#rpm -ql rsync
/etc/rsyncd.conf
# rsync服务的配置文件,也是守护进程的配置文件
/usr/bin/rsync
# 二进制命令的路径

2️⃣配置#

image-20260116101747483
image-20260116101747483

  1. fake super = yes

    伪装成root权限 让 rsync 在没有 root 权限的情况下,尽可能模拟具有超级用户权限的行为,以便保留文件的完整属性

  2. use chroot = no

    默认是yes,我们这里不启用chroot 安全部分的功能,都交给防火墙和VPN

  3. list = false

    关闭列表功能,不允许查看模块信息

  4. port = 873

    默认就是873,可以忽略不写

  5. timeout = 600

    连接超时的时间,客户端超过这个时间自动断开连接,单位是s秒

  6. hosts allow = 172.16.1.0/24

    只允许某个网段的访问

  7. hosts deny = IP/掩码

    禁止某个网段的访问

  8. 模块名字随便起,后面传输数据时 IP::模块名

    [data] #就表示我创建了一个小的地区和模块 模块里面还要指定目录,path 模块名目录名最好保持一致

  • use chroot = yes(默认值) rsync daemon 在处理客户端请求前,会调用 chroot() 系统调用 并将工作目录切换到模块指定的 path 目录,并将其作为新的根目录(/) ✅ 这能有效防止用户访问该目录之外的文件系统路径,是一种安全加固措施

假如我们 path = /data

场景启用 chroot (yes)禁用 chroot (no)
客户端能否访问模块外文件❌ 完全隔离✅ 可能通过符号链接等方式访问
示例:尝试访问**/etc**实际访问的是**/data/etc**直接访问系统根目录下的**/etc**
  • 我们在配置的时候,NO就行 安全部分的功能,都交给防火墙和VPN
Terminal window
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file =/var/log/rsyncd.log
############################
[backup]
comment = Welcome to oldboyedu backup!
path = /backup
  • 这个配置文件写在 backup服务器备份服务器)中,用于客户端的备份 /etc/rsyncd.conf

👑根据配置文件创建必要的信息

  1. 运行用户:rsync
Terminal window
[root@backup ~]#id rsync
id: ‘rsync’: no such user
[root@backup ~]#groupadd -g 123 rsync
[root@backup ~]#useradd -g 123 -s /sbin/nologin -M rsync
# 虚拟用户
[root@backup ~]#id rsync
uid=1002(rsync) gid=123(rsync) groups=123(rsync)
  1. 验证用户:rsync_backup

    无需创建

Terminal window
# 我们通过rsync_backup用户进行验证登录
# 所以我们需要一个密码文件来存放rsync_backup用户的密码
[root@backup ~]#echo "rsync_backup:123" > /etc/rsync.passwd
[root@backup ~]#cat /etc/rsync.passwd
rsync_backup:123
# 这个格式是前面是验证用户名:后面才是密码
# 它的密码是123
[root@backup ~]#ll /etc/rsync.passwd
-rw-r--r-- 1 root root 17 Jan 16 15:46 /etc/rsync.passwd
# 密码文件很危险,r--局外人还可以看到,不安全
# 如果不修改密码文件的权限,则rsync服务就会认为这个密码文件错误,服务起不来
# 所以一定要重新给密码文件赋权
[root@backup ~]#chmod 600 /etc/rsync.passwd
# 默认是644
====================
不需要修改属主!就是root
🚫 rsync 的安全策略(strict modes)规定:当 daemon root 启动时,secrets file 必须由 root 拥有,且权限为 600。否则会拒绝读取,导致认证失败!
====================
[root@backup ~]#ll /etc/rsync.passwd
-rw------- 1 root root 17 Jan 16 15:46 /etc/rsync.passwd
  • 验证用户:rsync_backup对应着配置文件中的auth users

  • 这个密码文件,相当于客户端登录的暗号

    对应着配置文件中的secrets file

    这两个文件名一定要对的上,/etc/password != /etc/passwd

    这个密码文件为rsync_backup验证用户的密码而并非rsync运行用户的密码

  • 运行用户:rsync 对应着配置文件中的uid和gid

    虚拟用户,不需要登录,也就不需要密码

    通过这个用户把传过来的数据,写入到 path = /backup 目录中

  1. 创建模块对应的path路径 用来存放数据的文件夹
Terminal window
[root@backup ~]#mkdir /backup
[root@backup ~]#ll -d /backup/
drwxr-xr-x 2 root root 6 Jan 16 16:08 /backup/
# 由root用户创建,目录默认属主属组为root
# 而我们的运行用户是rsync,它为局外人,r-x权限不足,没有x权限,自然没有办法在这个目录下创建文件
# 修改/backup目录的属主属组为启动用户rsync
[root@backup ~]#chown -R rsync:rsync /backup
[root@backup ~]#ll -d /backup/
drwxr-xr-x 2 rsync rsync 6 Jan 16 16:08 /backup/
# 现在属主属组就为rsync了
  1. 日志文件同上
Terminal window
[root@backup ~]#touch /var/log/rsyncd.log
[root@backup ~]#chown -R rsync:rsync /var/log/rsyncd.log
[root@backup ~]#ll /var/log/rsyncd.log
-rw-r--r-- 1 rsync rsync 0 Jan 16 16:18 /var/log/rsyncd.log

3️⃣启动#

重新启动,并安排开机自启动

服务名为rsyncd

Terminal window
[root@backup ~]#systemctl restart rsyncd
[root@backup ~]#systemctl enable rsyncd
Created symlink /etc/systemd/system/multi-user.target.wants/rsyncd.service /usr/lib/systemd/system/rsyncd.service.
[root@backup ~]#systemctl status rsyncd
rsyncd.service - fast remote file copy program daemon
Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; enabled; vendor preset: disab>
Active: active (running) since Fri 2026-01-16 16:32:31 CST; 28s ago
Main PID: 1795 (rsync)
Tasks: 1
Memory: 700.0K
CGroup: /system.slice/rsyncd.service
└─1795 /usr/bin/rsync --daemon --no-detach

4️⃣测试#

Terminal window
1.查看服务器是否运行873端口
[root@backup ~]#netstat -lntuo | grep 873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN off (0.00/0/0)
tcp6 0 0 :::873 :::* LISTEN off (0.00/0/0)
2.服务端本地测试
[root@backup ~]#rsync -av /etc/passwd rsync_backup@172.16.1.41::backup
Password:
sending incremental file list
passwd
# 只传送一个文件
sent 2,028 bytes received 43 bytes 828.40 bytes/sec
total size is 1,932 speedup is 0.93
[root@backup ~]#ll /backup/passwd
-rw-r--r-- 1 rsync rsync 1932 Jan 16 15:41 /backup/passwd
# 有这个文件,说明我们这里服务端配置成功
# 合理运用日志文件
[root@backup ~]#cat /var/log/rsyncd.log
2026/01/16 17:37:04 [2210] rsync to backup/ from rsync_backup@backup (172.16.1.41)
2026/01/16 17:37:04 [2210] receiving file list
2026/01/16 17:37:05 [2210] sent 48 bytes received 113 bytes total size 7
3.客户端进行测试
# 使用nfs服务器进行测试
[root@nfs ~]#rsync -av /etc/hosts rsync_backup@172.16.1.41::backup
Password:
sending incremental file list
hosts
sent 458 bytes received 43 bytes 200.40 bytes/sec
total size is 363 speedup is 0.72
# 服务端进行验证
[root@backup ~]#ll /backup/hosts
-rw-r--r-- 1 rsync rsync 363 Jan 10 21:46 /backup/hosts
[root@backup ~]#cat /var/log/rsyncd.log
2026/01/16 17:48:01 [2278] rsync to backup/ from rsync_backup@nfs (172.16.1.31)
# 来自nfs服务器的数据
2026/01/16 17:48:01 [2278] receiving file list
2026/01/16 17:48:01 [2278] sent 48 bytes received 466 bytes total size 363

5️⃣优化#

每传输一次都要输一遍验证用户密码?

❤️客户端免密方式连接服务端 —password-file=/etc/rsync_passwd.txt

  • 客户端密码文件只需要存储密码 123 即可
Terminal window
1.我们先把密码写入一个文件里面
[root@nfs ~]#echo 123 > /etc/rsync_passwd.txt
[root@nfs ~]#cat /etc/rsync_passwd.txt
123
# backup中的密码文件中的内容为rsync_backup:123
[root@nfs ~]#ll /etc/rsync_passwd.txt
-rw-r--r-- 1 root root 4 Jan 16 19:25 /etc/rsync_passwd.txt
[root@nfs ~]#chmod 600 /etc/rsync_passwd.txt
[root@nfs ~]#ll /etc/rsync_passwd.txt
-rw------- 1 root root 4 Jan 16 19:25 /etc/rsync_passwd.txt
# 不能让局外人有r读的权限,不然rsync会直接报错
[root@nfs ~]#rsync -avz /etc/hostname rsync_backup@172.16.1.41::backup --password-file=/etc/rsync_passwd.txt
sending incremental file list
hostname
# 成功传送过去
sent 98 bytes received 43 bytes 282.00 bytes/sec
total size is 4 speedup is 0.03
2.服务端验证:
[root@backup ~]#ll /backup/hostname
-rw-r--r-- 1 rsync rsync 4 Jan 11 02:34 /backup/hostname

6️⃣流程图#

image-20260116193325616
image-20260116193325616

Rocky_10作业#

任务 4:日志备份脚本编写

  • 在 A服务端 编写脚本,完成以下功能:
    • 打包 /var/log/ 下的日志文件,并排除所有 .tmp 临时文件
    • 打包时保留原始文件权限和属性
    • 使用 rsync 将备份文件增量传输到 B客户端 的 /backup/ 目录
    • 本地保留最近 7 天的备份,自动清理过期文件
Note
  • name: Install rsync daemon yum: name: rsync-daemon state: present

  • 装完 systemctl start ==rsyncd== 就能起来了

    • Rocky 如果不装这个包,需要 rsync —daemon —> 以守护进程的方式启动!
Terminal window
'服务端'
[root@R39 ~]# groupadd -g888 www
[root@R39 ~]# useradd -M -s /sbin/nologin -g888 -u888 www
useradd warning: www's uid 888 outside of the UID_MIN 1000 and UID_MAX 60000 range.'
[root@R39 ~]# id www
uid=888(www) gid=888(www) groups=888(www)
# 先创建用户!
[root@R39 ~]# egrep -v '^$|^#' /etc/rsyncd.conf
uid = www
gid = www
fake super = yes
use chroot = yes
max connections = 4
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
read only = false
list = false
timeout = 900
ignore nonreadable = yes
hosts allow = 10.0.0.0/24
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup]
comment = jiuzhao!!!
path = /backup
# 根据配置文件创建必要的信息!!!!
[root@R39 ~]# touch /var/log/rsyncd.log
[root@R39 ~]# mkdir /backup
[root@R39 ~]# echo rsync_backup:123 > /etc/rsync.password
[root@R39 ~]# chown www:www /var/log/rsyncd.log
[root@R39 ~]# chown www:www /backup/
[root@R39 ~]# chown www:www /etc/rsync.password
[root@R39 ~]# chmod 600 /etc/rsync.password
[root@R39 ~]# ll /etc/rsync.password
-rw------- 1 www www 17 Mar 14 10:47 /etc/rsync.password
# 服务的启动
[root@R39 ~]# rsync --daemon
# 以守护进程的方式启动!
[root@R39 ~]# ps aux | grep rsync | grep -v grep
root 3549 0.0 0.0 233936 2524 ?Ss 11:01 0:00 rsync --daemon
# 查看进程
[root@R39 ~]# ss -lntup | grep rsync
tcp LISTEN 0 5 0.0.0.0:873 0.0.0.0:* users:(("rsync",pid=3549,fd=5))
tcp LISTEN 0 5 [::]:873 [::]:* users:(("rsync",pid=3549,fd=6))
# 查看服务
[root@R39 ~]# cat /var/run/rsyncd.pid
3549
# 这里是它的进程id
问题:如何重启服务???
[root@R39 ~]# kill -1 $(cat /var/run/rsyncd.pid)
[root@R39 ~]# cat /var/run/rsyncd.pid
cat: /var/run/rsyncd.pid: No such file or directory
[root@R39 ~]# rsync --daemon
[root@R39 ~]# cat /var/run/rsyncd.pid
3606
# 进程号发生改变,服务重启!
[root@R39 ~]# tail -1 /var/log/rsyncd.log
2026/03/14 11:15:29 [3719] rsyncd version 3.4.1 starting, listening on port 873
# 通过日志我们也可以看出来,成功启动了!
# 本地测试
[root@R39 ~]# rsync -avz /etc/passwd rsync_backup@10.0.0.139::backup
Password:
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1850) [sender=3.4.1]
# 报错!
====================================
报错正常,我们来看一下日志!
[root@R39 ~]# tail /var/log/rsyncd.log
2026/03/14 11:28:23 [3834] rsyncd version 3.4.1 starting, listening on port 873
# 成功启动!
2026/03/14 11:28:48 [3838] connect from R39 (10.0.0.139)
# 来自 (10.0.0.139)的连接
2026/03/14 11:28:48 [3838] rsync allowed access on module backup from R39 (10.0.0.139)
# 允许 (10.0.0.139)进入[backup]模块
2026/03/14 11:28:50 [3838] secrets file must be owned by root when running as root (see strict modes)
# 到这开始报错了!密码文件应该属于root
🚫 rsync 的安全策略(strict modes)规定:当 daemon root 启动时,secrets file 必须由 root 拥有,且权限为 600。否则会拒绝读取,导致认证失败!
2026/03/14 11:28:50 [3838] auth failed on module backup from R39 (10.0.0.139) for rsync_backup: ignoring secrets file
====================================
[root@R39 ~]# ll /etc/rsync.password
-rw------- 1 www www 17 Mar 14 10:47 /etc/rsync.password
# 我的启动用户是www
[root@R39 ~]# chown root:root /etc/rsync.password
[root@R39 ~]# ll /etc/rsync.password
-rw------- 1 root root 17 Mar 14 10:47 /etc/rsync.password
# 属主改为root
[root@R39 ~]# kill -1 $(cat /var/run/rsyncd.pid)
[root@R39 ~]# rsync --daemon
# 重启
[root@R39 ~]# tail -1 /var/log/rsyncd.log
2026/03/14 11:32:54 [3857] rsyncd version 3.4.1 starting, listening on port 873
# 成功启动起来!
[root@R39 ~]# rsync -avz /etc/passwd rsync_backup@10.0.0.139::backup
Password:
sending incremental file list
passwd
sent 1,073 bytes received 43 bytes 318.86 bytes/sec
total size is 2,240 speedup is 2.01
# ✅成功传输!
Terminal window
'客户端'
[root@R11 ~]# mkdir -p /server/sh/
[root@R11 sh]# mkdir /data
# 用于存放压缩包,利于rsync传输
[root@R11 ~]# cd /server/sh/
[root@R11 sh]# vim log_back.sh
#!bin/bash
# author:鲲鹏云
# goal:打包备份
#1.打包压缩
tar -zcpf /data/all.tar.gz --exclude='*.tmp' /var/log &>/dev/null
echo '打包成功'
#2.创建指纹文件
cd /data/
md5sum ./all.tar.gz > ./fingerprint.md5
echo '创建指纹成功'
cd /server/sh/
#3.推送至服务端
echo 123 >/root/rsync.passwd
# 先生成本地密码文件
chmod 600 /root/rsync.passwd
# 更改权限
rsync -avz /data/ rsync_backup@10.0.0.139::backup --password-file=/root/rsync.passwd >/dev/null
# 用这个密码文件可以实现免密登录
echo '成功推送至服务端'
#4.清理备份文件
find /data -name "*.tar.gz" -type f -mtime +7 | xargs rm -rf
echo 'over...successful!!!'
[root@R11 sh]# ll -lh /server/sh/
total 4.0K
-rw-r--r-- 1 root root 671 Mar 14 12:18 log_back.sh
[root@R11 sh]# sh log_back.sh
打包成功
创建指纹成功
成功推送至服务端
over...successful!!!
# 客户端运行脚本!
'服务端验证'
[root@R39 backup]# rm -rf ./*
[root@R39 backup]# ll
total 0
[root@R39 backup]# ls -lh
total 1.4M
-rw-r--r-- 1 www www 1.4M Mar 14 12:56 all.tar.gz
-rw-r--r-- 1 www www 47 Mar 14 12:56 fingerprint.md5
  • 备份验证

在 B客户端 验证备份文件完整性

Terminal window
[root@R39 backup]# md5sum -c fingerprint.md5
./all.tar.gz: OK
[root@R39 backup]# tar -tf all.tar.gz
var/log/
var/log/private/
var/log/wtmp
......
var/log/vmware-network.log
# 查看压缩包内容
[root@R39 backup]# tar -tf all.tar.gz | grep '.*tmp$'
var/log/wtmp
var/log/btmp
# 以tmp结尾
'这里是因为.点没有被\转义'
[root@R39 backup]# tar -tf all.tar.gz | grep '.*\.tmp$'
# 再次过滤,它是没有以.tmp结尾了文件的
[root@R39 backup]# ll /tmp/var/
total 4
drwxr-xr-x 13 root root 4096 Mar 14 09:35 log
[root@R39 backup]# ll /tmp/var/log/
total 4156
drwxr-xr-x 2 root root 4096 Mar 2 19:31 anaconda
......
-rw------- 1 root root 379 Mar 10 14:00 vmware-network.6.log
-rw------- 1 root root 193 Mar 5 10:54 vmware-network.7.log
[root@R39 backup]# find /tmp/var/log/ -name "*.tmp"
# 也没有以.tmp结尾的文件!

④扩展选项#

Terminal window
-r #递归传输目录及子目录
-P #这个就是显示完成了进度,百分号100%
#大写的P
--password-file #指定密码文件
--bwlimit=500kb #限速,默认单位为kb
--exclude #(相对路径)排除文件,不备份这些文件
--delete #以当前主机为准(推): 目标和我一致
#以目标主机为准(拉): 目标有啥我有啥
#总结来说就是谁在前面以谁为准
1.显示进度,限速并传输
[root@nfs ~]#dd if=/dev/zero of=/tmp/1g bs=10M count=100
# 创建指定大小的文件
100+0 records in
100+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 3.01887 s, 347 MB/s
[root@nfs ~]#rsync -avzP --bwlimit=500 /tmp/1g root@172.16.1.41:/tmp
# 默认是限速kb
Authorized users only. All activities may be monitored and reported.
root@172.16.1.41's password: '
sending incremental file list
1g
344,040,200 32% 60.67MB/s 0:00:11
2.排除文件
[root@nfs ~]#rm -rf /tmp/*
[root@nfs ~]#touch /tmp/{1..5}.txt
[root@nfs ~]#rsync -avz /tmp/* rsync_backup@172.16.1.41::backup --password-file=/etc/rsync_passwd.txt --exclude=2.txt
sending incremental file list
1.txt
3.txt
4.txt
5.txt
# 并没有传输2.txt
==============
# 改为--exclude=/tmp/2.txt后,不起作用,以/tmp/路径为起点(相对路径)
==============
3.--delete
[root@backup ~]#rm -f /backup/*
# 删除服务端backup目录下的所有文件
# nfs客户端
[root@nfs ~]#rm -rf ./*
[root@nfs ~]#mkdir oldboy
[root@nfs ~]#touch ./oldboy/{1..5}.txt
[root@nfs ~]#rsync -avz ./oldboy rsync_backup@172.16.1.41::backup --password-file=/etc/rsync_passwd.txt
sending incremental file list
oldboy/
oldboy/1.txt
oldboy/2.txt
oldboy/3.txt
oldboy/4.txt
oldboy/5.txt
# 传输的是目录及目录下的文件
sent 334 bytes received 123 bytes 914.00 bytes/sec
total size is 0 speedup is 0.00
[root@nfs ~]#\rm ./oldboy/3.txt
# 客户端删除oldboy目录的3.txt
[root@nfs ~]#ll ./oldboy/
total 0
-rw-r--r-- 1 root root 0 Jan 16 21:40 1.txt
-rw-r--r-- 1 root root 0 Jan 16 21:40 2.txt
-rw-r--r-- 1 root root 0 Jan 16 21:40 4.txt
-rw-r--r-- 1 root root 0 Jan 16 21:40 5.txt
# backup服务端
[root@backup ~]#ll /backup/
total 0
drwxr-xr-x 2 rsync rsync 71 Jan 16 21:40 oldboy
[root@backup ~]#ll /backup/oldboy/
total 0
-rw-r--r-- 1 rsync rsync 0 Jan 16 21:40 1.txt
-rw-r--r-- 1 rsync rsync 0 Jan 16 21:40 2.txt
-rw-r--r-- 1 rsync rsync 0 Jan 16 21:40 3.txt
-rw-r--r-- 1 rsync rsync 0 Jan 16 21:40 4.txt
-rw-r--r-- 1 rsync rsync 0 Jan 16 21:40 5.txt
[root@backup ~]#\rm /backup/oldboy/1.txt
# 删除服务端的1.txt
[root@backup ~]#ll /backup/oldboy/
total 0
-rw-r--r-- 1 rsync rsync 0 Jan 16 21:40 2.txt
-rw-r--r-- 1 rsync rsync 0 Jan 16 21:40 3.txt
-rw-r--r-- 1 rsync rsync 0 Jan 16 21:40 4.txt
-rw-r--r-- 1 rsync rsync 0 Jan 16 21:40 5.txt
分析:现在客户端有1,2,4,5.txt 服务端有2,3,4,5.txt
# 客户端--delete,(推)和本地保持一致
[root@nfs ~]#rsync -avz ./oldboy rsync_backup@172.16.1.41::backup --password-file=/etc/rsync_passwd.txt --delete
sending incremental file list
deleting oldboy/3.txt
oldboy/
oldboy/1.txt
# 删除远程服务器的3.txt,同步自己的1.txt
sent 181 bytes received 63 bytes 488.00 bytes/sec
total size is 0 speedup is 0.00
# 远程服务器验证
[root@backup ~]#ll /backup/oldboy/
total 0
-rw-r--r-- 1 rsync rsync 0 Jan 16 21:40 1.txt
-rw-r--r-- 1 rsync rsync 0 Jan 16 21:40 2.txt
-rw-r--r-- 1 rsync rsync 0 Jan 16 21:40 4.txt
-rw-r--r-- 1 rsync rsync 0 Jan 16 21:40 5.txt
# backup目录下的文件和客户端的./oldboy目录下的文件保持一致

—delete保持一致#

image-20260116231017486
image-20260116231017486

  • 下面演示的是远程命令模式,它并没有复杂的服务端的配置 选项通用
Terminal window
1.环境准备
# 备份服务器
[root@backup ~]#mkdir /code
[root@backup ~]#mkdir /code/vide
[root@backup ~]#touch /code/index.html
[root@backup ~]#touch /code/vide/1.html
[root@backup ~]#tree /code/
/code/
├── index.html
└── vide
└── 1.html
# 线上服务器
[root@nfs ~]#mkdir /code
[root@nfs ~]#mkdir /code/vide
[root@nfs ~]#touch /code/c.html
[root@nfs ~]#touch /code/vide/c.html
[root@nfs ~]#tree /code
/code
├── c.html
└── vide
└── c.html
# c.html
# 网页都被污染了
# 我们在备份服务器上实现(推)操作
[root@backup ~]#rsync -avz /code root@172.16.1.31:/code --delete
Authorized users only. All activities may be monitored and reported.
root@172.16.1.31's password: '
sending incremental file list
code/
code/index.html
code/vide/
code/vide/1.html
# /code,这次传输的是目录及目录下的文件
sent 217 bytes received 66 bytes 37.73 bytes/sec
total size is 0 speedup is 0.00
# 验证一下
[root@nfs ~]#tree /code
/code
├── c.html
├── code
│   ├── index.html
│   └── vide
│   └── 1.html
└── vide
└── c.html
# 很明显是不对的,传输的是目录,而不是资源的替换
[root@backup ~]#rsync -avz /code/* root@172.16.1.31:/code --delete
Authorized users only. All activities may be monitored and reported.
root@172.16.1.31's password: '
sending incremental file list
index.html
deleting vide/c.html
vide/
vide/1.html
# /code/*尽量不用,有隐藏bug
sent 197 bytes received 81 bytes 50.55 bytes/sec
total size is 0 speedup is 0.00
# 验证一下
[root@nfs ~]#tree /code/
/code/
├── c.html
├── code
│   ├── index.html
│   └── vide
│   └── 1.html
├── index.html
└── vide
└── 1.html
# 只替换了一部分,而且并没有保持一致,而且看起来更乱了
1.第一种方法
[root@backup ~]#rsync -avz /code/ root@172.16.1.31:/code --delete
Authorized users only. All activities may be monitored and reported.
root@172.16.1.31's password: '
sending incremental file list
deleting code/vide/1.html
deleting code/vide/
deleting code/index.html
deleting code/
deleting c.html
./
# 尽量用/code/来取代/code/*
sent 135 bytes received 92 bytes 41.27 bytes/sec
total size is 0 speedup is 0.00
# 验证一下
[root@nfs ~]#tree /code/
/code/
├── index.html
└── vide
└── 1.html
# 这次非常成功,和备份服务器保持一致
2.第二种方法
# 前面依旧是/code但变的在后面,/
# 也就是在根目录中把code目录整个同步过来
[root@backup ~]#rsync -avz /code root@172.16.1.31:/ --delete
Authorized users only. All activities may be monitored and reported.
root@172.16.1.31's password: '
sending incremental file list
deleting code/code/vide/1.html
deleting code/code/vide/
deleting code/code/index.html
deleting code/code/
deleting code/c.html
code/
code/index.html
deleting code/vide/c.html
code/vide/
code/vide/1.html
# 删除冗余的文件,把自己的备份过去
# 往前放
sent 221 bytes received 183 bytes 89.78 bytes/sec
total size is 0 speedup is 0.00
# 验证一下
[root@nfs ~]#tree /code
/code
├── index.html
└── vide
└── 1.html

全网备份案例#

image-20260117103207528
image-20260117103207528

image-20260117103217810
image-20260117103217810

image-20260117103236274
image-20260117103236274

1️⃣服务端的配置与调试#

  1. 虚拟用户rsync的创建

    先创建组,再创建用户

  2. 验证用户rsync_backup的密码文件

    存在于服务端,注意格式,修改权限

  3. 模块中的目录

    创建出来后,修改属主和属组 日志文件同理

  4. 重新启动服务

    服务名为rsyncd,多了一个d

  5. 测试

    先本地测试,在客户端测试

2️⃣客户端配置与脚本#

  1. 先进行优化 创建验证用户rsync_backup的密码文件,格式只有密码,最后修改权限

  2. 脚本的编写

    创建脚本目录及文件 mkdir /server/scripts/ touch /server/scripts/back_conf.sh

❤️我们这里为了演示方便,继续将nfs服务器作为客户端​

#!bin/bash
#author: jiuzhao996
#desc: 客户端打包,备份,同步
ip=`hostname -I | awk '{print $1}'`
time=`date +"%F"`
dir=/backup/${ip}
file=conf-${time}.tar.gz
#1.创建目录
mkdir -p ${dir}
#2.打包压缩
tar zcvf ${dir}/${file} /etc/hosts
#3.推送至服务端
rsync -avz ${dir} rsync_backup@172.16.1.41::backup --password-file=/etc/rsync_passwd.txt
#4.清理缓存
find ${dir} -name "*.tar.gz" -type f -mtime +7 | xargs rm -f
  1. 脚本测试
Terminal window
1.先清理backup服务端的文件
[root@backup ~]#rm -rf /backup/*
2.测试脚本(客户端进行测试)
[root@nfs ~]#sh /server/scripts/back_conf.sh
tar: Removing leading `/' from member names'
# 第一条不用管他,它的意思就是去除/根目录
/etc/hosts
# 变为etc/hosts
sending incremental file list
10.0.0.31/
10.0.0.31/conf-2026-01-17.tar.gz
sent 388 bytes received 47 bytes 870.00 bytes/sec
total size is 243 speedup is 0.56
# 在测试的过程中,会有一些报错什么的,自己去适当的修改自己的脚本文件
3.服务端验证
[root@backup ~]#tree /backup/
/backup/
└── 10.0.0.31
└── conf-2026-01-17.tar.gz
# 按照我们想要的格式传输过来了
  1. 加入定时任务
Terminal window
1.写入定时任务
# 这里是客户端的脚本加入自己的定时任务中
# 我们选用root用户的定时任务
[root@nfs ~]#crontab -l
*/1 * * * * sh /server/scripts/back_conf.sh &>/dev/null
# 执行脚本的时候有输出,在定时任务中,可以选择 &>/dev/null
# 也可以追加到一个自己创建的文件中,比如给这个脚本来个日志文件,&>/var/log/back_rsync.log
2.定时任务验证
# 服务端
[root@backup ~]#rm -rf /backup/*
[root@backup ~]#tree /backup/
/backup/
└── 10.0.0.31
└── conf-2026-01-17.tar.gz
# 删除之后,隔一分钟就又会备份过来了
3.修改定时任务时间
[root@nfs ~]#crontab -l
00 03 * * * sh /server/scripts/back_conf.sh &>/dev/null
# 每天凌晨3点执行一次

3️⃣服务端清理与统计​#

Terminal window
[root@backup ~]#tree /backup/
/backup/
└── 10.0.0.31
└── conf-2026-01-17.tar.gz
[root@backup ~]#find /backup -type f -name '*.tar.gz'
/backup/10.0.0.31/conf-2026-01-17.tar.gz
[root@backup ~]#find /backup -type f -name '*.tar.gz' | xargs ls -lh
-rw-r--r-- 1 rsync rsync 243 Jan 17 11:17 /backup/10.0.0.31/conf-2026-01-17.tar.gz
[root@backup ~]#find /backup -type f -name '*.tar.gz' | xargs ls -lh | awk -F'[ /]+' '{print $(NF-1),$NF,$5}'
10.0.0.31 conf-2026-01-17.tar.gz 243
# 续航符;(撬棍)\
# 强制换行
[root@backup ~]#find /backup -type f -name '*.tar.gz' |\
> xargs ls -lh |\
> awk -F'[ /]+' '{print "IP地址:"$(NF-1)" 文件名:"$NF" 文件大小:"$5}'
IP地址:10.0.0.31 文件名:conf-2026-01-17.tar.gz 文件大小:243
# 有这个“双引号”可以替代,(逗号)
# 但不建议这样写,下面这种方式更简明,而并方便扩展
[root@backup ~]#find /backup -type f -name '*.tar.gz' |\
> xargs ls -lh |\
> awk -F'[ /]+' 'BEGIN{print "IP地址","文件名","文件大小"}{print $(NF-1),$NF,$5}'|\
> column -t
IP地址 文件名 文件大小
10.0.0.31 conf-2026-01-17.tar.gz 243
# 为了后面方便我们发邮件,将统计的结果写入到一个文件中
#!/bin/bash
#author:jiuzhao996
#desc:备份服务器清理,统计
#1.清理旧的备份
find ${backup_dir} -type f -name '*.tar.gz' -mtime +30 |xargs rm -f
# 这里备份服务器我们保存30天
#2.统计备份文件
find /backup -type f -name '*.tar.gz' |\
xargs ls -lh |\
awk -F'[ /]+' 'BEGIN{print "IP地址","文件名","文件大小"}{print $(NF-1),$NF,$5}'|\
column -t >/server/scripts/result.txt
# 这里写入到一个文件中去了
#3.发送邮箱
mail -s "每日备份结果" jiuzhao996@qq.com</server/scripts/result.txt
  1. vim /server/scripts/back_to_mail.sh

    脚本文件

  2. 邮件的配置,在笔记“定时任务”那一块,这里不过多赘述了

  3. 脚本的测试

  4. 写入定时任务

    验证,和修改时间

🌿②和③客户端也有详细的流程,都大差不差,这里也不展开说了

image-20260117125512496
image-20260117125512496

[root@backup ~]#crontab -l 00 03 * * * sh /server/scripts/back_to_mail.sh &>/dev/null

👑结果:

image-20260117125912350
image-20260117125912350

4️⃣指纹校验#

image-20260117115329372
image-20260117115329372

md5校验详细的教学,在笔记用户管理这一块

Terminal window
1.客户端配置
# 当我们tar压缩完之后,给.tar.gz压缩文件做指纹
[root@nfs ~]#tree /backup/
/backup/
└── 10.0.0.31
└── conf-2026-01-17.tar.gz
[root@nfs ~]#md5sum /backup/10.0.0.31/conf-2026-01-17.tar.gz > /backup/10.0.0.31/fingerprint.md5
# 这个压缩包在对应主机目录下
# 用的是>覆盖写,也就是一直都是这个指纹文件,只不过每天里面的内容不同罢了
# 一定要使用绝对路径
# 这个指纹文件也在对应主机目录下
[root@nfs ~]#tree /backup/
/backup/
└── 10.0.0.31
├── conf-2026-01-17.tar.gz
└── fingerprint.md5
2.客户端脚本的重新量化

image-20260117133101141
image-20260117133101141

因为这个指纹文件,也同样在dir对应的主机IP目录下,备份的时候连着它也会被备份走

#!bin/bash
#author: jiuzhao996
#desc: 客户端打包,备份,同步
ip=`hostname -I | awk '{print $1}'`
time=`date +"%F"`
dir=/backup/${ip}
file=conf-${time}.tar.gz
#1.创建目录
mkdir -p ${dir}
#2.打包压缩
tar zcvf ${dir}/${file} /etc/hosts
#2.5指纹文件
md5sum ${dir}/${file} > ${dir}/fingerprint.md5
#3.推送至服务端
rsync -avz ${dir} rsync_backup@172.16.1.41::backup --password-file=/etc/rsync_passwd.txt
#4.清理缓存
find ${dir} -name "*.tar.gz" -type f -mtime +7 | xargs rm -f
Terminal window
3.服务端的配置
# 同样只需要一条命令,找出备份目录/backup下的所有指纹文件,并校验
[root@backup ~]#find /backup/ -name 'fingerprint.md5' | xargs md5sum -c
/backup/10.0.0.31/conf-2026-01-17.tar.gz: OK
# 命令有输出,可以写入到/server/scripts/result.txt
# 后面发邮件的时候,连同校验结果也发送过去
[root@backup ~]#find /backup/ -name 'fingerprint.md5' | xargs md5sum -c >>/server/scripts/result.txt
# 这里是>>追加,不是覆盖写
[root@backup ~]#cat /server/scripts/result.txt
IP地址 文件名 文件大小
10.0.0.31 conf-2026-01-17.tar.gz 243
/backup/10.0.0.31/conf-2026-01-17.tar.gz: OK
4.服务端脚本优化

image-20260117140329771
image-20260117140329771

#!/bin/bash
#author:jiuzhao996
#desc:备份服务器清理,统计
result_file=/server/scripts/result.txt
#1.清理旧的备份
find ${backup_dir} -type f -name '*.tar.gz' -mtime +30 |xargs rm -f
# 这里备份服务器我们保存30天
#2.统计备份文件
find /backup -type f -name '*.tar.gz' |\
xargs ls -lh |\
awk -F'[ /]+' 'BEGIN{print "IP地址","文件名","文件大小"}{print $(NF-1),$NF,$5}'|\
column -t >${result_file}
# 这里写入到一个文件中去了
#2.5验证指纹文件
find /backup -name 'fingerprint.md5' | xargs md5sum -c >>${result_file}
#3.发送邮箱
mail -s "每日备份结果" jiuzhao996@qq.com<${result_file}

剩下的就是定时任务测试,优化

Terminal window
# 手动测试
# 这里把定时任务注释掉了
1.服务端删除原备份文件
[root@backup ~]#rm -rf /backup/*
2.客户端运行脚本
[root@nfs ~]#sh /server/scripts/back_conf.sh
tar: Removing leading `/' from member names'
/etc/hosts
sending incremental file list
10.0.0.31/
10.0.0.31/conf-2026-01-17.tar.gz
10.0.0.31/fingerprint.md5
3.服务端运行脚本
[root@backup ~]#sh /server/scripts/back_to_mail.sh

image-20260117140556215
image-20260117140556215

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

rsync增量备份
https://www.kpyun.fun/posts/basics/extension/extension09/
作者
久棹
发布于
2025-09-29
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
久棹
只要胆子大,天天寒暑假!
公告
欢迎来到久棹的技术小站!本站专注 Linux 运维学习笔记分享,如有问题欢迎交流探讨 🎉
分类
标签
站点统计
文章
98
分类
11
标签
203
总字数
244,453
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录