BorgBackup 加密去重备份实战:比 rsync 更省空间的方案
用 rsync 加硬链接做版本化备份,方案简单可靠,但在数据量上到 TB 级后会遇到两个硬伤:同一份大文件改一个字节就要整份再存一份,空间随版本数线性膨胀;备份全是明文,仓库机一旦被攻破,数据等于直接送人。BorgBackup 针对的正是这两点:内容寻址的块级去重(文件切块、相同块只存一份)、客户端加密(数据离开源机前已加密)、每次备份可校验完整性。本文把从建仓、脚本化备份、GFS 保留、异地防勒索仓库到恢复演练的完整链路落一遍;示例为 Rocky Linux 9,源机 node-01,仓库机 backup-01,两端 Borg 版本保持一致(1.2 系列)。
与 rsync 方案的差异定位
先把取舍说清,免得用错地方。去重粒度上,rsync 硬链接方案是文件级,Borg 是块级(默认可变长分块),数据库导出、虚拟机镜像这类「大文件小改动」的场景,Borg 的空间优势是数量级的。存储形态上,rsync 的备份就是一棵可直接浏览的目录树,Borg 是私有仓库格式,必须用 borg 命令读——换来的是加密与校验,代价是恢复多一道工具依赖(所以仓库旁边要放一份 borg 二进制或至少保证随时可装)。一致性上,两者都只是文件级备份,数据库仍要先做逻辑导出或停写快照再备文件,别指望直接拷数据文件能恢复。结论:新上备份、数据以大文件为主、且有异地与防勒索诉求的,选 Borg;已跑稳的 rsync 小规模方案不必为换而换。
前置条件
- 源机与仓库机各安装 borgbackup,两端版本尽量一致(服务端更新或更旧都可能拒绝协作);
- 源机到仓库机 SSH 免密互通(专用备份账号,不要用 root 直连);
- 想清楚密钥保管方案:仓库口令与导出的密钥文件分开存放,其中一份必须离线(如密码管理器加一份打印件入保险柜);
- 预估仓库容量:按去重后的数据量规划,并预留 compact 前的峰值空间。
第一步:初始化仓库与密钥保管
加密模式选 repokey:密钥加密后存放在仓库的 config 里,同时可以导出一份独立保管,兼顾便利与可恢复(与之相对的 keyfile 模式密钥只在客户端本机,本机磁盘坏了就全灭,新手不要选错)。初始化会要求设置仓库口令,口令与密钥是两道独立的锁,缺一不可恢复——这句话在常见问题里还会再出现一次。
export BORG_REPO='ssh://backup@backup-01.example.com/srv/borg/node-01'
borg init --encryption=repokey-blake2
# 密钥导出,两份异地分开保管(此命令输出含密钥材料,勿进日志与工单)
borg key export "$BORG_REPO" ~/borg-node-01-key.txt
borg key paperkey "$BORG_REPO" # 可选:打印版密钥,便于离线归档
第二步:备份脚本
备份动作收敛到一个脚本里跑 cron:create 打一份带时间戳的归档,排除规则单独成文件便于维护;prune 按 GFS 口径做保留;compact 单独成步回收空间(1.2 系列里 prune 只做逻辑删除,不实际释放段空间,必须配 compact,这点与老版本行为不同,是最常见的「删了归档空间没变」来源)。脚本要点:口令从权限 600 的文件读入环境变量、加全局锁防并发、create 的退出码 1 是警告(如文件在读时变化)要记录但不算失败、2 才是真错误。
#!/bin/sh
# /usr/local/sbin/borg-backup.sh
export BORG_REPO='ssh://backup@backup-01.example.com/srv/borg/node-01'
export BORG_PASSPHRASE="$(cat /etc/borg/passphrase)"
exec 9>/run/borg-backup.lock
flock -n 9 || { echo "another backup is running"; exit 1; }
borg create --stats --compression zstd,3 \
--exclude-from /etc/borg/excludes \
::'{hostname}-{now:%Y-%m-%d_%H%M}' /srv /etc /home || \
[ $? -eq 1 ]
borg prune --list --keep-daily 7 --keep-weekly 4 --keep-monthly 6
borg compact
排除文件 /etc/borg/excludes 按行写模式即可,缓存目录、临时文件、挂载点下的仓库本身是必排项;示例:
/dev
/proc
/sys
/run
/tmp
/var/cache
/home/*/.cache
/srv/borg
第三步:异地仓库与 append-only 防勒索
异地不等于安全:若源机被勒索软件攻陷,攻击者顺着备份通道把历史归档删光是常见剧本。Borg 的对策在服务端这一侧——给备份账号的 authorized_keys 加上强制命令,让这把密钥只能以 append-only 模式 serve:能追加新数据、不能删除或改写已有归档,prune 这类整理操作改由仓库机本地定期执行。这样即便源机完全失陷,历史备份仍在。
# 仓库机上 backup 账号的 ~/.ssh/authorized_keys(单行)
command="borg serve --append-only --restrict-to-path /srv/borg",restrict ssh-ed25519 AAAA...备用的公钥材料省略
代价要提前知道:append-only 下源机侧 prune 会被拒绝,所以保留策略改到仓库机本地用另一身份执行;空间回收节奏随之变慢,仓库容量规划要按「只进不出到整理日」留足余量。是否启用取决于风险模型——只有本地一份、且源机暴露面大的,强烈建议开;已有离线介质轮换的,可不开但别两头都不占。
第四步:恢复演练
备份的验收标准是恢复,不是 create 成功。两种读法:extract 把整份归档或指定路径解出来,适合整机恢复与批量取数;mount 把归档挂成只读文件系统,适合「只取一个文件、还要挑版本」的场景,找完卸载即可。演练要定期真做:随机挑一个历史归档,恢复一个业务文件并校验可用(解压、导入、打开),把耗时记进演练记录——恢复时长才是 RTO 的真实口径。
borg list # 先看归档清单
borg extract --dry-run --list ::node-01-2026-11-01_0200 srv/app/config.yaml
borg extract ::node-01-2026-11-01_0200 srv/app/config.yaml
mkdir -p /mnt/restore
borg mount ::node-01-2026-11-01_0200 /mnt/restore
ls /mnt/restore/srv/app/
umount /mnt/restore
第五步:完整性检查
borg check 分档使用。默认档只校验仓库结构与归档元数据,快,适合每周例行;加 --archives-only 与 --verify-data 会把数据块全部读出来验哈希,能发现静默损坏,但 IO 与耗时随数据量线性增长,适合每月或每季度在低峰做。检查发现不一致时先停自动备份、保留现场,再按日志定位是单块损坏还是介质问题,不要上来就用 --repair——它会删除无法修复的数据,属于有损操作,必须在确认有其他副本后由人执行。
borg check --progress # 例行结构检查
borg check --verify-data # 全量校验(低峰期,耗时较长)
验证
上线后做一次完整闭环:手动跑一次备份脚本,borg list 看到新归档且 borg info 显示去重后的实际占用;紧接着按第四步恢复一个文件并确认内容正确;最后故意往源目录改一个大文件的一小部分,再跑一次备份,对比仓库增量——增量远小于文件本身,块级去重才算真的在工作。
常见问题
- 密钥或口令丢失:等于备份全灭,没有后门。repokey 的导出文件与口令必须分开、异地、至少一份离线保管,并把「恢复需要哪两样东西」写进交接文档;每次演练恢复都实际用一次保管的密钥,防止存的是旧版本。
- Repository lock / LockTimeout:多为上次备份被强杀后留下陈旧锁。先确认确实没有 borg 进程在跑(ps 与仓库机侧都看),再执行 borg break-lock;有进程时强行破锁会损坏仓库。
- prune 之后空间不释放:1.2 系列必须再跑 borg compact 才会真正回收段空间;append-only 部署则要在仓库机本地做 prune 与 compact。另外先用 borg info 对比逻辑量与物理量,确认不是新数据本来就在涨。
- 两端版本不一致报错:Borg 对版本差敏感,滚动升级时先升仓库机(服务端)并保持一个大版本内的兼容窗口,或在客户端用 --remote-path 指定服务端特定二进制路径;把 borg 版本写进两端的巡检项,避免系统大升级后备份 silently 失败。
小结
Borg 的三件套——块级去重、客户端加密、完整性校验——正好补上 rsync 方案的三处短板,代价是多一层工具依赖与密钥管理的纪律。落地时真正的分水岭不在命令,而在三件事:密钥与口令分开保管并定期在演练中实测、异地仓库开 append-only 挡住「顺备份通道删历史」的剧本、恢复演练按时做并记录时长。做到这三点,它就是一套能扛事的备份系统;做不到,功能再全也只是一份昂贵的心理安慰。







