157 lines
3.4 KiB
Markdown
157 lines
3.4 KiB
Markdown
# 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
|
||
**状态:** 问题已识别,等待进一步验证
|