rustic是使用rust实现的基于 restic 协议的高效、开源增量备份工具,速度快性能强。能胜任备份大量文件的同时排除不需要的目录。本文是我在windows下用其备份电脑重要文件的经验。

安装(windows)

建议通过 scoop 进行管理

# 如果尚未安装 scoop
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression

# 安装 rustic
scoop install rustic

跨盘备份

我的备份位置放在移动硬盘E盘(盘符不一定固定),备份目标是C盘下的用户目录。rustic命令行使用windows的带盘符和冒号的路径失败,可以在E盘根目录创建一个软连接(DISK_C)指向C盘,命令中就可以使用/DISK_C代表C盘。

  • 打开管理员模式 CMD。
  • 切换到备份盘(例如 E 盘)根目录
  • 创建链接:mklink /D DISK_C C:\
  • 以后在命令行中,你就可以使用 \DISK_C 这种优雅的路径格式来访问 C 盘内容,完美规避盘符导致的路径解析问题。

初始化仓库

在备份盘创建一个专门存放仓库的文件夹,并执行初始化:

rustic init
  • 小贴士:Rustic 的工作逻辑与 git 有相似之处。

在该目录创建配置文件,以后写命令就不用指定配置文件路径了:

# rustic.toml
[repository]
# 仓库存放位置,类似.git
repository = "./repo"
# 密码
password = ""

排除目录

  • 如果备份目标有许多使用git的项目目录可以使用--git-ignore参数
  • --git-ignore需要.git目录存在才生效。
  • 可以使用--glob-file指定glob语法的文件。
  • 可以同时使用--glob-file和--git-ignore
  • 如果又想使用--git-ignore又想包含.gitignore排除的部分文件, 做不到。推荐此时不使用--git-ignore,在--glob-file里添加一些.gitignore常排除的大目录规则。
  • glob规则文件里使用#写注释时不要个规则写在同一行。
  • glob规则文件里仅推荐排除规则。
  • !**/a/b/:精确排除任意深度的 a/b 目录。

glob文件示例:

# 在此处编写排除规则,注意 # 注释需独占一行
!node_modules/
!**/target/debug/
!.venv/
!site-package/
!__pycache__/

排除哪些目录?

如果你要备份的是windows用户文件夹,不知道哪些可以排除。可以使用treesize软件挨个排查。此软件有免费绿色版。

开始备份

在执行真实的备份前,请务必进行“演习”:

  • Dry Run (预演): rustic backup \DISK_C\Users\用户名\ --glob-file=main.glob.txt -n 通过观察估计的备份文件大小,确认是否配置正确。去掉参数-n即可实操。
  • 常用管理命令:
    • 查看所有快照:rustic snapshots
    • 列出特定快照内的文件,快照ID可以像git一样只写前几位:rustic ls <快照ID>
    • 列出快照内指定路径: rustic ls 快照ID:路径
    • 当然可以用latest代表最新快照ID,只有一个备份任务时尤其好用。

还原文件

  • 推荐还原到新的空目录: rustic restore <快照ID> <目标文件夹>
  • 同样,可以只还原指定路径: rustic restore <快照ID>:路径 <目标文件夹>
  • 文件管理器浏览快照内部:
    • 持续运行: rustic webdav <快照ID>
    • 打开Windows文件资源管理器,输入地址并回车(8000是上一步输出的端口号): \\localhost:8000\DavWWWRoot\

删除快照

  • 注意查看快照时间顺序,别把最新的快照删了: rustic forget <快照ID>
  • 上面只是标记删除,这一步才是真正释放空间: rustic prune