解决日常开发中的具体痛点
现代软件工程工具链对内置固态硬盘(SSD)的吞吐与容量消耗极为激进:
- 缓存体积庞大:日常同时写前端、Rust、Go 与容器应用,
~/.cargo、~/.pnpm-store、GOCACHE以及 Docker / OrbStack 磁盘镜像随随便便就能堆出 100GB 到 200GB 的缓存; - Mac 黄金硬盘代价高昂:购买苹果设备时,额外加装 1TB 内置存储的成本极高,而外置雷电或 USB4 固态硬盘(SSD)在性能几乎无损的同时,单位成本只有前者的零头;
- 手工软链接容易踩坑:很多开发者尝试手动
ln -s软链接目录,但一旦遇到跨卷硬链接(如 pnpm store 与工作区处于不同卷)、工具官方环境变量冲突、或在正在运行的进程下移动数据,轻则编译报错,重则损坏镜像。
为了让开发缓存安全、无痛且可逆地迁移到外置移动固态硬盘,我写了 Exodrive。
核心设计:五步确定性迁移流水线
Exodrive 不是一个盲目的文件移动脚本。每种工具链的迁移严格遵循相同的五步闭环:
- 拷贝(Copy):流式复制缓存目录至外置目标卷,保留所有原始文件权限、POSIX 属性与修改时间戳;
- 逐字节校验(Verify):遍历并比对源目录与目标目录的每个文件。若出现任意一处哈希或字节不一致,流程立即中止,本地原始数据毫发无损;
- 账本记录(Ledger):将迁移元数据与状态原子写入本地账本(
~/.exodrive/manifest.json); - 工具切换(Switch):
- 优先使用工具官方原生配置命令(如
npm config set cache、pnpm config set store-dir、go env -w GOCACHE=...、OrbStackdata_dir); - 对不支持官方重定向配置的工具(如 Cargo、Bun、Colima),采用原子软链接定向至外置副本;
- 优先使用工具官方原生配置命令(如
- 安全回收(Reclaim):确认一切就绪后,删除本地冗余副本,即刻释放数十上百 GB 的宝贵内置存储。
随时可逆的回滚保证:回滚(
exodrive rollback)完全沿相反路径执行——从外置磁盘复制回本地、校验完整性、恢复默认配置并注销账本。任何未登记在账本中的操作,系统坚决拒绝擅自修改。
安全防线与 Fail-Closed 原则
数据安全永远高于便利性。当存在数据受损或语义模糊的风险时,Exodrive 严格执行 Fail-Closed 策略,直接拒绝执行:
- 文件系统白名单保护:仅允许将缓存迁入现代可靠的文件系统(如 macOS 的 APFS / HFS+,以及 Linux 的 ext4、btrfs、zfs、xfs 等),严格拒绝 exFAT、FAT32 与 NTFS,杜绝跨卷硬链接失效或 POSIX 权限丢弃;
- 进程互斥检查:当检测到目标包管理器或 Docker 引擎正在运行时,强行阻断迁移,防止并发写入导致数据脏读;
- 二进制与执行环境隔离:仅迁移缓存数据,绝不移动
~/.cargo/bin、~/.bun/bin或$GOPATH/bin,确保终端 CLI 路径无依赖污染; - 孤儿缓存探测:支持一键扫描由于此前手动配置残留的历史废弃缓存(
exodrive orphans),安全回收历史磁盘碎片。
交付形态
Exodrive 由 Go 1.27 构建,提供双重交互形态:
- 命令行 CLI(
exodrive):单静态二进制,支持scan、migrate、rollback、check、orphans等高密度操作,并附带彩色终端实时进度条; - macOS 原生轻量窗口(
exodrive-gui):基于原生窗口组件构建,实时监控各工具链缓存大小、迁移状态与磁盘占用,支持一键视窗化迁移。
项目资源与文档
- GitHub 开源仓库:Jungley8/exodrive
- 中文产品主页与文档:jungley8.github.io/exodrive/zh/
- 英文官方文档:jungley8.github.io/exodrive/docs/