备份就像保险一样;你不需要每天都用到它们,但当灾难降临时,比如意外删除文件、磁盘故障或勒索软件攻击,如果没有做好准备,这些灾难就足以毁掉一切。这就是为什么需要制定智能备份计划。
在本实践中,我将向你展示如何使用 rsync 和 cron 进行增量备份的计划。
增量备份意味着您只需备份自上次备份以来发生变化的文件。因此,您无需每次都复制所有文件(这可能耗时且占用大量空间),而是仅保存新添加或更新的文件。
假设您有一个文件夹内有 1000 个文件,其中仅有 20 个文件在今天发生了更改。增量备份将跳过这 980 个未更改的文件,仅备份实际发生更改的 20 个文件,这种方式高效且非常适合日常备份。

它支持本地操作(在同一系统内的两个文件夹之间)或远程操作(通过 SSH 连接到另一台服务器)。此外,它还能保留文件权限、时间戳、符号链接,甚至支持删除已删除的文件,操作快速灵活,且已预装在大多数 Linux 发行版中。
如果 rsync 未安装,则可以通过以下命令获取:
# 检查是否安装(主流系统均预装)
rsync --version
sudo apt install rsync # Debian/Ubuntu
sudo yum install rsync # CentOS/RHEL
核心优势:
✅ 增量同步|仅传输变化文件,速度提升90%
✅ 断点续传|网络中断后自动接续
✅ 镜像删除|源端删除的文件,备份端同步清理(--delete)
✅ 元数据保留|权限/时间戳/软链接完美克隆
假设你有一些重要的文件存储在 /home/oneh/documents/ 目录下,你希望将这些文件备份到 /backup/documents/ 目录中。编写一个简单的Shell脚本,使用rsync命令将发生变化的文件复制到备份目录。然后,使用cron定时任务每天凌晨2:00运行这个脚本。
首先,我们创建一个 shell 脚本用于执行备份操作,并写入下面的脚本内容。
sudo vi /usr/local/bin/rsync-backup.sh
# 脚本内容========0
#!/bin/bash
# 名称:/usr/local/bin/rsync-backup.sh
# 功能:增量备份+日志记录
SOURCE="/home/oneh/documents/"# 重要数据源
DEST="/backup/documents/"# 备份目标路径
LOGFILE="/var/log/rsync-backup.log"# 日志文件路径
DATE=$(date +"%Y-%m-%d %H:%M:%S") # 备份时间
# 核心命令(归档模式+删除同步+日志输出)
rsync -av --delete "$SOURCE""$DEST" >> "$LOGFILE" 2>&1
echo"Backup completed at $DATE" >> "$LOGFILE"
# 脚本内容========1

此脚本指示 rsync 将源目录中的文件同步到目标目录。-a 选项指示其以归档模式运行,保留权限和元数据。
-v 选项使输出更加详细(以便我们记录正在发生的事情),而 --delete 选项会在源目录中不再存在时从备份中删除文件。所有输出都写入日志文件 /var/log/rsync-backup.log,以便稍后检查是否出现任何问题。
将脚本设为可执行:
sudo chmod +x /usr/local/bin/rsync-backup.sh
我们需要确保备份脚本每天凌晨 2 点自动运行,因此需要编辑 cron 任务,输入:
crontab -e # 编辑定时任务
在底部追加以下内容(由于没有任何定时任务,所以文件内容本来就是空空的):
# 追加以下内容(每天2:00执行)
0 2 * * * /usr/local/bin/rsync-backup.sh
确定定时任务已添加:
crontab -l # 查看任务列表
在让系统自动运行备份之前,手动测试脚本非常重要,以确保一切按预期运行,这将帮助您的 cron 在后台静默运行之前发现任何路径问题、权限错误或拼写错误。
首先,手动运行备份脚本,这将立即触发备份过程。
sudo /usr/local/bin/rsync-backup.sh
脚本执行完成后,查看备份目录并确认文件已正确复制:
ls -lh /backup/documents/

检查日志文件,确保脚本运行时未出现错误,并记录了备份时间:
cat /var/log/rsync-backup.log

上图证实该脚本已按预期正确执行,不仅复制了文件,还记录了该事件并附上了时间戳。
如果想更进一步,每天对数据进行快照备份(而不是仅仅创建一个备份文件夹),你可以使用 rsync 中的 --link-dest 选项,该选项允许你创建硬链接备份,基本上是创建新的文件夹,这些文件夹看起来像完整的备份,但只占用已更改文件的空间。
在第一天,创建初始完整备份:
sudo rsync -a /home/oneh/documents/ /backup/daily.0/
次日,以次日文件夹为参考,创建增量备份:
sudo rsync -a --link-dest=/backup/daily.0/ /home/oneh/documents/ /backup/daily.1/
未更改的文件将被硬链接,从而节省空间。您甚至可以使用一个简单的脚本对这些文件夹进行轮换,该脚本每天会重命名旧文件并创建一个新的快照。
以下是一个为期7天的基本轮换脚本:
#!/bin/bash
rm -rf /backup/daily.7
mv /backup/daily.6 /backup/daily.7
mv /backup/daily.5 /backup/daily.6
mv /backup/daily.4 /backup/daily.5
mv /backup/daily.3 /backup/daily.4
mv /backup/daily.2 /backup/daily.3
mv /backup/daily.1 /backup/daily.2
mv /backup/daily.0 /backup/daily.1
rsync -a --delete --link-dest=/backup/daily.1 /home/oneh/documents/ /backup/daily.0/
使用cron调度此脚本,就像基本备份脚本一样。例如,要每天凌晨2:00运行它:
0 2 * * * /usr/local/bin/daily-rsync-rotate.sh
如果你想将数据备份到另一台机器(如备份服务器),可以使用SSH上的 rsync ,但请确保已配置SSH密钥以实现无密码登录,然后运行类似以下命令:
# 1. 生成SSH密钥(免密登录)
ssh-keygen -t ed25519
ssh-copy-id user@backup-server
# 2. 远程同步命令(加密传输)
rsync -av -e ssh /home/oneh/documents/ oneh@backup-server:/backup/oneh/
可以将上述命令添加到脚本中,或单独创建一个用于远程备份的脚本。
sudo /usr/local/bin/rsync-backup.sh 测试路径权限df -h >> $LOGFILE 到脚本,记录磁盘用量&& echo "Success" | mail -s "Backup Report" your@email.com结语:
再小的数据都值得备份,再忙的日程都该自动化。这套零成本方案已守护我的大量个人数据10年,经历3次硬盘故障0丢失。技术人最大的浪漫,是把安全感写进代码里。