macOS 的 Time Machine 备份做全盘备份非常方便,但它需要格式化目标盘(为啥需要这种鬼操作?),需要在 macOS 自身留一份快照占用磁盘,备份极其缓慢,不方便看备份进度,所以想找一个开源的轻量级点的备份工具用来备份少量目录,需要满足如下几个目标:

  • 支持文件去重和压缩以节约备份磁盘空间
  • 支持加密
  • 方便使用,无需研究配置文件
  • 支持快照体验的备份查看
  • 支持稀疏文件以方便备份虚拟机镜像,如 Docker、VirtualBox、VMWare
  • 最好能支持直接备份到云存储,不需要在本机先缓存备份文件再同步到云存储

Unix/Linux 上有一些老牌的备份工具,比如 rsnapshotrdiff-backup,我自己就在 macOS 上常年跑 rsnapshot 备份到本机上 /opt/ 下,注意 rsync 是个文件同步工具,严格来说并不是备份工具,因为备份需要保留历史版本,不过 rsync 以及 librsync 被很多备份工具用来高效的备份文件。 rsnapshot 和 rdiff-backup 以及不太知名的 storeBackup 的备份保留了源文件的目录结构,或通过硬链接、或通过反向增量来节约磁盘,但 rsnapshot 和 rdiff-backup 不支持文件去重、压缩、加密、稀疏文件,rsnapshot 需要配置文件,使用略微复杂,storeBackup 支持去重和压缩,但是不支持加密、稀疏文件。

备份文件是个硬需求,很多工具陆续被开发出来,超级牛力的 Dar,Gnome Deja Dup 依赖的 Duplicity,Gnome Pika Backup 依赖的 BorgBackup,KDE Kup 依赖的 Bup,以及更新的 ResticKopia,在 deajan/backup-bench 有一个很专业的比较,综合下来看,Kopia 最值得关注:

  • 类似 GIT objects 存储方式的 chunk 化存储,天然支持去重,Kopia 也支持各种压缩算法
  • 支持加密
  • 使用方便,命令行略微繁琐点,但它有个内置的 web UI
  • 支持 FUSE mount 以及 web UI 提供历史备份的快照访问
  • 支持稀疏文件
  • 可以直接备份到云存储,其中的一个后端 rclone 支持大量的云存储方案
  • 可以作为云存储的代理提供给多个用户备份文件,支持认证和授权,支持 HTTP Rest API(注意云存储的加密是在 Kopia 做的,因此管理员可以解密所有文件)
  • 支持 Reed Solomon 纠错码
  • 支持定时备份(本机运行 server)
  • 支持对不同目录设置不同的备份策略,包括年月周日的轮转、文件排除、压缩算法等等
  • Kopia 的备份速度非常非常快,备份压缩比很高,在一众开源工具里数一数二

唯一的不足是 Kopia 目前还没有发布 1.0 版本,不过著名的 Gnome 御用 Duplicity 这么多年了也只发展到 0.8.22……

Kopia 使用 Apache License 2.0,不对软件造成的数据损坏负责,俺也一样,请自行斟酌,重要文件建议用 rdiff-backup/rsnapshot/storeBackup/duplicity/dar/tar 再备份一遍……

Kopia 官方文档很全面,这里简单列一下最常用的命令:

# Kopia 是用 Go 编写的,自己编译一份也非常简单
brew install kopia

# kopia 或者 kopia help 或者 kopia --help 或者 man kopia 都能看到帮助

# Repository 指备份库,Kopia 支持很多种备份库后端,
# 这个命令会要求输入加密的密码,密码输入一次后,只要不执行 kopia repository disconnect 就一直会被记住,
# 类似 docker login 的效果
kopia repository create filesystem --path=$PWD/kopia-repos

# 设置压缩算法为 zstd,默认不压缩
kopia policy set --global --compression=zstd

# Snapshot 指一份备份,它备份的效果是给人感觉做了个文件快照。
# 备份文件,这个命令可以重复执行,不使用 kopia server 的话就需要放到 cron job 里。
kopia snapshot create /path/to/your/important/files

# 备份另一个目录
kopia snapshot create /path/to/another/important/files

# 查看备份列表
kopia snapshot list

# 恢复文件, 支持稀疏文件,kXXXXX 在 kopia snapshot list 输出里可以看到,some-target-dir 指恢复到什么目标目录或者目标文件
kopia restore --write-sparse-files kXXXXXXXXX some-target-dir-or-file

# 恢复部分文件出来,支持稀疏文件
kopia restore --write-sparse-files kXXXXXXXXX/foo/bar some-target-dir-or-file