rsync增量备份

rsync增量备份
[TOC]
概述
rsync是个服务也是命令
它既支持全量备份也支持增量备份
==传输数据的时候是增量备份==
使用方便,有多种模式
-
全量备份:无论多少数据==全部==推送走 cp每次都是全量备份
-
增量备份:只会把==修改,新建==了的文件传输走
- 缺点:
- 小文件较多的情况下消耗大量的内存
- 在业务的低谷期进行备份
- 同步数据前消耗比较大
- 小文件较多的情况下消耗大量的内存
- 缺点:
❤️不管是全量还是增量复制,他们的第一次备份都是全量复制
scp全量备份
✅ 全量拷贝
scp 默认执行的是 全量拷贝 ,即每次拷贝都会 重新传输(覆盖) 整个文件或目录
🔒 加密拷贝
scp使用 SSH 协议进行数据传输,所有传输的数据(包括文件内容、用户名、密码等)都经过加密,确保安全性- 底层依赖 SSH 的加密机制,防止中间人攻击和窃听
- 常配合
ssh免密使用
常见选项
- ==-r==:递归复制
整个目录及目录下的文件
/home,或者/home/用的着
- ==-P==:( 大写的P ),指定ssh端口
🎧因为它是基于
ssh协议进行传输的,如果服务器修改了22端口,我们就需要更改对应的ssh服务的端口号ssh 命令使用
小写的p选项来指定端口
# 更改ssh服务 端口号 后的数据传输[root@nfs ~]#scp /home/nfs.txt 172.16.1.41:/tmpssh: connect to host 172.16.1.41 port 22: Connection refusedlost 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:00scp 命令在跨主机拷贝时 文件属主(ownership)和权限 的行为:
# 在主机 A 上执行命令:scp 1.txt test@B:/home/test/'scp 不会保留源文件的属主信息'1.主机 B 上存在用户 test2.在目标主机 B 上,文件是由 登录用户 test 创建/写入的,因此新文件的属主就是 test:test
如果你尝试:scp 1.txt test@B:/root/❗会报错:Permission denied# 普通用户 test 没有在/root/目录写入的权限!🍔上传 or 下载
# 本地复制上传到远程主机(推)scp /本地/文件 user@远程IP:/远程/目录/
# 从远程主机复制下载到本地(拉)scp user@远程IP:/远程/文件 /本地/目录/⛵关于 推 和 拉 后面有详细的介绍
实例:
1️⃣环境准备
1.backup备份服务器[root@backup ~]#rm -rf /home/*[root@backup ~]#cd /home[root@backup home]#lltotal 0# 先来到备份服务器,把/home/下的文件全部删除掉
2.nfs服务器[root@nfs ~]#cd /home[root@nfs home]#lltotal 0[root@nfs home]#touch oldboy{1..5}.txt[root@nfs home]#lltotal 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.txt2️⃣三种不同的形式
- ==*号== 目录下的所有文件
[root@nfs home]#scp /home/* root@backup:/home/
- ==/home/== 同步一整个目录
# 同步前先把backup服务中/home里面的文件全部都删除了[root@backup home]#rm -rf /home/*[root@backup home]#lltotal 0

