跳转到内容

Farsite — 把一群不可信桌面 PC 拼成一台可信文件服务器

是什么

Farsite 是 Microsoft Research 2002 年发的一个分布式文件系统,核心想法很反直觉:用一栋楼里上千台单独都不可信的桌面 PC,拼出一台对外行为像 NTFS 服务器的可信文件服务器

日常类比:你想让一群陌生路人帮你保管一份重要文件。你不能信任任何一个人——他可能弄丢、可能偷看、甚至可能伪造内容还给你。Farsite 的回答是:

  • 把文件剪碎、加密、撒到很多人手里,少一两份还能拼回来
  • 一份文件想被算”权威版本”,得三分之二的人同时点头才作数(拜占庭多数)
  • 谁说自己存的就是原文?附加密签名,签错了一眼识破

把这三招合起来,就把”每个人都不可信”翻译成了”整体可信”。

为什么重要

不理解 Farsite,下面这些话题就拼不起来:

  • 为什么后来的 Tahoe-LAFS、IPFS、各种”去中心化存储”都长得像它——它是这一支的早期教科书实现
  • 拜占庭容错(BFT)+ 加密分片第一次在一个真系统里同时落地,不是论文里的玩具
  • 为什么它的去重技术(convergent encryption)变成了现代云备份的标准做法(Dropbox 早期、tarsnap、restic 都用)
  • 它给出”对元数据用昂贵协议、对数据用便宜复制”的分层信任思路,被后来无数系统抄

那个年代企业里桌面 PC 大量闲置硬盘,这篇论文相当于问了一个朴素问题:这些硬盘加起来有几百 TB,能不能不买专门的服务器,就用它们当备份? 工程上没人真敢这么部署,但论文里的协议设计影响了后面 20 年。

核心要点

Farsite 解决三个核心问题:完整性(文件没被偷改)、机密性(别人看不见内容)、可用性(部分机器下线还能读)。每个问题都用一招对应。

1. 元数据用拜占庭容错(BFT)

文件系统的”目录树”是命脉——谁拥有哪个文件、权限是什么、最新版本是哪个。这部分不能错

Farsite 把目录服务交给一个 3f+1 台机器组成的小组(典型 4 台,能容忍 1 台作恶)。任何修改都要走 Castro-Liskov 的 PBFT 协议——多数派投票通过才生效。

类比:四个人共同保管一本账本。要改一笔账,必须三个人同时签字才行。一个人偷偷篡改没用,对不上其他三人就被识破。

代价不小:每次目录修改都要多轮网络往返。但目录操作不频繁(相对读写),值得。

2. 文件数据用随机复制 + 加密签名

数据 GB 级,跑 BFT 太贵。Farsite 改成:每个文件随机选 N 台机器存副本(N 通常 3 到 5)。

但副本不是裸文件,而是用文件 owner 的密钥加密 + 签名后的版本。任何一台机器返回数据时:

  • 客户端用 owner 的公钥验签——签名对得上才信
  • 内容被加密——存放方根本看不见内容

机器作恶能干什么?最多是拒绝返回返回旧版本。它不能伪造。少数几台坏了,就从其他副本读。

3. convergent encryption 让加密文件也能去重

公司里”同一份 Office 文档存了 100 份副本”很常见。普通加密会让 100 份变成 100 个不同密文,没法去重。

Farsite 的招:用文件内容本身的哈希作为加密密钥。两份相同明文 → 哈希一样 → 密钥一样 → 加密出来的密文也一样 → 系统一眼看出是同一份,只存一份。

类比:每个文件不取流水号,而是按”指纹”分组归档。指纹相同的自动合并。但每份文件被外人翻开时还是密文——只有持有原文件的人能解开。

这一招后来叫 convergent encryption,被无数云备份系统继承。

4. 客户端缓存:借鉴 AFS 的整文件 + 租约

读写性能怎么办?Farsite 抄 AFS 的招——客户端整文件缓存到本地,平时读写完全在本地,只在写回 / 失效时联系 BFT 目录组。

每个缓存对应一个租约(lease),到期或被通知失效就标记作废。这一段在 afs-1988 详细讲过。

实践案例

