用 rsync + 硬链接给云服务器做增量快照备份:一个脚本搞定每日备份与自动清理
【摘要】 背景云服务器(比如华为云 Flexus L 实例)上跑着博客、数据库导出和配置文件,一旦误删或被入侵,没有备份就很被动。整盘快照很方便但有成本,对于几 GB 的业务数据,用 rsync 的 --link-dest 做“硬链接增量快照”就足够了:每天一个完整目录,看起来是全量,实际只占用变化文件的空间。 原理一句话rsync --link-dest=上一次快照 会把没变化的文件以硬链接方式指...
背景
云服务器(比如华为云 Flexus L 实例)上跑着博客、数据库导出和配置文件,一旦误删或被入侵,没有备份就很被动。整盘快照很方便但有成本,对于几 GB 的业务数据,用 rsync 的 --link-dest 做“硬链接增量快照”就足够了:每天一个完整目录,看起来是全量,实际只占用变化文件的空间。
原理一句话
rsync --link-dest=上一次快照 会把没变化的文件以硬链接方式指向上一次的同一个 inode,只有改动过的文件才真正复制。所以每个快照目录都能单独浏览和恢复,但磁盘占用接近增量备份。
准备
- 源目录:
/srv/app、/etc/nginx - 备份盘:挂载在
/backup(建议单独一块云硬盘,或至少不同分区) - 系统:Ubuntu 22.04,rsync 默认已安装(
rsync --version确认)
备份脚本
保存为 /usr/local/bin/snap-backup.sh:
#!/usr/bin/env bash
set -euo pipefail
SRC=("/srv/app" "/etc/nginx")
DEST_ROOT="/backup/snapshots"
KEEP_DAYS=14
TODAY=$(date +%F)
LATEST="$DEST_ROOT/latest"
TARGET="$DEST_ROOT/$TODAY"
mkdir -p "$DEST_ROOT"
LINK_OPT=()
[ -d "$LATEST" ] && LINK_OPT=(--link-dest="$LATEST")
rsync -aH --delete --numeric-ids \
--exclude='*.tmp' --exclude='node_modules/' \
"${LINK_OPT[@]}" "${SRC[@]}" "$TARGET/"
# 更新 latest 软链接指向今天
ln -sfn "$TARGET" "$LATEST"
# 清理超过保留天数的快照
find "$DEST_ROOT" -maxdepth 1 -type d -name '20*' -mtime +"$KEEP_DAYS" -exec rm -rf {} +
echo "[$(date '+%F %T')] snapshot $TODAY done"
几个参数说明:
-a保留权限、属主、时间戳;-H保留源里本身的硬链接;--delete让快照与源保持一致(删除的文件不会出现在新快照里,但旧快照中仍在);--numeric-ids恢复到别的机器时避免用户名映射错乱。
定时执行
chmod +x /usr/local/bin/snap-backup.sh 后,加一条 cron(或 systemd timer):
30 3 * * * /usr/local/bin/snap-backup.sh >> /var/log/snap-backup.log 2>&1
验证确实是“增量”
跑两天后看一下:
du -sh /backup/snapshots/* # 第一份接近全量,之后每份都很小
stat -c '%i %h %n' /backup/snapshots/*/app/index.html
同一个未修改文件在不同快照里 inode 相同、链接数 %h 大于 1,说明硬链接生效。注意 du 对同一次命令里重复的 inode 只统计一次,所以按顺序列出时后面的快照显得很小,这正是我们要的效果。
恢复
恢复单个文件直接 cp 即可;恢复整个目录:
rsync -aH /backup/snapshots/2026-10-30/app/ /srv/app/
注意事项
- 硬链接只能在同一文件系统内,所以所有快照必须放在同一个分区。
- 硬链接文件共享内容:千万不要直接编辑快照里的文件,否则所有引用它的快照都会被改。可以把备份目录挂载为只读,或者只用 rsync/cp 读取。
- 数据库不要直接拷数据文件,先
mysqldump/pg_dump导出到/srv/app/dump/再纳入备份。 - 本机备份防不了整机故障,重要数据再定期同步一份到对象存储(如 OBS)或另一台机器,做到“异地一份”。
小结
一个二十几行的脚本,就能拿到“每天一个可直接浏览的完整快照 + 只占增量空间 + 自动过期清理”的备份方案,对个人云服务器非常实用。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)