- ==/home== 同上,也是同步整个目录
❤️先删除之前backup服务器中的文件,rm -rf /home/*


小结:
在scp中你传 /home 和 /home/ 是一样的
都是带上这个home目录,以及目录下的内容
需要加上
-r这个选项/home/* 它只传送了home目录下的所有文件,并没有目录
在rsync中,它的 /home 和 /home/ 不一样,前者带上这个目录+目录下内容,后者只有目录下的内容
==在rsync中,尽量避免使用/home/*,会有隐藏的bug== 特别是在多层目录加文件的时候,和—delete中
rsync增量备份
①本地模式
- 类似于cp命令,但是rsync是增量的 了解即可,本地模式不经常用
-avz
==rsync -avz== 是常用的命令组合,各选项含义如下:
- -a(归档模式):包含递归同步、保留权限/时间戳/属主/属组等 一个**-a**等同于好多选项

- -v:显示同步过程的详细信息
- -z(压缩):传输时压缩数据,减少网络带宽占用
[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/sectotal 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/ /optsending incremental file list./2.txt# 因为是增量备份所以只传输了2.txtsent 125 bytes received 38 bytes 326.00 bytes/sectotal 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 listhome/home/1.txthome/2.txtsent 175 bytes received 58 bytes 466.00 bytes/sectotal 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.txtdrwxr-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
小结:
- 在rsync中 /home 和 /home/ 不同,前者带上这个目录+目录下的文件,后者只有目录下的内容
/home/*和/home/==不等价==,在下面—delete案例有体现,还有多层目录及文件中 ==尽量不用==,用/home/来替代它
②远程命令模式
作用:服务器和服务器之间的数据传输
👑选项通用,后面的选项,我们也能用
- 可以将本地服务器的文件上传到其他服务器上**(推)**
- 也可以将其他服务器上的数据下载到本地服务器上**(拉)**

推命令拆分: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服务器上
1.backup服务器上创建用户,并给个密码[root@backup ~]#useradd oldboy[root@backup ~]#echo "oldboy123.com" | passwd --stdin oldboyChanging password for user oldboy.passwd: Authentication token manipulation error# 这条命令格式没有问题,为什么会报错呢???# 因为在kylin中,用户的密码不能包含用户名oldboy[root@backup ~]#echo "heima123.com" | passwd --stdin oldboyChanging 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 list1.txt2.txt3.txt4.txt5.txtrsync: 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/sectotal size is 0 speedup is 0.00rsync 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服务器中
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 directoryreceiving incremental file listcreated directory /home1.txt2.txt3.txtsent 81 bytes received 188 bytes 31.65 bytes/sectotal 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服务器中复制到本地
③守护进程模式

当
rsync以 守护进程模式(即作为服务运行)提供服务时,默认监听 端口 873我们推送数据的时候,不使用root用户,不安全
添加虚拟用户
下面我们先介绍 服务端 的安装与配置
1️⃣安装部署
1.安装,更新yum install -y rsync# 这里重新安装就相当于是更新# 不要在服务使用的过程中更新
2.检查是否安装[root@backup ~]#rpm -aq rsyncrsync-3.1.3-7.ky10.x86_64# 有内容就是安装成功了的
3.查看软件包安装的文件及其路径[root@backup ~]#rpm -ql rsync/etc/rsyncd.conf# rsync服务的配置文件,也是守护进程的配置文件/usr/bin/rsync# 二进制命令的路径2️⃣配置

fake super = yes
伪装成root权限 让 rsync 在没有 root 权限的情况下,尽可能模拟具有超级用户权限的行为,以便保留文件的完整属性
use chroot = no
默认是yes,我们这里不启用chroot 安全部分的功能,都交给防火墙和VPN
list = false
关闭列表功能,不允许查看模块信息
port = 873
默认就是873,可以忽略不写
timeout = 600
连接超时的时间,客户端超过这个时间自动断开连接,单位是s秒
hosts allow = 172.16.1.0/24只允许某个网段的访问
hosts deny = IP/掩码禁止某个网段的访问
模块名字随便起,后面传输数据时
IP::模块名[data] #就表示我创建了一个小的地区和模块 模块里面还要指定目录,
path模块名和目录名最好保持一致
use chroot = yes(默认值) rsync daemon 在处理客户端请求前,会调用chroot()系统调用 并将工作目录切换到模块指定的path目录,并将其作为新的根目录(/) ✅ 这能有效防止用户访问该目录之外的文件系统路径,是一种安全加固措施
假如我们 path = /data
| 场景 | 启用 chroot (yes) | 禁用 chroot (no) |
|---|---|---|
| 客户端能否访问模块外文件 | ❌ 完全隔离 | ✅ 可能通过符号链接等方式访问 |
| 示例:尝试访问**/etc** | 实际访问的是**/data/etc** | 直接访问系统根目录下的**/etc** |
- 我们在配置的时候,NO就行 安全部分的功能,都交给防火墙和VPN
uid = rsyncgid = rsyncport = 873fake super = yesuse chroot = nomax connections = 200timeout = 600ignore errorsread only = falselist = falseauth users = rsync_backupsecrets file = /etc/rsync.passwdpid file = /var/run/rsyncd.pidlock file = /var/run/rsync.locklog file =/var/log/rsyncd.log############################[backup]comment = Welcome to oldboyedu backup!path = /backup- 这个配置文件写在
backup服务器(备份服务器)中,用于客户端的备份/etc/rsyncd.conf
👑根据配置文件创建必要的信息
- 运行用户:
rsync
[root@backup ~]#id rsyncid: ‘rsync’: no such user[root@backup ~]#groupadd -g 123 rsync[root@backup ~]#useradd -g 123 -s /sbin/nologin -M rsync# 虚拟用户[root@backup ~]#id rsyncuid=1002(rsync) gid=123(rsync) groups=123(rsync)-
验证用户:
rsync_backup无需创建
# 我们通过rsync_backup用户进行验证登录# 所以我们需要一个密码文件来存放rsync_backup用户的密码[root@backup ~]#echo "rsync_backup:123" > /etc/rsync.passwd[root@backup ~]#cat /etc/rsync.passwdrsync_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目录中
- 创建模块对应的
path路径用来存放数据的文件夹
[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了- 日志文件同上
[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.log3️⃣启动
重新启动,并安排开机自启动
服务名为rsyncd
[root@backup ~]#systemctl restart rsyncd[root@backup ~]#systemctl enable rsyncdCreated 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-detach4️⃣测试
1.查看服务器是否运行873端口[root@backup ~]#netstat -lntuo | grep 873tcp 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::backupPassword:sending incremental file listpasswd# 只传送一个文件sent 2,028 bytes received 43 bytes 828.40 bytes/sectotal 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.log2026/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 list2026/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::backupPassword:sending incremental file listhostssent 458 bytes received 43 bytes 200.40 bytes/sectotal 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.log2026/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 list2026/01/16 17:48:01 [2278] sent 48 bytes received 466 bytes total size 3635️⃣优化
每传输一次都要输一遍验证用户密码?
❤️客户端免密方式连接服务端 —password-file=/etc/rsync_passwd.txt
- 客户端密码文件只需要存储密码
123即可
1.我们先把密码写入一个文件里面[root@nfs ~]#echo 123 > /etc/rsync_passwd.txt[root@nfs ~]#cat /etc/rsync_passwd.txt123# 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.txtsending incremental file listhostname# 成功传送过去sent 98 bytes received 43 bytes 282.00 bytes/sectotal 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/hostname6️⃣流程图

Rocky_10作业
任务 4:日志备份脚本编写
- 在 A服务端 编写脚本,完成以下功能:
- 打包 /var/log/ 下的日志文件,并排除所有 .tmp 临时文件
- 打包时保留原始文件权限和属性
- 使用 rsync 将备份文件增量传输到 B客户端 的 /backup/ 目录
- 本地保留最近 7 天的备份,自动清理过期文件
-
name: Install rsync daemon yum: name: rsync-daemon state: present
-
装完 systemctl start ==rsyncd== 就能起来了
- Rocky 如果不装这个包,需要 rsync —daemon —> 以守护进程的方式启动!
'服务端'[root@R39 ~]# groupadd -g888 www[root@R39 ~]# useradd -M -s /sbin/nologin -g888 -u888 wwwuseradd warning: www's uid 888 outside of the UID_MIN 1000 and UID_MAX 60000 range.'[root@R39 ~]# id wwwuid=888(www) gid=888(www) groups=888(www)# 先创建用户![root@R39 ~]# egrep -v '^$|^#' /etc/rsyncd.confuid = wwwgid = wwwfake super = yesuse chroot = yesmax connections = 4pid file = /var/run/rsyncd.pidlog file = /var/log/rsyncd.logread only = falselist = falsetimeout = 900ignore nonreadable = yeshosts allow = 10.0.0.0/24auth users = rsync_backupsecrets 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 greproot 3549 0.0 0.0 233936 2524 ?Ss 11:01 0:00 rsync --daemon# 查看进程[root@R39 ~]# ss -lntup | grep rsynctcp 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.pid3549# 这里是它的进程id问题:如何重启服务???[root@R39 ~]# kill -1 $(cat /var/run/rsyncd.pid)[root@R39 ~]# cat /var/run/rsyncd.pidcat: /var/run/rsyncd.pid: No such file or directory[root@R39 ~]# rsync --daemon[root@R39 ~]# cat /var/run/rsyncd.pid3606# 进程号发生改变,服务重启![root@R39 ~]# tail -1 /var/log/rsyncd.log2026/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::backupPassword:@ERROR: auth failed on module backuprsync error: error starting client-server protocol (code 5) at main.c(1850) [sender=3.4.1]# 报错!====================================报错正常,我们来看一下日志![root@R39 ~]# tail /var/log/rsyncd.log2026/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.log2026/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::backupPassword:sending incremental file listpasswd
sent 1,073 bytes received 43 bytes 318.86 bytes/sectotal size is 2,240 speedup is 2.01# ✅成功传输!'客户端'[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/nullecho '打包成功'
#2.创建指纹文件cd /data/md5sum ./all.tar.gz > ./fingerprint.md5echo '创建指纹成功'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 -rfecho '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]# lltotal 0[root@R39 backup]# ls -lhtotal 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客户端 验证备份文件完整性
[root@R39 backup]# md5sum -c fingerprint.md5./all.tar.gz: OK[root@R39 backup]# tar -tf all.tar.gzvar/log/var/log/private/var/log/wtmp......var/log/vmware-network.log# 查看压缩包内容[root@R39 backup]# tar -tf all.tar.gz | grep '.*tmp$'var/log/wtmpvar/log/btmp# 以tmp结尾'这里是因为.点没有被\转义'[root@R39 backup]# tar -tf all.tar.gz | grep '.*\.tmp$'# 再次过滤,它是没有以.tmp结尾了文件的[root@R39 backup]# ll /tmp/var/total 4drwxr-xr-x 13 root root 4096 Mar 14 09:35 log[root@R39 backup]# ll /tmp/var/log/total 4156drwxr-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结尾的文件!④扩展选项
-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 in100+0 records out1048576000 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# 默认是限速kbAuthorized users only. All activities may be monitored and reported.root@172.16.1.41's password: 'sending incremental file list1g 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.txtsending incremental file list1.txt3.txt4.txt5.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.txtsending incremental file listoldboy/oldboy/1.txtoldboy/2.txtoldboy/3.txtoldboy/4.txtoldboy/5.txt# 传输的是目录及目录下的文件sent 334 bytes received 123 bytes 914.00 bytes/sectotal 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 0drwxr-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 --deletesending incremental file listdeleting oldboy/3.txtoldboy/oldboy/1.txt# 删除远程服务器的3.txt,同步自己的1.txtsent 181 bytes received 63 bytes 488.00 bytes/sectotal 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保持一致

- 下面演示的是远程命令模式,它并没有复杂的服务端的配置 选项通用
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 --deleteAuthorized users only. All activities may be monitored and reported.root@172.16.1.31's password: 'sending incremental file listcode/code/index.htmlcode/vide/code/vide/1.html# /code,这次传输的是目录及目录下的文件sent 217 bytes received 66 bytes 37.73 bytes/sectotal 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 --deleteAuthorized users only. All activities may be monitored and reported.root@172.16.1.31's password: 'sending incremental file listindex.htmldeleting vide/c.htmlvide/vide/1.html# /code/*尽量不用,有隐藏bugsent 197 bytes received 81 bytes 50.55 bytes/sectotal 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 --deleteAuthorized users only. All activities may be monitored and reported.root@172.16.1.31's password: 'sending incremental file listdeleting code/vide/1.htmldeleting code/vide/deleting code/index.htmldeleting code/deleting c.html./# 尽量用/code/来取代/code/*sent 135 bytes received 92 bytes 41.27 bytes/sectotal 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:/ --deleteAuthorized users only. All activities may be monitored and reported.root@172.16.1.31's password: 'sending incremental file listdeleting code/code/vide/1.htmldeleting code/code/vide/deleting code/code/index.htmldeleting code/code/deleting code/c.htmlcode/code/index.htmldeleting code/vide/c.htmlcode/vide/code/vide/1.html# 删除冗余的文件,把自己的备份过去# 往前放sent 221 bytes received 183 bytes 89.78 bytes/sectotal size is 0 speedup is 0.00# 验证一下[root@nfs ~]#tree /code/code├── index.html└── vide └── 1.html全网备份案例



1️⃣服务端的配置与调试
虚拟用户rsync的创建
先创建组,再创建用户
验证用户rsync_backup的密码文件
存在于服务端,注意格式,修改权限
模块中的目录
创建出来后,修改属主和属组 日志文件同理
重新启动服务
服务名为rsyncd,多了一个d
测试
先本地测试,在客户端测试
2️⃣客户端配置与脚本
-
先进行优化 创建验证用户
rsync_backup的密码文件,格式只有密码,最后修改权限 -
脚本的编写
创建脚本目录及文件
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.先清理backup服务端的文件[root@backup ~]#rm -rf /backup/*
2.测试脚本(客户端进行测试)[root@nfs ~]#sh /server/scripts/back_conf.shtar: Removing leading `/' from member names'# 第一条不用管他,它的意思就是去除/根目录/etc/hosts# 变为etc/hostssending incremental file list10.0.0.31/10.0.0.31/conf-2026-01-17.tar.gzsent 388 bytes received 47 bytes 870.00 bytes/sectotal size is 243 speedup is 0.56# 在测试的过程中,会有一些报错什么的,自己去适当的修改自己的脚本文件
3.服务端验证[root@backup ~]#tree /backup//backup/└── 10.0.0.31 └── conf-2026-01-17.tar.gz# 按照我们想要的格式传输过来了- 加入定时任务
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 -l00 03 * * * sh /server/scripts/back_conf.sh &>/dev/null# 每天凌晨3点执行一次3️⃣服务端清理与统计
[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 -tIP地址 文件名 文件大小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
vim /server/scripts/back_to_mail.sh脚本文件
邮件的配置,在笔记“定时任务”那一块,这里不过多赘述了
脚本的测试
写入定时任务
验证,和修改时间
🌿②和③客户端也有详细的流程,都大差不差,这里也不展开说了

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

4️⃣指纹校验

md5校验详细的教学,在笔记用户管理这一块
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.客户端脚本的重新量化
因为这个指纹文件,也同样在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 -f3.服务端的配置# 同样只需要一条命令,找出备份目录/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.txtIP地址 文件名 文件大小10.0.0.31 conf-2026-01-17.tar.gz 243/backup/10.0.0.31/conf-2026-01-17.tar.gz: OK
4.服务端脚本优化
#!/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}剩下的就是定时任务测试,优化
# 手动测试# 这里把定时任务注释掉了
1.服务端删除原备份文件[root@backup ~]#rm -rf /backup/*
2.客户端运行脚本[root@nfs ~]#sh /server/scripts/back_conf.shtar: Removing leading `/' from member names'/etc/hostssending incremental file list10.0.0.31/10.0.0.31/conf-2026-01-17.tar.gz10.0.0.31/fingerprint.md5
3.服务端运行脚本[root@backup ~]#sh /server/scripts/back_to_mail.sh
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!



