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

157 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 (<defunct>)
- 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
**状态:** 问题已识别,等待进一步验证