用 FUSE 把 Proton Drive 挂成 Linux 本地目录的做法与限制

用 FUSE 把 Proton Drive 挂成 Linux 本地目录是可行的,proton-drive-fs 用一个常驻守护进程把网盘按需映射成文件系统。打开文件时才下载需要的块,保存文件先写本地临时文件,关闭并等过一段延迟再整份上传。它不做全量同步,本地不留完整副本。

FUSE 这一层在做什么

守护进程分三层。认证层负责登录,处理两步验证码和人机验证。网盘层把接口包装成文件和文件夹树,名字和内容都用账号密钥做端到端加解密,同时轮询事件流。FUSE 层用 go-fuse 把这棵树显示成挂载的文件系统,目录列表按 TTL 缓存,过期或者远端事件说它变了就重拉。

读一个文件走哪条路

打开文件不会下载整个文件。内容按 4 MiB 分块,一次读只取需要的块,读一个巨大视频的前几十 KB 只下载一块。下载过的块写进磁盘缓存,重新挂载后再读也不会重新下载。超过 -large-file 的文件跳过缓存。

  1. 应用打开文件,网盘层拿到内容会话密钥和块列表。
  2. 应用读数据,网盘层按偏移量定位到具体块。
  3. 内存里有这一块就直接返回,没有就查磁盘缓存。
  4. 磁盘也没有,就用会话密钥下载并解密这个块,再写回缓存。
  5. 解密后的字节经 FUSE 层和内核交回应用。

写入为什么先落临时文件

打开文件准备写入时,内容都进本地临时文件,文件开着时不会往远端发任何东西。关闭之后先等一段上传延迟,默认 5 秒,可以用 -upload-delays 按文件名模式单独设,再把整份文件作为新版本上传。

延迟是为了照顾分多步保存的程序。FreeCAD 保存时先写 model.FCStd.<uuid>,把 model.FCStd 改名成带时间戳的 .FCBak,再把临时文件改成原名。等待期间的行为分几种。

  • 改名。文件跟到新名字,等待时间按新名字重新开始。
  • 再次以写方式打开。应用拿回同一个缓冲,等待停止。
  • 删除。丢掉缓冲,什么都不上传。
  • 列表和读取。照常看到这个文件。
  • 卸载。挂载点消失前把还在等的文件全部上传。
  • 上传失败。保留缓冲,每 30 秒重试一次。

远端变更怎么同步进来

每 -poll 一段时间轮询一次事件流,默认 10 秒。收到事件后就把那个目录的缓存列表和那个文件的缓存块丢掉,下一次读取拿到当前版本。

挂载失败或文件不更新怎么排查

  1. 先看守护进程在不在,ps -aux | grep proton-drive-fs。同一用户同一时间只允许一个挂载实例,上一次挂载出事但进程还活着,挂载和托盘都起不来。
  2. 进程不在却还是起不来,多半是锁文件残留,删掉 $XDG_RUNTIME_DIR/proton-drive-fs/mount.lock 再重试。
  3. 确认配置读到了。proton-drive-fs config show 打印真正生效的值,mountpoint 没有默认值,显示 unset 就说明没配。
  4. 文件不更新,把日志级别调到 debug 再看,journalctl --user -t proton-drive-fs -p debug -f 能看到块级缓存的命中情况。
  5. 卸载报 Device or resource busy,先跑 proton-drive-fs unmount 路径。守护进程卡死就用 unmount -force,还不行才用 fusermount3 -uz。

这套方案的现实限制

  • 它不是官方客户端,官方不审查也不支持,接口没有公开文档。
  • 删除文件会同时从远端删掉,目前没有回收站和恢复。
  • 挂载范围只有主共享,其他共享盘不显示。
  • 一个会话文件只装一个账号,两个账号要各自独立的配置目录。
  • 同一文件同一时间只能有一个写入者。
  • 编辑超大文件时整份内容在本地缓冲,关闭后重新上传。

哪些场景适合,哪些别用

磁盘紧张、只偶尔取几个文件、想用普通命令行工具读网盘内容,这些场景适合。需要完整离线副本,或者离不开回收站和恢复,这些场景不适合。

常见问题

密码存在哪里? 不存,会话文件里放的是令牌、用户名和密钥密码的回退信息。

共享盘会显示吗? 目前不支持,只有主共享会挂上来。