服务器文件同步增量备份如何搭建
学完这篇,你能在自己的 Linux 服务器上用 rsync 搭出一套「每天一个快照、只传变化部分、磁盘占用接近一份全量」的增量备份方案,并知道怎么定时跑、怎么验证、怎么恢复。下面以 Ubuntu 22.04(rsync 3.2.7)为例,全程用命令行操作。
第一步:装好 rsync 并确认版本
这一步要让本机和服务器都具备 rsync 命令,并确认版本不低于 3.0(--link-dest 硬链接快照需要它)。
在备份机和被备份机上分别执行:
sudo apt update
sudo apt install -y rsync
rsync --version | head -n 1
看到 rsync version 3.2.7 protocol version 31 之类的输出即可。CentOS/Rocky 用 sudo dnf install -y rsync。
注意:如果服务器是极简系统,可能默认带的是 rsync 2.x,
--link-dest行为不同,先升级再往下做。
第二步:配置 SSH 免密登录
这一步让备份机不用输密码就能连上被备份机,备份脚本才能放进定时任务自动跑。
在备份机上执行(一路回车,passphrase 留空):
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519
ssh-copy-id -p 22 root@192.168.1.10
ssh -p 22 root@192.168.1.10 "hostname"
最后一条能直接打印出对端主机名,就说明免密成功。不是 22 端口就把 -p 换成实际端口。
注意:备份一般要读对端所有文件,通常用 root 或带 sudo 的专用账号;普通账号会因权限不足静默跳过文件,备份结果不完整。
第三步:准备备份目录结构
这一步在备份机上建立「一份份带日期目录 + 一个 latest 指针」的目录骨架,后面每次备份都往里加一天。
sudo mkdir -p /backup/daily
sudo mount /dev/sdb1 /backup # 备份盘单独挂载,别和数据盘混用
df -h /backup
结构约定:/backup/daily/2024-06-01/、/backup/daily/2024-06-02/……以及软链接 /backup/daily/latest 指向最新一天。
注意:硬链接不能跨文件系统,
/backup必须是独立挂载点,否则快照间无法共享数据块,磁盘会被撑满。
第四步:写备份脚本
这一步写出核心脚本,用 --link-dest 让没变化的文件硬链接到上一天,只有改动过的文件才真正占新空间。
新建 /usr/local/bin/backup.sh:
#!/bin/bash
set -euo pipefail
SRC="/data/"
DEST="/backup/daily"
TODAY=$(date +%F)
mkdir -p "$DEST/$TODAY"
LINK=""
if [ -L "$DEST/latest" ]; then
LINK="--link-dest=$(readlink -f "$DEST/latest")"
fi
rsync -aAX --delete --numeric-ids $LINK \
-e "ssh -p 22" \
root@192.168.1.10:"$SRC" "$DEST/$TODAY/"
ln -sfn "$DEST/$TODAY" "$DEST/latest"
find "$DEST" -maxdepth 1 -type d -mtime +30 ! -name daily -exec rm -rf {} \;
参数含义:-a 归档模式,-A 保留 ACL,-X 保留扩展属性,--delete 让目标与源一致,--numeric-ids 避免 UID 映射错乱,--link-dest 指向上一次快照。
赋权并手动跑一次:
sudo chmod +x /usr/local/bin/backup.sh
sudo /usr/local/bin/backup.sh
注意:
--delete会删除目标端多余文件,务必先确认SRC路径结尾的斜杠含义——/data/是同步目录内容,/data会多套一层目录。
第五步:设置定时任务
这一步让脚本每天凌晨自动执行,得到持续的增量备份链。
执行 sudo crontab -e,加入一行:
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
保存后 sudo tail -f /var/log/backup.log 观察下一次执行结果。想用 systemd 的话,建 backup.service + backup.timer,OnCalendar=daily 即可。
第六步:验证与恢复演练
这一步确认快照真的共享了数据块、并且能还原,避免「备份了但用不了」。
du -sh /backup/daily/* # 后续日期应远小于第一天
ls -li /backup/daily/2024-06-01/etc/hosts /backup/daily/latest/etc/hosts
rsync -avn --delete /backup/daily/latest/ /tmp/restore-test/
两条 ls -li 的 inode 号相同,说明是硬链接;-n 是干跑,确认无误后去掉 -n 真正恢复。
注意:
find ... -exec rm -rf的保留策略一定要加! -name daily之类的保护,写错一个变量就可能把整个/backup/daily删空。定期做一次真实恢复演练,比看日志有用。
小结
- 核心是
rsync -aAX --delete --link-dest=上一次快照,硬链接共享未变文件,实现增量的空间占用、全量的可读性。 /backup必须独立挂载,否则硬链接失效。- SSH 免密 + cron 让它自动跑,日志重定向到文件方便排查。
- 保留策略要保护
latest和日期目录,删除条件写保守些。 - 备份没做过恢复演练就不算完成,定期用
rsync -avn干跑校验。
原文链接:https://www.gj0.com/thread-734.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。