未经恢复验证的备份,只是一句声称
要点
- 每一层验证都抓到了上一层抓不到的问题:34 个文件校验和全部吻合却打不开;一次哈希比对标出了坏扇区上的一段视频,而 SMART 仍显示「Verified」。
- 给每个存储位置写出故障场景之后,我最大的单点风险落在一个 Apple 账号上。执行检查的 AI 智能体也算作数据的读取方。
- 异地副本方面,我比较了四种方案,选了 Arq 备份到 Backblaze B2:在 Mac 上加密,放在与我的邮箱分开的账号里,每月大约 1 美元。
- 一次恢复测试在 12 秒内从 B2 取回了 760 MB,每个文件都与首次保存时记录的校验和一致。
我职业生涯的很大一部分在做数据库和流处理系统。在那里,没有复制、没有经过测试的恢复、没有备份过期告警,什么都不能上线。9 月,我让自己的存储接受了同样的审计,并沿用了那份工作里的四条规则:
- 数据存放的每个位置都占一行,并配一个故障场景。
- 副本只有经过检查才算备份,检查分三层:数文件、算哈希、打开文件。每一层都能抓到上一层抓不到的问题。
- 落后的备份会触发警报。
- 干活的 AI 智能体也算作数据的读取方。
每个存储位置一行,一个故障场景
清单是一个 TOML 文件,Mac、外置硬盘、iCloud、Google、GitHub 和智能体的对话记录各占一行。每一行写明 Mac 坏了、房子烧了、账号把我锁在外面时我会丢失什么,再由一个脚本把这个文件渲染成按故障组织的页面。
这样写出来之后,最大的单点风险是一个账号。开启「优化 Mac 储存空间」后,Mac 只保留放得下的照片原件,图库的其余部分只存在于 iCloud。我开了「高级数据保护」,所以 Apple 不持有密钥,也无法替我恢复账号。保护好账号只是一半的修复,另一半是在账号之外留一份副本。
这份副本是每季度用 osxphotos 把原件导出到本地硬盘。它会记住已经导出过的内容,所以之后每次只复制新照片。第一次运行只跑到 25 Mbit/s,而这条线路的测速是 909。「照片」从 iCloud 逐个下载缺失的原件,每一项的等待时间占了大头。
验证分三层:计数、哈希、打开
每一层都比上一层代价更高。对照清单计数很便宜。我检查第一份时间机器备份的方法,是以只读方式挂载快照并重新清点文件。计数看不出被截断的文件。哈希看不出复制之前就已损坏的文件。
SMART 显示「Verified」时,哈希比对抓到了一个坏扇区
一块存视频的硬盘本应在第二块硬盘上有完整副本。便宜的双盘位硬盘座无法同时运行两块 3.5 英寸硬盘(第二块会从总线上掉线),所以比对只能一次一块盘:把每个文件的哈希写进 Mac 上的清单,换盘,再算一遍哈希,比对两份清单。每块盘一个晚上。
除了一个 252 MB 的视频片段,所有文件都吻合,而通宵那一轮已经把它从头读到了尾。第二天早上复制它时,在 76.5 MB 处出现 I/O 错误,两次都卡在同一个字节。这块硬盘的 SMART 摘要依然显示「Verified」。我放弃了这个片段。比对把一个未知变成了一处已知的损失,没有它,我说不出其他文件里哪些是安全的。
34 个文件校验和吻合,却打不开
一块旧 SSD 显然适合做时间机器磁盘,但上面存着我想保留的照片和视频。抹掉之前,我把它复制了两份,并用 SHA-256 清单核对两份副本。每个文件都吻合。然后逐个打开每个文件:解码每张图片,完整播放每段视频,解析每份文档。34 个失败了。
副本与源盘的哈希一致,所以损坏出在原始硬盘上,很可能已经有好几年了。这些文件写入之后再没人打开过。随后这块硬盘被抹成加密的 APFS,成了时间机器磁盘。
智能体算作数据的读取方
大部分工作由一个智能体完成:它测量硬盘、编写清单、搭建页面、运行导出。它打开的所有内容都会发给模型提供商,按对方的保留条款存放,同时也会落进我在 Mac 上保存的对话记录里。
所以存有个人文档的文件夹设为先问再读:每次读取都要我批准。最敏感的文件移进了一个加密磁盘映像,删除原件之前做过哈希校验。这个映像是禁区,因为挂载它需要一个只有我会输入的密码。
起初并不是这样。我打开映像测试时,它没有弹出密码提示就挂载了。创建映像时,macOS 把密码存进了登录钥匙串,所以这层加密能防住所有人,只有坐在我已解锁的 Mac 前的人除外。智能体试图读取钥匙串条目来找出保存的密码时,它自己的权限检查以探查凭据为由拒绝了这条命令,于是这一步由我手动完成。条目在「钥匙串访问」里(我第一次搜索找的是较新的「密码」App,没找到)。删掉它之后,密码提示又回来了。
异地备份每月约 1 美元,功夫花在选择上
现在每个重要的存储位置都有两份副本,但两份都在同一个房间里。故障场景决定了异地副本必须覆盖什么:
- 场所损失(火灾、失窃):另一栋建筑里的一份副本。
- 删除和勒索软件:带日期的快照,这样我能把一个文件夹恢复成上周二的样子。iCloud 云盘或 Google 云端硬盘客户端这类同步文件夹,会把删除也同步过去。
- 账号丢失:放在存有我邮箱的账号之外。
- 提供商遭入侵:在 Mac 上加密,密钥只有我持有。
- 恢复:每小时一个恢复点,并且在新 Mac 上不用终端就能完成恢复。
异地备份的范围是文档、扫描件、项目数据和智能体对话记录,视频不在其中。10 月 10 日,我比较了四个方案:
| 方案 | 100 GB 的费用 | 谁持有密钥 | 隐患 |
|---|---|---|---|
| Arq 7 备份到 Google 云端硬盘 | 一次性 $59.99,另加 Google 2 TB 方案每月 $9.99 | 我 | Arq 的发布说明里,2021、2023 和 2024 年都有针对 Google 配额的修复 |
| Arq 7 备份到 Backblaze B2 | 一次性 $59.99,另加每月约 $0.70(每 TB $6.95) | 我 | 要持续付费给两家供应商 |
| restic 或 Kopia 备份到 B2 | 自由软件,另加每月约 $0.70 | 我 | restic 没有 App,所以要自己安排定时、在终端里恢复;Kopia 有 App,但版本还停在 0.23 |
| Backblaze Personal Backup | 每年 $99,不限容量 | Backblaze,除非我设置私钥 | 在默认的 30 天历史下,一块 30 天没接上的硬盘可能会被删除 |
Google 云端硬盘是最省事的选择,但它不满足账号这一条:一次锁号,邮箱和备份一起没了。
付费买的是易用性,不是安全性。加密数据放在 B2 上,用 2015 年起就在发布的 restic 和用 Arq 一样安全。Arq 出自一家小公司 Haystack Software,但它的数据格式是公开的,所以即使公司倒闭,备份也仍然可读。这 $60 买的是在新 Mac 上点几下就能完成的恢复,不需要终端,也不需要智能体。
工具的选择可以反悔:换工具的代价是重新上传,大约一天。丢了加密密码则无法挽回,因为谁都无法重置它,供应商也不能。
我选了 Arq 备份到 B2。结果薄弱环节是 Backblaze 账号。它的两步验证码发到 Gmail,所以任何进得了我 Gmail 的人都能登录并删掉备份。现在它改用验证器 App,出于同样的原因,我也没有用「使用 Google 账号登录」。
备份工具每个数据块只上传一次,并保留每个版本
Arq 的一个快照是所有文件及其组成数据块的完整列表,但每个数据块只上传一次。Arq 用内容的哈希给数据块命名,并跳过存储桶里已有的数据块,所以首次上传之后,每小时一次的运行只发送 15 到 45 MB。旧快照几乎不占成本,因为它们与新快照共享数据块。
| Arq 7 | restic | Kopia | |
|---|---|---|---|
| 数据块在哪里切分 | 未公开(Arq 5 用的是滚动校验和) | 按内容切分(Rabin),平均约 1 MiB | 按内容切分(buzhash) |
| 数据块命名 | 哈希混入秘密盐值;公式未公开 | 明文 SHA-256,保存在加密的索引文件里 | 用秘密密钥做 HMAC |
| 加密 | AES-CBC 加 HMAC-SHA256 | AES-256-CTR 加 Poly1305 | AES-256-GCM 或 ChaCha20-Poly1305 |
| 由密码派生密钥 | PBKDF2,200,000 轮 | scrypt | scrypt |
| 删除旧数据 | 每次备份之后 | prune;运行期间任何备份都无法完成 |
经过一段安全延迟后做垃圾回收 |
按内容分块意味着,在文件中间插入内容只会移动附近的块边界,文件其余部分仍与已存储的数据吻合。
数据块的名字之所以重要,是因为存储提供商看得到它们:明文哈希让任何持有存储桶的人都能检查我是否存了某个他们手上也有的文件。Kopia 和 Arq 把一个秘密值混进名字里。restic 把明文哈希藏在加密的索引文件中,它的设计文档也写明了仍然存在的泄露。在 B2 控制台里,我的存储桶是一些编号文件夹,里面是随机命名的对象,客户端加密从外面看本该如此。
删除旧数据是危险的一步。让一个快照过期,意味着找出剩余快照都不再使用的每个数据块,并且只删除这些。一旦弄错,之后的恢复就会缺块。restic 在清理期间暂停备份,Kopia 则在删除前等待一段安全期。
接着我用同一层哈希检查测试了一次恢复:五份扫描的报纸,约 760 MB,12 秒内从 B2 取回,大约 500 Mbit/s,五份都与扫描件入库时我写下的 SHA-256 清单一致。按这个速度,整份备份不到一小时就能取回。我没有给完整恢复计过时,而且成千上万个小文件会比五个大文件慢。
备份落后时,页面会变红
清单页面实时读取磁盘,所以时间机器一旦落后,不用任何人检查就会变红。一份悄悄停掉的备份,在需要恢复的那天之前,看起来和正在运行的备份没有区别。
10 月做过一次恢复,验证了 B2 上的副本。目前还没有任何机制检查它是否仍在运行,这个警报是下一步。