3.4 KiB
3.4 KiB
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: <defunct> (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
mountoutput
可能原因
-
go-nfsv4 设计问题
- go-nfsv4 可能不是设计为持续运行的 daemon
- 执行完 mount 命令后就退出
-
Socket fd 生命周期
- Child process fork 后继承 socket fd
- Parent 关闭 socket fd → Child 可能也随之失效
-
环境变量传递
_FUSE_COMMFD和_FUSE_MONFD可能没有正确传递- go-nfsv4 无法保持 socket 连接
验证测试
手动 go-nfsv4 测试
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 机制
- 可能需要特定的参数组合
下一步行动
-
验证 go-nfsv4 手动运行
- 确认是否能保持进程活跃
-
研究 fuse-t 文档
- https://www.fuse-t.org/
- GitHub issues
-
测试 macFUSE
brew install --cask macfuse- 比较两种实现
-
考虑替代架构
- WebDAV server
- SMB server
- 直接 HTTP API
诊断时间: 2026-05-17 11:25 状态: 问题已识别,等待进一步验证