案例 1:写一个文件 hello.txt

  1. 客户端在本地写好内容
  2. 用 owner 密钥加密 + 签名 hello.txt(密钥来自内容哈希,做 convergent encryption)
  3. 联系目录组(4 台 BFT 机器):申请创建 hello.txt 元数据
  4. BFT 组多数派同意 → 元数据写入,分配 5 台候选机器存副本
  5. 客户端把密文同时发给这 5 台
  6. 5 台落盘后回 ACK,写完成

整个过程客户端的密钥从没出过本机——存放方拿到的永远是密文。

案例 2:某台存放机被偷了

公司里桌面 PC 被拔走、被重装、被插 U 盘,常见。攻击者拿到硬盘以后呢?

  • 看不到内容:硬盘上是密文,没有 owner 密钥解不开
  • 改不了内容:动一个 byte,签名就对不上,客户端立刻拒绝
  • 阻止不了别人读文件:副本还有 4 份,少这一份不影响

最多就是少了一个副本。Farsite 后台进程会发现副本数 < 阈值,自动找新机器再补一份。

案例 3:BFT 目录组里有人作恶

假设 4 台目录机里 1 台被入侵,开始返回假元数据(说”hello.txt 被删了”)。

PBFT 协议要求多数派一致才生效。这台坏机器声音再大,剩下 3 台说没删就是没删——客户端听多数派的。坏机器最多让协议慢一点(多走一轮),但不能让数据出错。

这就是 BFT 那个 f = (n-1)/3 公式的由来:4 台容 1 个坏的,7 台容 2 个,10 台容 3 个。

踩过的坑

  1. BFT 协议代价仍然很高:哪怕只用在元数据上,每次目录修改也要好几轮网络。Farsite 在论文里花大段讲怎么把多个修改打成 batch,怎么让 lease 替代实时通信。
  2. convergent encryption 有侧信道:攻击者如果知道某个文件的明文(比如猜你存了一份《哈利波特》PDF),他能算出它的密文,然后看你那台机器有没有这个密文 → 推断你”存过这本书”。这叫 confirmation attack,后来 Tahoe-LAFS 用 per-user 盐避免了。
  3. 桌面 PC 实际可用率没有论文乐观:作者在另一篇论文(Bolosky 2000)测过工业园区桌面 PC 的可用性分布,平均 80% 在线但抖动剧烈。Farsite 副本数得开得不小,否则可用性差。
  4. 企业从没真的部署它:Farsite 是研究项目,没成产品。它的协议设计倒是走进了 Microsoft 内部其他系统、外部学术界,影响远大于自身落地。

适用 vs 不适用场景

适用:

  • 一群机器互相不可信但整体多数可信的环境(企业内网桌面、跨机构联邦存储)
  • 写少读多 + 文件系统语义(非数据库)
  • 数据冗余 + 隐私保护双要求

不适用:

  • 单组织全可信场景(用 NFS / 普通分布式 FS 即可,BFT 是浪费)
  • 数据库 / 高频随机写(整文件缓存吃不消)
  • 完全去中心、零协调的场景(Farsite 还有 BFT 目录组这层”次中心”,不是 P2P)

学到什么

  1. 承认不可信,再用密码学转化成可信——这是 Farsite 最深的哲学,影响了之后所有去中心化存储设计
  2. 按代价分层信任:元数据 BFT,数据普通复制,缓存 lease——每一层用刚刚够的协议
  3. convergent encryption 是 hash-as-key 的早期典型应用,加密和去重不是天敌
  4. f = (n-1)/3 这个比例(容少数派作恶)来自 BFT 推导,不是拍脑袋——副本数永远要按它配
  5. 一个研究系统不必落地也能影响 20 年——Farsite 没人用,但它定义了后人的语汇

关联

  • afs-1988 —— 客户端整文件缓存 + lease 思路 Farsite 直接继承
  • castro-liskov-bft —— Farsite 元数据组用的就是这套 PBFT
  • ipfs-2014 —— 后来的去中心化存储,思路同源
  • byzantine-generals-1982 —— BFT 模型的鼻祖
  • merkle-tree-1979 —— 内容寻址 + 完整性校验的根,convergent encryption 的近亲

延伸阅读

反向链接

  • afs-1988 —— AFS 1988 — 客户端缓存 + 回调失效让分布式文件系统真正能扩展
  • byzantine-generals-1982 —— 拜占庭将军问题 — 节点能撒谎时怎么达成一致
  • ipfs-2014 —— IPFS — 把”地址”换成”内容本身”的 P2P 文件系统