在 Linux 上使用 rsync 和 cron 设置增量备份
在 Linux 上使用 rsync 和 cron 设置增量备份
ZhangCurry3分钟学会自动备份!在 Linux 上使用 rsync 和 cron 设置增量备份
备份就像保险一样;你不需要每天都用到它们,但当灾难降临时,比如意外删除文件、磁盘故障或勒索软件攻击,如果没有做好准备,这些灾难就足以毁掉一切。这就是为什么需要制定智能备份计划。
在本实践中,我将向你展示如何使用 rsync 和 cron 进行增量备份的计划。
什么是增量备份?
增量备份意味着您只需备份自上次备份以来发生变化的文件。因此,您无需每次都复制所有文件(这可能耗时且占用大量空间),而是仅保存新添加或更新的文件。
假设您有一个文件夹内有 1000 个文件,其中仅有 20 个文件在今天发生了更改。增量备份将跳过这 980 个未更改的文件,仅备份实际发生更改的 20 个文件,这种方式高效且非常适合日常备份。
为什么使用 rsync ?
rsync 是一款强大且可靠的工具,用于在 Linux 系统中复制文件和目录。rsync 的独特之处在于它能够仅同步源目录与目标目录之间的差异。
它支持本地操作(在同一系统内的两个文件夹之间)或远程操作(通过 SSH 连接到另一台服务器)。此外,它还能保留文件权限、时间戳、符号链接,甚至支持删除已删除的文件,操作快速灵活,且已预装在大多数 Linux 发行版中。
如果 rsync 未安装,则可以通过以下命令获取:
1 | # 检查是否安装(主流系统均预装) |
核心优势:
✅ 增量同步|仅传输变化文件,速度提升90%
✅ 断点续传|网络中断后自动接续
✅ 镜像删除|源端删除的文件,备份端同步清理(--delete)
✅ 元数据保留|权限/时间戳/软链接完美克隆
备份方案
假设你有一些重要的文件存储在 /home/oneh/documents/ 目录下,你希望将这些文件备份到 /backup/documents/ 目录中。编写一个简单的Shell脚本,使用rsync命令将发生变化的文件复制到备份目录。然后,使用cron定时任务每天凌晨2:00运行这个脚本。
步骤1:编写备份脚本
首先,我们创建一个 shell 脚本用于执行备份操作,并写入下面的脚本内容。
1 | sudo vi /usr/local/bin/rsync-backup.sh |
此脚本指示 rsync 将源目录中的文件同步到目标目录。-a 选项指示其以归档模式运行,保留权限和元数据。
-v 选项使输出更加详细(以便我们记录正在发生的事情),而 --delete 选项会在源目录中不再存在时从备份中删除文件。所有输出都写入日志文件 /var/log/rsync-backup.log,以便稍后检查是否出现任何问题。
将脚本设为可执行:
1 | sudo chmod +x /usr/local/bin/rsync-backup.sh |
步骤 2:使用 Cron 调度脚本
我们需要确保备份脚本每天凌晨 2 点自动运行,因此需要编辑 cron 任务,输入:
1 | crontab -e # 编辑定时任务 |
在底部追加以下内容(由于没有任何定时任务,所以文件内容本来就是空空的):
1 | # 追加以下内容(每天2:00执行) |
确定定时任务已添加:
1 | crontab -l # 查看任务列表 |
步骤 3:测试备份设置
在让系统自动运行备份之前,手动测试脚本非常重要,以确保一切按预期运行,这将帮助您的 cron 在后台静默运行之前发现任何路径问题、权限错误或拼写错误。
首先,手动运行备份脚本,这将立即触发备份过程。
1 | sudo /usr/local/bin/rsync-backup.sh |
脚本执行完成后,查看备份目录并确认文件已正确复制:
1 | ls -lh /backup/documents/ |
检查日志文件,确保脚本运行时未出现错误,并记录了备份时间:
1 | cat /var/log/rsync-backup.log |
上图证实该脚本已按预期正确执行,不仅复制了文件,还记录了该事件并附上了时间戳。
步骤 4:创建每日快照备份
如果想更进一步,每天对数据进行快照备份(而不是仅仅创建一个备份文件夹),你可以使用 rsync 中的 --link-dest 选项,该选项允许你创建硬链接备份,基本上是创建新的文件夹,这些文件夹看起来像完整的备份,但只占用已更改文件的空间。
在第一天,创建初始完整备份:
1 | sudo rsync -a /home/oneh/documents/ /backup/daily.0/ |
次日,以次日文件夹为参考,创建增量备份:
1 | sudo rsync -a --link-dest=/backup/daily.0/ /home/oneh/documents/ /backup/daily.1/ |
未更改的文件将被硬链接,从而节省空间。您甚至可以使用一个简单的脚本对这些文件夹进行轮换,该脚本每天会重命名旧文件并创建一个新的快照。
以下是一个为期7天的基本轮换脚本:
1 | #!/bin/bash |
使用cron调度此脚本,就像基本备份脚本一样。例如,要每天凌晨2:00运行它:
1 | 0 2 * * * /usr/local/bin/daily-rsync-rotate.sh |
将数据备份到远程服务器
如果你想将数据备份到另一台机器(如备份服务器),可以使用SSH上的 rsync ,但请确保已配置SSH密钥以实现无密码登录,然后运行类似以下命令:
1 | # 1. 生成SSH密钥(免密登录) |
可以将上述命令添加到脚本中,或单独创建一个用于远程备份的脚本。
避坑指南
- 首次执行:务必手动运行
sudo /usr/local/bin/rsync-backup.sh测试路径权限 - 空间监控:添加
df -h >> $LOGFILE到脚本,记录磁盘用量 - 邮件报警:Cron任务末尾添加
&& echo "Success" | mail -s "Backup Report" your@email.com - 恢复演练:每季度随机还原文件,验证备份有效性
结语:
再小的数据都值得备份,再忙的日程都该自动化。这套零成本方案已守护我的大量个人数据10年,经历3次硬盘故障0丢失。技术人最大的浪漫,是把安全感写进代码里。
推荐阅读:
👉 1.Debian 13 “Trixie” 深度解析:15项颠覆性革新重塑Linux生态
👉 2.在 Ubuntu 24.04 上使用 DevStack 实践部署 OpenStack
👉 3.在 Debian 上使用 Keepaplived 简单配置高可用性 HAProxy 实践



