# Frost 的工作原理 Frost 为你的文件夹创建快照,把文件拆分成加密的数据块,并且只上传存储中还没有的数据块。 ## 简要流程 1. **扫描。** Frost 遍历你的文件夹,但不会处理跳过列表中的内容。自上次备份以来大小和修改时间都没变的文件,只要 Frost 的缓存仍记录着它们的全部数据块,就不会再次读取。 2. **分块。** 有变化的文件会被拆分成约 1 MiB 的数据块,拆分点由文件内容决定。在大文件中间改动一处,只会影响附近的几个数据块。 3. **加密。** 每个新数据块如果压缩后能变小,就先压缩,然后用你的密钥加密。 4. **上传。** 只上传存储中还没有的数据块。 5. **保存快照。** Frost 把文件列表,以及每个文件由哪些数据块组成,保存为一个新快照。 6. **检查。** Frost 随机下载一部分数据块并逐一检查。 ## 快照 快照记录了备份运行那一刻你的文件夹:每个文件和文件夹,连同它们的内容、权限和修改时间。每个快照本身都是完整的,所以任何一个快照都可以单独恢复,不依赖其他快照。 快照之间共享数据块。一个一年没改过的文件只存储一份,无论有多少个快照包含它,所以保留很多快照只会多占很少的空间。 如果自上次备份以来什么都没变,Frost 不会保存新快照,而是告诉你文件夹已经备份好了。 快照 ID 形如 `maple-absurd-3f1c`:两个单词,再加四个字符。[恢复文件](#restoring)说明了如何按 ID 或按时间挑选快照。 > Frost 目前还不能删除旧快照,所以每个快照都会一直留在存储中。不要手动删除存储里 Frost 文件夹中的对象,也不要添加让它们过期的规则。快照之间共享数据块,删掉一个对象就可能损坏许多快照。 ## 你的密钥 `frost init` 会在你的电脑上生成一个随机的 256 位密钥,并以 24 个单词的恢复短语展示给你。密钥永远不会离开你的电脑。Frost 上传的所有内容都会先用它加密,包括文件名和文件夹结构。 任何同时拥有恢复短语和存储访问权限的人,都能读取你的备份。没有恢复短语,谁也读不了。参见[恢复短语](#recovery-phrase)。 ## 仓库 Frost 把备份保存在存储中的一个文件夹里,这个文件夹叫作仓库。仓库中有四类对象: | 对象 | 内容 | | --- | --- | | `frost.repo` | 仓库的 ID 和格式版本 | | `chunks/` | 加密后的文件数据和文件列表 | | `snapshots/` | 每个快照一份小小的加密头信息:何时创建、在哪台电脑上、包含哪些文件夹 | | `trees/` | 每个快照的文件列表存放在哪些数据块中 | 对象名称是看起来随机的 ID,所以运营你存储的人永远看不到你的文件名。[安全与隐私](#security)列出了存储能看到的内容。 在自托管服务器或本地磁盘上,每个对象都是仓库文件夹中以该名称命名的文件。在 S3 存储桶中,它是同名的对象,所以仓库可以在它们之间复制。参见[迁移备份](#moving-backups)。 ## 本地缓存 Frost 会在电脑上的缓存文件夹中记录已经上传过的内容,这样每次备份时就不必把存储中的所有对象列一遍。它每周会把这份记录和存储核对一次,也会在存储位置变动后或检查发现数据缺失后重新核对。 缓存可以随时丢弃。缓存丢失后,下一次备份会根据存储重建它,并重新读取你的文件。恢复完全用不到缓存。 ## 没有后台服务 Frost 不在后台运行。自动备份是操作系统计划程序(launchd、systemd、cron 或任务计划程序)中的普通任务,它们启动 Frost,运行一次备份,然后退出。参见[自动备份](#scheduling)。 ## 自我检查 每次保存了快照的备份之后,Frost 都会随机下载一部分数据块,检查每一块能否解密、是否与它的 ID 相符。如果某次备份没有新内容,只有当上一次检查已经超过一天时才会再检查一次。参见[检查备份](#checking-backups)。