什么是 restic?
restic 是一个快速、省空间且安全的备份程序。它按内容切分文件块,相同的块只存一份,所以对几乎没有变化的目录做第二次备份,几乎不需要传输任何东西。所有数据在离开你的机器之前,就已经用 AES-256 加密、用 Poly1305-AES 认证完毕,因此仓库完全可以放在你并不完全信任的地方。快照只追加不修改,可以列出、比较、挂载成文件系统,也可以逐个文件恢复,每件事一条命令,不需要写任何配置文件。
prune 与 check 的修复、大仓库上的内存优化以及新增的存储后端,都只会出现在 restic 的新版本里。Debian 稳定版里的版本落后好几年:新版 restic 写出来的仓库,旧版可能读不了,所以负责恢复的机器至少要和做备份的机器一样新。到处都用当前版本,是保证这一点最简单的办法。
⚡ restic 的主要特性
🧩 真正有效的去重
基于内容的切块意味着:没变过的文件、只是挪了位置的文件、以及十台机器上都有的同一个文件,都只存一份。同一棵目录树的每日快照,只花掉差异的代价,而不是整棵树。
🔐 出门之前就已加密
内容用 AES-256,认证用 Poly1305-AES,都在客户端完成。仓库里既没有明文,也没有未经认证的数据:不怀好意的存储方可以弄丢你的备份,但读不了,也伪造不了。
☁️ 哪里都能放的后端
本地目录、SFTP、REST 服务器、Amazon S3 及一切 S3 兼容服务、OpenStack Swift、Backblaze B2、Azure Blob Storage、Google Cloud Storage,其余的一切都可以通过 rclone。
📸 可以翻看的快照
restic snapshots 列出快照,restic diff 显示两个快照之间的变化,restic mount 把每个快照挂到一个目录下,单个文件用 cp 就能拿回来。
🧹 保留策略与清理
forget --keep-daily/--keep-weekly/--keep-monthly 可以直接写出保留策略,随后 --prune 会把仓库里的空间收回来。
🔎 可校验的仓库
restic check 校验仓库结构,--read-data 会重新读取并重新验证每一个 pack 文件,于是“备份还在”和“备份完好”成了两个你真的能回答的问题。
apt upgrade 就能让你保持最新。
📦 从 deb.griffo.io 安装
第 1 步:添加仓库
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | sudo gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | sudo tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
sudo apt updateinstall -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
apt update🆓 有一个永久免费的镜像。 deb-free.griffo.io 永久免费提供软件包 — 无需账号、无需订阅,最多落后上游 2 个月,安全修复立即发布。目前收录 cliamp、Ghostty、lazydocker、Oh My Posh 和 Zed;restic 不在其中,因此今天只能通过上面的仓库安装 — 提出请求即可将其加入。
第 2 步:安装 restic
# 安装最新版 restic
sudo apt install restic
# 验证安装
restic version# 安装最新版 restic
apt install restic
# 验证安装
restic version第 3 步:创建第一个仓库
# 仓库就是一个目录,本地或远程都行。设一个密码,并且务必保管好:
# 没有它数据就找不回来了,这是刻意的设计。
restic init --repo /srv/backup/restic
# 备份一些东西
restic -r /srv/backup/restic backup ~/Documents
# 看看都有什么
restic -r /srv/backup/restic snapshots
# 手册页以及 bash、fish、zsh 补全都在软件包里
man restic🎯 基本用法示例
做备份:
# 把密码放进文件,而不是每条命令都敲一遍
echo '一段很长的口令' | sudo tee /etc/restic-password > /dev/null
sudo chmod 600 /etc/restic-password
export RESTIC_REPOSITORY=/srv/backup/restic
export RESTIC_PASSWORD_FILE=/etc/restic-password
# 备份多个路径,跳过恢复时并不需要的东西
restic backup ~/Documents ~/Pictures --exclude '**/node_modules' --exclude '*.iso'
# 或者用文件来驱动,一行一个模式
restic backup ~ --exclude-file ~/.config/restic-excludes --exclude-caches
# 给快照打标签,方便以后查找
restic backup /etc --tag config --tag "$(hostname)"# 把密码放进文件,而不是每条命令都敲一遍
echo '一段很长的口令' | tee /etc/restic-password > /dev/null
chmod 600 /etc/restic-password
export RESTIC_REPOSITORY=/srv/backup/restic
export RESTIC_PASSWORD_FILE=/etc/restic-password
# 备份多个路径,跳过恢复时并不需要的东西
restic backup ~/Documents ~/Pictures --exclude '**/node_modules' --exclude '*.iso'
# 或者用文件来驱动,一行一个模式
restic backup ~ --exclude-file ~/.config/restic-excludes --exclude-caches
# 给快照打标签,方便以后查找
restic backup /etc --tag config --tag "$(hostname)"恢复与浏览:
# 仓库里有什么
restic snapshots
restic ls latest /etc
# 从最新的快照恢复全部内容
restic restore latest --target /tmp/restore
# 或者只恢复你真正丢掉的路径
restic restore latest --target / --include /etc/nginx
# 挂载整个历史,手动把文件拷出来(需要 FUSE)
sudo apt install fuse3
mkdir -p ~/mnt/backup
restic mount ~/mnt/backup
# 两个快照之间有什么变化
restic diff 1a2b3c4d 5e6f7a8b# 仓库里有什么
restic snapshots
restic ls latest /etc
# 从最新的快照恢复全部内容
restic restore latest --target /tmp/restore
# 或者只恢复你真正丢掉的路径
restic restore latest --target / --include /etc/nginx
# 挂载整个历史,手动把文件拷出来(需要 FUSE)
apt install fuse3
mkdir -p ~/mnt/backup
restic mount ~/mnt/backup
# 两个快照之间有什么变化
restic diff 1a2b3c4d 5e6f7a8b远程仓库:
# SFTP:任何你本来就能 ssh 上去的机器
restic -r sftp:backup@nas:/srv/restic init
# S3 及一切 S3 兼容服务,包括自建的 Garage 或 MinIO
export AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=...
restic -r s3:https://s3.example.com/backups init
# Backblaze B2
export B2_ACCOUNT_ID=... B2_ACCOUNT_KEY=...
restic -r b2:my-bucket:backups init
# rclone 能到的地方,也就是其余的一切
restic -r rclone:mydrive:backups init保留、清理与校验:
# 对整个仓库生效的保留策略
restic forget --keep-daily 7 --keep-weekly 5 --keep-monthly 12 --prune
# 先试运行,因为 forget 会删除快照
restic forget --keep-daily 7 --dry-run
# 结构检查,开销小,可以经常做
restic check
# 重新读取并校验一部分真实数据,开销大,每月做一次
restic check --read-data-subset 10%
# 空间都花到哪里去了
restic stats --mode raw-data🔧 工具集成
restic 就是设计成由你手上已有的东西来驱动的:
- systemd:一个 service 加一个 timer 就是常见的无人值守做法;
RESTIC_REPOSITORY和RESTIC_PASSWORD_FILE写进 unit,而不是 shell 配置里 - rclone:
rclone:后端让 restic 拥有 rclone 支持的所有服务商,而 restic 自己一个都不用去对接 - FUSE:
fuse3(或fuse)让restic mount变成一个可浏览的、包含全部快照的目录,这是找回单个文件最快的办法 - rest-server:上游自己的 HTTP 后端,支持只追加模式,即使客户端被攻破,也删不掉它已经做好的备份
- 数据库:
--stdin从标准输入接收导出内容,所以pg_dump … | restic backup --stdin --stdin-filename db.sql完全不落盘
🚀 为什么选择 deb.griffo.io?
- 官方 Ubuntu:universe 中有 restic,冻结在发行版发布之时,一台 LTS 上可能落后好几年的仓库与清理改进
- 上游二进制:是最新的,但那是一个 bzip2 压缩的二进制文件,要你自己解压到
/usr/local/bin,游离在 apt 之外,之后还得靠restic self-update维护 - Snap:受沙箱限制,备份家目录以外的路径、挂载快照都比本该有的样子更麻烦
- deb.griffo.io:最新版本,自动更新
- ✅ 同一个包,只是更新:与 Ubuntu 自带的
restic同名、同 section、同路径,是替换而不是再装一份 - ✅ 经过验证的上游构建:每个二进制都会先与上游的
SHA256SUMS核对,而该文件本身也会与 restic 的发布密钥核对,然后才打包 - ✅ 自动更新:上游发布后数小时内更新软件包
- ✅ 完整软件包:官方上游二进制文件,加上完整的手册页(
restic.1以及每个子命令一页)和 bash、fish、zsh 补全 - ✅ 六种架构:amd64、arm64、armhf、ppc64el、s390x 和 riscv64——NAS、树莓派和大型机拿到的是同一个 restic
- ✅ 多发行版:支持 Ubuntu 22.04、24.04、25.10 和 26.04
- ✅ 易于维护:使用标准 apt 命令即可更新
📦 软件包构建仓库
Ubuntu 软件包在这个 GitHub 仓库中自动构建和维护:
- 💾 restic-debian - 最新版本构建
🔗 相关软件包
deb.griffo.io 同样提供:
- rclone - 让 restic 用上其余所有服务商的后端
- Garage - 自托管的 S3 存储,可以把仓库放上去
- Zellij - 多路复用器,让漫长的首次备份持续跑下去
- bottom - 看看一次大备份对机器做了什么
