Restic 与 BorgBackup 怎么选:S3、SSH 和速度对比
Restic 可直接写入 S3 和对象存储,无需远端安装程序;Borg 依赖 SSH 运行远端二进制,通常更快。本文结合命令和版本 0.19.1、1.4.5 说明如何选择。
Restic 与 BorgBackup:一段话说明区别
Restic 和 BorgBackup 都执行相同的核心任务:为 Linux 服务器创建去重、加密的增量备份。决定如何选择的关键区别在于备份存储在哪里。Restic 原生支持 S3 和其他对象存储 API,因此存储桶可以直接作为目标端,无需在远端安装任何程序。Borg 要求在存放仓库的机器上安装 borg 程序,因为 Borg 仓库由进程提供服务,而不是由文件系统或 API 提供服务。如果目标是对象存储,答案已经很明确。如果目标是您控制的另一台 Linux 主机,则可以使用 Borg,而且通常速度更快。
其他区别都比较小。两者都会使用内容定义分块来拆分文件,因此一个发生了 200 MB 变化的 40 GB 目录,大约只需上传 200 MB。两者都在客户端加密。两者都通过 FUSE(用户空间文件系统)挂载快照,因此您可以从中复制出单个文件。截至 2026 年 7 月,restic 的版本为 0.19.1,Borg 的稳定版本系列为 1.4,当前版本为 1.4.5。Borg 2.0 多年来一直处于 beta 阶段,目前仍标记为仅供测试,因此现在应部署 1.4。
仓库模型才是实际差异
restic 仓库是一个文件目录,其中包含 config、keys/、snapshots/、index/ 和 data/,这些文件中存放着 pack 文件。读取仓库不需要其他组件。这正是 restic 能够支持众多后端的原因。任何能够写入、读取、列出和删除 blob 的存储,都可以保存 restic 仓库。因此,同一个二进制程序可以支持本地路径、SFTP、自带的 REST 服务器、S3、Backblaze B2、Azure、Google Cloud Storage,以及 rclone 能够访问的任何存储。
Borg 仓库同样是磁盘上的文件,但 Borg 不会通过简单传输直接访问仓库。对于远程仓库,Borg 会通过 SSH 在远端启动 borg serve,并与该进程使用自有协议通信。服务器端会执行实际操作:保存仓库、应用事务并响应索引查询。这就是 Borg 没有 S3 后端,以及项目没有添加该后端的原因。存储桶中没有可运行的进程。
这一项设计事实造成了下面大多数实际差异。
# restic: the repository is a URL, and the backend is part of it
restic -r /srv/restic-repo init
restic -r sftp:backup@198.51.100.20:/srv/restic-repo init
restic -r s3:s3.us-east-1.amazonaws.com/my-backup-bucket init# borg: a local path, or user@host:path, with borg installed on that host
borg init --encryption=repokey-blake2 /srv/borg/vps1
borg init --encryption=repokey-blake2 backup@198.51.100.20:/srv/borg/vps1加密:其中一种可以关闭
Restic 始终启用加密,不提供未加密模式。restic init 会要求输入密码,并使用 scrypt 从密码派生密钥;之后写入的每个 pack 文件都会经过加密和身份验证。密码一旦丢失,数据就无法恢复,因为该设计不提供任何恢复路径。
Borg 在创建仓库时选择是否加密,且该选择不可更改。borg init --encryption=repokey 会将加密密钥保存在仓库中,因此仅凭口令即可恢复。--encryption=keyfile 会将密钥保存在客户端的 ~/.config/borg/keys/ 中,因此即使有人窃取了整个仓库,也无法访问其中的数据;但您必须单独备份该密钥文件,否则归档将无法读取。每种模式都有一个 -blake2 变体,该变体使用 BLAKE2b 而不是 HMAC-SHA256 进行身份验证,在没有 SHA 硬件加速的设备上速度更快。--encryption=none 也可用;如果仓库位于您拥有的加密磁盘上,这是一种实际可行的选择。
实际规则是:普通服务器备份使用 repokey-blake2;仓库位于您无法完全信任的位置时使用 keyfile;在租用的机器上绝不要使用 none。
压缩,以及为什么 restic 很晚才支持压缩
Borg 从一开始就支持压缩。默认设置为 lz4,因为它的速度足够快,可以始终启用。zstd 接受 1 到 22 的级别,默认值为 3;zlib 和 lzma 适用于更关注占用空间而不是耗时的情况;auto 会针对每个数据块运行启发式判断,因此不会对已经压缩的数据重复压缩。
borg create --compression zstd,3 --stats --progress \
/srv/borg/vps1::'{hostname}-{now}' /etc /home /srv在 repository format 2 之前,restic 完全不支持压缩;使用该格式需要 restic 0.14.0 或更高版本。现在,新建 repository 默认使用 format 2,可通过 --compression 设置压缩级别,取值为 auto、off 或 max。旧的 format 1 repository 在迁移前会一直保持未压缩状态。因此,如果您的 restic repository 早于 0.14,且从未迁移过,那么文本、日志和数据库转储仍会占用完整的原始空间。
远程目标:S3 与 SSH
通常需要在这里做出选择。
Restic 访问 S3 时,只需在环境中提供凭据,无需在任何位置运行其他服务。访问自行托管的存储桶时也采用相同模式。这是一种常见组合:在自己的 VPS 上运行 提供 S3 API 的 MinIO,然后将 restic 指向它。
export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...
export RESTIC_REPOSITORY=s3:https://objects.example.com/backups
export RESTIC_PASSWORD_FILE=/root/.restic-pass
restic init
restic backup /etc /home /srv --exclude-cachesBorg 访问远程仓库时需要 SSH,并且远端必须安装 Borg;远端版本还必须与客户端兼容。如果远端不由您管理,这会增加配置难度。如果远端是您已经管理的第二台服务器,则不会带来额外问题,而且可以获得这两个工具所能提供的最强勒索软件防护:仅允许追加的 SSH 密钥。强制该密钥运行 borg serve,客户端便可以添加归档,但无法删除归档。因此,即使服务器被攻破,攻击者也无法清除该服务器自己的备份历史。
command="borg serve --append-only --restrict-to-path /srv/borg/vps1",restrict ssh-ed25519 AAAA...只有在运行 Borg 自带的 REST 服务器时,Restic 才有等效方案;该服务器支持仅允许追加的模式。对于普通 S3,则可以通过存储桶策略或对象锁实现相同效果。这属于存储服务提供商的职责,而不是 restic 的功能。还应限制传输通道,因为 SSH 端同样需要按照其他登录入口进行保护:为备份账户应用 仅允许密钥登录且限制 authorized_keys 条目。
速度:每种设计意味着什么
这两个项目都没有发布可供您直接用于自身数据的可信基准测试,因此应根据工作机制进行判断。
在高延迟链路上,Borg over SSH 速度较快,因为服务端具备智能处理能力。客户端提出查询,远程 borg serve 进程根据仓库索引返回结果,并在一处提交事务。每个小文件的分块查找不会分别产生网络往返。
对象存储上的 Restic 没有服务端,因此必须通过 HTTP 获取索引文件和包文件,再据此建立数据视图。为控制请求数量,Restic 会在上传前将许多小分块打包到较大的包文件中,并在 ~/.cache/restic 中保留本地缓存,使下一次运行不必重新获取整个索引。删除该缓存后,下一次备份会在重建缓存时变慢。在包含数百万个小文件的高延迟链路上,Restic 在处理相同数据时会比 Borg 更慢。
在本地磁盘或高速 LAN 上,两者的差距基本会缩小,最终速度都主要受读取和计算源数据哈希的能力限制。
锁定并备份多台计算机
Borg 1.4 会在整个操作期间对仓库加独占锁。两个客户端不能同时向同一仓库写入:第二个客户端会等待,随后因锁超时而失败。受支持的模式是每个客户端使用一个仓库。这也意味着去重只会在单台计算机的仓库内部进行,因此 10 台几乎相同的服务器会存储 10 份相同的基础系统。
Restic 允许多个客户端同时备份到一个仓库,因为备份操作只获取共享锁,只有 prune 等维护操作才会获取独占锁。将 10 台相似的服务器指向同一个 restic 仓库后,它们之间也可以进行去重,后续服务器通常只需存储很少的数据。代价是影响范围更大:所有数据共用一个密码和一个仓库,因此密码丢失会导致全部 10 台服务器的数据都无法恢复。
保留策略:先 forget 再 prune,还是先 prune 再 compact
这两个工具都会将“决定保留哪些内容”和“回收空间”分开处理,并且都要求您执行第二步。
restic forget --keep-daily 7 --keep-weekly 5 --keep-monthly 12 --prune
restic checkborg prune --list --glob-archives '{hostname}-*' \
--keep-daily=7 --keep-weekly=4 --keep-monthly=6 /srv/borg/vps1
borg compact /srv/borg/vps1两种工具都有同一个陷阱,应该明确说明。在 Borg 中,borg prune 会删除归档,但不会自行释放磁盘空间。只有运行 borg compact 后,空间才会释放。因此,只执行 prune 而不执行 compact 的 cron 作业,会使归档列表保持较短,但仓库持续增长。对于 restic,如果只运行 forget 而不运行 --prune,则只会删除快照引用,数据仍会保留,直到执行 prune。
完成 prune 后运行 restic check。它会验证仓库结构,并报告是否存在损坏。这样可以避免在恢复数据时才发现问题。
恢复是唯一有效的测试
两个工具都会挂载快照,供您浏览其中的内容。这是恢复单个文件最快的方法。
restic snapshots
restic restore latest --target /tmp/restore --include /etc/nginx
restic mount /mnt/restoreborg list /srv/borg/vps1
borg extract --list /srv/borg/vps1::vps1-2026-07-30T02:00:00 etc/nginx
borg mount /srv/borg/vps1::vps1-2026-07-30T02:00:00 /mnt/restore请注意 borg extract 中的路径格式。归档中的路径不包含开头的斜杠,因此 etc/nginx 正确,而 /etc/nginx 不匹配任何内容,也不会提取任何文件,并且不会报错说明原因。提取操作还会将文件写入当前工作目录,因此请先切换到临时目录,否则旧文件会覆盖正在使用的文件。
无论选择哪个工具,设置计划任务只完成了一半。应按固定计划将恢复操作执行到临时目录,并实际监控该任务;VPS 的 restic 备份指南的其余部分通过 systemd timer 展示了完整流程。
哪个工具适合哪类任务
目标是对象存储、希望只使用一个二进制文件且远端无需安装软件、需要让多台机器相互去重,或者执行恢复的人员可能不是您时,应选择 restic。它是一个静态单文件二进制程序,只需提供仓库 URL。从运维角度看,这种方式很难超越。
目标是您控制的 Linux 主机、链路延迟较高且数据集包含数百万个小文件、希望使用仅追加的 SSH 密钥来防范勒索软件,或者希望按任务调整压缩方式时,应选择 Borg。它是较早出现的工具,稳定版本系列的更新速度较慢;对于备份软件来说,这是一个优点。
两者都是正确的选择。错误的选择是从未测试过的那个。如果您已经在执行应用层转储,请继续保留这些转储:带数据库转储的 Nextcloud Docker 设置中的模式适用于这两个工具,因为在随机时刻复制正在使用的数据库文件,并不等于备份数据库。
FAQ
restic 和 BorgBackup 哪个更快?
在本地磁盘或高速 LAN 上,两者速度接近,最终都受源端读取速度和哈希计算速度限制。在延迟很高的 SSH 链路上处理大量小文件时,Borg 往往更快,因为远端的 borg serve 进程可以响应索引查询,无需为每个数据块进行一次网络往返。目标为对象存储时,restic 往往更快;Borg 根本无法直接使用对象存储。
BorgBackup 可以备份到 S3 或 Backblaze B2 吗?
不能直接备份。Borg 仓库由 SSH 上的 borg serve 进程提供服务,而存储桶内部不会运行此类进程。一种变通方式是使用 rclone 将对象存储挂载为文件系统,但 Borg 项目不建议这样做,因为挂载点如果在事务过程中断开,可能损坏仓库。如果需要对象存储,请使用 restic。
可以让两个工具处理同一份数据吗?
可以,有些人确实这样做:使用 Borg 备份到第二台服务器,以便快速本地恢复;使用 restic 备份到对象存储,以保存异地副本。两者不共享任何数据,因此读取和哈希计算的开销会产生两次,而且需要安全保存两组密码。只有在测试过两种恢复流程后,才应采用这种方案。
如果丢失仓库密码,会发生什么?
在这两个工具中,数据都无法恢复。restic 使用 scrypt 根据密码派生密钥,无法绕过此机制。Borg 在 repokey 模式下会将加密密钥存储在仓库中,因此只需口令即可恢复;在 keyfile 模式下,还需要来自 ~/.config/borg/keys/ 的密钥文件。请将密码保存在不位于备份服务器上的密码管理器中。如果使用 keyfile,请通过 borg key export 导出 Borg 密钥。
应该等待 Borg 2.0 吗?
不必。截至 July 2026,Borg 2.0 仍处于 beta 阶段,版本为 2.0.0b22,项目明确标注仅供测试使用。稳定版本系列为 1.4,当前版本是 1.4.5。现在即可开始使用 1.4。Borg 2 会更改仓库格式,并提供有文档说明的升级路径,因此现在开始使用不会导致以后无法迁移。