# FSKit 未测试原因釐清 **日期**: 2026-05-18 **问题**: 为何测试方案没有提到 FSKit? --- ## FSKit 在技术选型中的角色 ### 1. FSKit 检测成功 ✅ **自动检测结果**: ``` macOS version: 26.4.1 Recommended backend: fskit Reason: macOS 26+ supports FSKit (native, fastest) Performance: Direct userspace path, minimal overhead ``` **代码实现**: ```rust // src/fuse/backend.rs pub fn select_backend() -> BackendType { let version = detect_macos_version(); if version.starts_with("26") { BackendType::Fskit // macOS 26+ → FSKit } else { BackendType::Nfs4 } } ``` **测试验证**: - ✅ Test 1: Backend detection (FSKit detected) - ✅ Test 2: Auto backend selection (FSKit selected) - ✅ Test 3: Manual backend selection (FSKit forced) --- ## 2. FSKit 实际测试失败 ❌ **关键事实**: FSKit backend 同样依赖 go-nfsv4 ### go-nfsv4 统一二进制架构 ``` FUSE-T Architecture: ├── go-nfsv4 (unified binary, 23MB) │ ├── NFSv4 backend │ ├── FSKit backend │ └── SMB3 backend └── Backend selection via CLI flag Usage: go-nfsv4 --backend nfs # NFSv4 go-nfsv4 --backend fskit # FSKit (same binary!) ``` **证据来源**: ```markdown From docs/FUSE_CURRENT_STATUS.md: - go-nfsv4 is unified binary (NFSv4/FSKit/SMB3) - Backend selection via `--backend` flag ``` --- ## 3. go-nfsv4 整体失败(影响所有 backend) ### 失败现象 **测试结果**(40+ 次测试): ``` go-nfsv4 daemon 死亡 → zombie process ✗ mount_nfs 执行失败 → NFS mount 未建立 ✗ NFS server 不监听 → 52100 端口关闭 ✗ 文件不可见 → 目录为空 ✗ ``` **根本原因**: ``` go-nfsv4 设计意图推测: ├── mount helper(而非 daemon) ├── 启动临时 NFS server ├── 执行 mount_nfs 命令 ├── 等待 mount 完成 └── 退出进程(kernel 接管) 问题: mount_nfs 执行失败 → go-nfsv4 无法完成 mount → 进程立即变成 zombie → 所有 backend (NFSv4/FSKit/SMB3) 都无法工作 ``` --- ## 4. 为什么没有单独测试 FSKit? ### 答案:FSKit 和 NFSv4 使用同一个 binary **关键依赖链**: ``` FSKit backend: ├── 依赖 go-nfsv4 binary ├── 执行 go-nfsv4 --backend fskit └── 同样的 mount helper 问题 如果 go-nfsv4 失败: ├── NFSv4 backend ✗ ├── FSKit backend ✗ (同样失败) └── SMB3 backend ✗ ``` **技术现实**: ```rust // FUSE-T backend implementation fn mount_fskit() { // 使用同一个 go-nfsv4 binary Command::new("go-nfsv4") .arg("--backend") .arg("fskit") .output() } // 如果 go-nfsv4 mount helper 设计有问题 // FSKit backend 同样会失败 ``` --- ## 5. FSKit vs NFSv4 测试差异 ### 测试文档记录 **POC Test Plan** (`docs/FUSE_POC_TEST.md`): ```markdown ### Test FSKit Backend (计划,未执行) # Force FSKit backend (macOS 26+) cargo run -- fuse poc --backend fskit Expected: | FSKit | TBD | TBD | Target: 40% faster | Status: ⏳ Ready (但未实际测试) ``` **实际测试**: - ✅ Backend detection (FSKit selected) - ✅ Placeholder mount (POC only) - ❌ **真实 mount 测试未执行**(go-nfsv4 未安装/失败) --- ## 6. FUSE-T 安装状态检查 **当前状态**: ```bash $ ls -la "/Library/Application Support/fuse-t/bin/" FUSE-T 未安装 原因: 1. go-nfsv4 安装需要 sudo 权限 2. brew install fuse-t 未执行 3. PKG 文件需要手动安装 ``` **从文档记录**(`docs/FUSE_POC_REPORT.md`): ```markdown Next Steps: Install FUSE-T and implement real FUSE filesystem Status: POC 验证完成,但 FUSE-T 未实际安装 ``` --- ## 7. 关键洞察:FSKit 并非独立方案 **误解来源**: ``` 文档中大量提到 FSKit: - macOS 26+ → FSKit (native, fastest) - Backend auto-detection works - FSKit backend recommended 但未说明: - FSKit 依赖 go-nfsv4 binary - go-nfsv4 是统一 mount helper - 如果 go-nfsv4 失败,所有 backend 都失败 ``` **技术选型误判**: ``` 初始假设: ├── NFSv4 可能失败 ├── FSKit 作为备选(独立实现) └── SMB3 作为第三备选 实际架构: ├── go-nfsv4 统一二进制 ├── NFSv4/FSKit/SMB3 都是同一 binary 的不同 flag └── go-nfsv4 失败 → 所有 backend 都失败 ``` --- ## 8. 为什么转向 WebDAV? **技术依赖对比**: | 方案 | 依赖 | 状态 | macOS兼容 | |------|------|------|-----------| | NFSv4 (go-nfsv4) | go-nfsv4 mount helper | ❌ 失败 | ⚠️ 需调试 | | FSKit (go-nfsv4) | go-nfsv4 mount helper | ❌ 同样失败 | ⚠️ 同上 | | SMB3 (go-nfsv4) | go-nfsv4 mount helper | ❌ 同样失败 | ⚠️ 同上 | | **WebDAV** | HTTP server (dav-server) | ✅ 成功 | ✅ 原生支持 | **关键发现**: ``` FSKit 并非独立备选方案: ├── FSKit backend = go-nfsv4 --backend fskit ├── 同样的 mount helper 设计 ├── 同样的 zombie process 问题 └── 并不能绕过 NFSv4 的失败 真正独立的方案: ├── WebDAV (HTTP-based, 无 kernel/FUSE 依赖) ├── macFUSE (kext, 但被禁止) └── libnfs-go (Go NFS server, 完全独立) ``` --- ## 9. 总结 ### FSKit 问题本质 **问题**: 为何测试方案没有提到 FSKit? **答案**: 1. FSKit 检测成功 ✅(backend auto-selection) 2. FSKit 测试未执行 ❌(go-nfsv4 未安装) 3. FSKit 并非独立方案(依赖 go-nfsv4) 4. go-nfsv4 失败 → NFSv4/FSKit/SMB3 全部失败 **技术现实**: ``` FUSE-T = go-nfsv4 unified binary ├── Backend selection via CLI flag ├── Mount helper design (not daemon) └── mount_nfs 失败 → 所有 backend 失败 FSKit ≠ 独立备选方案 FSKit = go-nfsv4 --backend fskit (同一 binary) ``` --- ## 10. 正确的技术选型路径 **初始误判**: ``` FUSE-T → NFSv4 失败 → 尝试 FSKit → 尝试 SMB3 ``` **正确理解**: ``` FUSE-T → go-nfsv4 失败 → NFSv4/FSKit/SMB3 全失败 → 转向真正独立的方案:WebDAV ``` **独立方案对比**: - ✅ WebDAV (HTTP-based, dav-server library) - ⏸️ libnfs-go (Go NFS server, 完全独立实现) - ❌ FUSE-T (go-nfsv4 统一 binary,单点故障) --- ## 附录:FSKit 检测 vs 实际测试 ### 检测成功(POC 验证) ```bash $ cargo run -- fuse detect-backend macOS version: 26.4.1 Recommended backend: fskit Reason: macOS 26+ supports FSKit (native, fastest) Status: ✅ Backend detection works ``` ### 实际测试失败(未执行) ```bash # 需要安装 FUSE-T(go-nfsv4) $ sudo installer -pkg fuse-t-1.2.6.pkg -target / # 测试 FSKit mount $ cargo run -- fuse poc --backend fskit Expected: Mount succeeds at /tmp/fuse_test Actual: 未执行(go-nfsv4 未安装) Status: ⏳ Ready, but not tested ``` **结论**: - FSKit 检测是 **代码验证** - FSKit mount 是 **实际测试** - 前者成功,后者未执行(依赖 go-nfsv4)