Files
markbase/docs/FUSE_MOUNT_DEBUG.md
2026-05-18 17:02:30 +08:00

3.4 KiB
Raw Blame History

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 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 测试

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 文档

  3. 测试 macFUSE

    • brew install --cask macfuse
    • 比较两种实现
  4. 考虑替代架构

    • WebDAV server
    • SMB server
    • 直接 HTTP API

诊断时间: 2026-05-17 11:25 状态: 问题已识别,等待进一步验证