borgbackup:去重增量备份,省空间的神器

每天全量备份太占地方?小够讲 borgbackup:去重+增量+加密三合一,30 天的备份只占一点空间,备份恢复一条命令,VPS 备份的优雅方案。

我是小够。每天全量打 tar,30 天就是 30 个包,磁盘哗哗地掉。rsync 是增量了,但历史版本管理麻烦。borgbackup 把三件事合在一起:去重、增量、加密,一个工具全搞定。

好在哪

  • 去重:相同的数据块只存一份。30 天的备份,变化的部分才占新空间
  • 增量:每次备份只传变化的部分,速度快
  • 加密:仓库自带加密,备份天生就是密文
  • 挂载查看:备份可以像目录一样挂载,直接翻历史版本的文件

上手

sudo apt install borgbackup
# 初始化仓库( repokey 模式,密钥存在仓库里,密码自己记)
borg init --encryption=repokey /backup/borg-repo

第一次备份:

borg create /backup/borg-repo::site-{now:%Y-%m-%d} /var/www /etc/nginx

之后每天跑同一条命令,borg 自动只存增量。30 天下来,空间占用可能只有全量 30 份的几分之一——具体看数据变化量。

日常操作

# 列出所有备份
borg list /backup/borg-repo
# 看某次备份里有什么
borg list /backup/borg-repo::site-2025-08-10
# 恢复单个文件
borg extract /backup/borg-repo::site-2025-08-10 var/www/html/wp-config.php
# 删 30 天前的备份
borg prune --keep-daily=7 --keep-weekly=4 --keep-monthly=6 /backup/borg-repo

prune 的保留策略和 GFS 轮换一个思路,borg 原生支持,不用自己写 find。

自动化

密码别写在脚本里,用环境变量:

export BORG_PASSPHRASE='你的密码'
borg create /backup/borg-repo::site-{now:%Y-%m-%d} /var/www

配合 systemd timer 或 cron 每天跑。密码同样要离线保管两份,丢了备份全废。

注意事项

  • 仓库别和原数据放同一台机器:borg 仓库可以建在备份服务器上,borg create user@backup-server:repo 直接走 SSH
  • 定期 borg check 检查仓库完整性
  • 大版本升级前看一眼 changelog,仓库格式偶尔有变化

小够的结论

borgbackup 是小够心中 VPS 备份的优雅解:一条命令备份、去重省空间、自带加密、恢复简单。唯一的门槛是第一次配置花半小时——但配好之后,每天省下的空间和时间,早就值回来了。

远程仓库:备份直接进备份服务器

borg 天生支持 SSH 远程仓库:

# 在备份服务器上初始化
borg init --encryption=repokey user@backup-server:/data/borg-repo
# 每天直接备过去
borg create user@backup-server:/data/borg-repo::site-{now:%Y-%m-%d} /var/www

备份、异地、加密一次完成。配合前面讲的受限 SSH 密钥,安全又省事。

prune 保留策略详解

borg prune \
    --keep-daily=7 \
    --keep-weekly=4 \
    --keep-monthly=6 \
    /backup/borg-repo

这是 GFS 轮换的 borg 原生实现。注意 prune 删的是"归档点",去重的数据块有引用计数,不会被误删,放心。

check:仓库健康检查

# 每月跑一次
borg check /backup/borg-repo

仓库是 borg 的一切,坏了所有备份都完蛋。check 要定期跑,报错了立刻处理。

borgmatic:懒人封装

觉得 borg 命令太多记不住,borgmatic 是个配置文件驱动的封装:

# /etc/borgmatic/config.yaml
source_directories:
    - /var/www
    - /etc/nginx
repositories:
    - /backup/borg-repo
retention:
    keep_daily: 7
    keep_weekly: 4
    keep_monthly: 6
borgmatic  # 一条命令全搞定:备份+prune+check

常见问题

Q:borg 和 restic 选哪个? A:两个都是优秀的去重备份工具。borg 更成熟、文档全;restic 对云存储原生支持更好。小够用 borg 顺手,restic 也完全可以,选一个坚持用。

Q:仓库密码忘了? A:和 gpg 一样,没救。密码离线存两份,这是铁律。

Q:备份时文件在变,会坏吗? A:borg 备份的是某一时刻的快照,一致性比 tar 好。但数据库这类"时刻在写"的,还是建议先 mysqldump 导出成文件再让 borg 备份,别直接备原始数据文件。