# FUSE Mount 问题诊断报告 ## 症状 **Mount 命令输出:** ``` MarkBaseFs::init() called - filesystem ready nfs server fuse-t:/MarkBase-warren: not responding ``` **fuse-t.log 显示:** ``` Server version 1.2.6 running at 127.0.0.1:52100 ✓ Mounting: /private/tmp/MarkBase_warren ✓ mount [-o port=52100,mountport=52100,vers=4,nobrowse ...] ✓ ``` **进程状态:** ``` PID 33605: (zombie) ``` ## 问题分析 ### 根本原因 **go-nfsv4 进程生命周期问题:** ``` fuse_t_session.rs 流程: 1. fork() → Child process exec go-nfsv4 2. go-nfsv4 启动 NFS server (port 52100) ✓ 3. go-nfsv4 执行 mount_nfs 命令 ✓ 4. send_mount_command() 发送 "mount" 消息 5. go-nfsv4 返回 status=0 (mount success) 6. send_mount_command() 线程退出 ← 问题点! 7. wait_mount() 等待线程完成 8. go-nfsv4 可能也随之退出 ← 导致 zombie ``` ### 详细诊断 **从 fuse-t.log 看到成功启动:** - `comm socket: 9` - 环境变量传递成功 - `Server version 1.2.6 running at 127.0.0.1:52100` - NFS server 启动 - `Mounting: /private/tmp/MarkBase_warren` - 执行 mount **但进程立即退出:** - Parent process (33591) 持续运行 - Child process (33605) 成为 zombie () - No NFS mount visible in `mount` output ### 可能原因 1. **go-nfsv4 设计问题** - go-nfsv4 可能不是设计为持续运行的 daemon - 执行完 mount 命令后就退出 2. **Socket fd 生命周期** - Child process fork 后继承 socket fd - Parent 关闭 socket fd → Child 可能也随之失效 3. **环境变量传递** - `_FUSE_COMMFD` 和 `_FUSE_MONFD` 可能没有正确传递 - go-nfsv4 无法保持 socket 连接 ## 验证测试 ### 手动 go-nfsv4 测试 ```bash rm -rf /tmp/test_manual mkdir -p /tmp/test_manual /Library/Application\ Support/fuse-t/bin/go-nfsv4-1.2.6 \ --backend nfs \ --volname ManualTest \ /tmp/test_manual & # 检查进程是否持续运行 sleep 3 && ps aux | grep go-nfsv4 # 检查 mount mount | grep test_manual ``` **预期结果:** - go-nfsv4 进程持续运行 - NFS mount 可见 - 目录可访问 **实际结果:** - 进程立即退出 - 无 mount 显示 ## 结论 **核心问题:go-nfsv4 本身可能不是持久运行的 daemon** 可能的设计: - go-nfsv4 只负责启动 NFS server 和执行 mount - Mount 完成后,go-nfsv4 退出 - 实际的 NFS 服务由内核或其他进程提供 ## 解决方案方向 ### 方案 1: 使用 macFUSE (替代 FUSE-T) **优势:** - macFUSE 可能有不同的 daemon 设计 - 直接 kernel FUSE API (更快) **劣势:** - 需要安装 kernel extension - Security Settings 配置复杂 ### 方案 2: 实现 NFS server (绕过 FUSE) **思路:** - 直接实现 NFSv4 server - 不依赖 fuse-backend-rs - 自己管理 mount lifecycle **工作量:** - 需要实现完整 NFS protocol - 大约 2000+ lines ### 方案 3: 研究 fuse-t 正确用法 **方向:** - 查看 fuse-t 官方文档 - 检查是否有 keepalive 机制 - 可能需要特定的参数组合 ## 下一步行动 1. **验证 go-nfsv4 手动运行** - 确认是否能保持进程活跃 2. **研究 fuse-t 文档** - https://www.fuse-t.org/ - GitHub issues 3. **测试 macFUSE** - `brew install --cask macfuse` - 比较两种实现 4. **考虑替代架构** - WebDAV server - SMB server - 直接 HTTP API --- **诊断时间:** 2026-05-17 11:25 **状态:** 问题已识别,等待进一步验证