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

224 lines
5.7 KiB
Markdown
Raw Permalink 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 实际测试指南
## 问题诊断结果
### 成功证据fuse-t.log
```
time="2026-05-17T11:16:08+08:00" level=info msg=starting...
time="2026-05-17T11:16:08+08:00" level=info msg="comm socket: 9"
time="2026-05-17T11:16:08+08:00" level=info msg="montor socket: 11"
time="2026-05-17T11:16:08+08:00" level=info msg="Server version 1.2.6 running at 127.0.0.1:52100"
time="2026-05-17T11:16:08+08:00" level=info msg="Mounting: /private/tmp/MarkBase_warren"
time="2026-05-17T11:16:08+08:00" level=info msg="mount [-o port=52100,mountport=52100,vers=4,nobrowse -t nfs fuse-t:/MarkBase-warren /private/tmp/MarkBase_warren]"
```
**结论Mount 成功启动了!**
### 失败原因
**Mount 进程立即退出 → go-nfsv4 也终止 → 自动卸载**
---
## 正确的测试流程
### Step 1: 启动 Mount阻塞式
**打开 Terminal 1运行**
```bash
/tmp/mount_warren.sh
```
**或直接运行:**
```bash
cd /Users/accusys/markbase
mkdir -p /tmp/MarkBase_warren
cargo run -- fuse mount --user warren --dir /tmp/MarkBase_warren
```
**⚠️ 重要:保持这个 Terminal 开启!不要关闭!**
**预期输出:**
```
=== Mounting MarkBase FUSE ===
User: warren
Mount path: /tmp/MarkBase_warren
Database: data/users/warren.sqlite
Backend: fskit
macOS version: 26.4.1
[INFO] Mounting MarkBase FUSE for user: warren
[INFO] FUSE session mounted successfully
[INFO] Starting FUSE request handler thread
[INFO] Mount completed for user: warren, waiting for requests...
(进程阻塞在这里,等待 FUSE requests)
```
### Step 2: 验证 Mount另一个 Terminal
**打开 Terminal 2运行**
```bash
# 检查 mount 状态
mount | grep MarkBase_warren
# 预期输出:
# fuse-t:/MarkBase-warren on /private/tmp/MarkBase_warren (nfs, nobrowse)
# 检查进程
ps aux | grep go-nfsv4
# 预期输出:
# /Library/Application Support/fuse-t/bin/go-nfsv4-1.2.6 ...
# 测试文件访问
ls -la /tmp/MarkBase_warren/
# 统计文件数量
find /tmp/MarkBase_warren -type f | wc -l # Expected: 11857 files
find /tmp/MarkBase_warren -type d | wc -l # Expected: 802 folders
```
### Step 3: 测试文件操作
```bash
# 查看根目录
ls -la /tmp/MarkBase_warren/Home/
# 读取文件(测试 read() operation
cat /tmp/MarkBase_warren/Home/.../test_file.txt
# 检查文件属性(测试 getattr() operation
stat /tmp/MarkBase_warren/Home/.../file.mp4
# 测试 write() operation创建测试文件
echo "test write" > /tmp/MarkBase_warren/test_write.txt
cat /tmp/MarkBase_warren/test_write.txt
```
### Step 4: Unmount
**在 Terminal 1 按 Ctrl+C 停止进程**
**或在 Terminal 2 运行:**
```bash
umount /tmp/MarkBase_warren
# 或
cargo run -- fuse unmount --dir /tmp/MarkBase_warren
```
---
## Mount 流程详解
### fuse_t_session.rs 实现流程
```
1. socketpair() → 创建 Unix socket pairs
- (fd0, fd1) - FUSE communication channel
- (mon_fd0, mon_fd1) - Mount status monitor
2. fork() → 分裂成两个进程
├─ Parent Process:
│ ├─ 关闭 fd0, mon_fd0
│ ├─ 保持 fd1 → File object (FUSE channel)
│ ├─ 保持 mon_fd1 → File object (monitor)
│ └─ 返回 session.file, session.monitor_file
└─ Child Process:
├─ 关闭 fd1, mon_fd1
├─ 设置环境变量:
│ ├─ _FUSE_DAEMON_PATH - daemon executable path
│ ├─ _FUSE_CALL_BY_LIB - "1" (标记为 library call)
│ ├─ _FUSE_COMMFD - fd0 (socket fd)
│ ├─ _FUSE_MONFD - mon_fd0 (monitor fd)
│ └─ _FUSE_COMMVERS - "2" (protocol version)
├─ Exec go-nfsv4:
│ ├─ --noatime=true
│ ├─ --dontbrowse=true
│ ├─ --volname MarkBase-warren
│ └─ /tmp/MarkBase_warren
└─ Panic (should never reach here)
3. go-nfsv4 启动:
├─ 从环境变量获取 socket fds
├─ 启动 NFS server (127.0.0.1:52100)
├─ 执行 mount_nfs 命令:
│ mount -o port=52100,mountport=52100,vers=4,nobrowse \
│ -t nfs fuse-t:/MarkBase-warren /tmp/MarkBase_warren
└─ 等待 FUSE requests (via socket fd0)
4. send_mount_command():
├─ 启动独立 thread
├─ 发送 "mount" message 到 mon_fd1
└─ 等待 go-nfsv4 返回 status
5. FUSE request handler thread:
├─ loop:
│ ├─ channel.get_request() → (reader, writer)
│ ├─ server.handle_message(reader, writer)
│ └─ Continue until ENODEV or error
└─ Exit on unmount
6. wait_mount():
└─ 等待 send_mount_command() thread 完成
```
### 关键点
1. **环境变量传递** - go-nfsv4 必须通过 `_FUSE_COMMFD` 环境变量获取 socket fd
2. **Fork + Exec** - Child process 执行 go-nfsv4Parent 保持 socket channel
3. **阻塞式运行** - Handler thread 必须持续运行处理 requests
4. **进程生命周期绑定** - Parent process 退出 → go-nfsv4 也终止
---
## 已修复的问题
### mount_manager.rs 修改
**之前:**
```rust
thread::spawn(move || {
// Handler thread
});
handle.session.wait_mount()?; // 等待 mount status
// 焋退出 ← 导致 go-nfsv4 也退出
```
**修复后:**
```rust
let handler_thread = thread::spawn(move || {
// Handler thread
});
handler_thread.join()?; // 阻塞等待 handler thread
// 保持进程运行 ← go-nfsv4 持续运行
```
---
## 下一步测试
**立即测试(推荐):**
1. 打开 Terminal 1: `/tmp/mount_warren.sh`
2. 打开 Terminal 2: `mount | grep MarkBase`
3. 如果看到 mount继续文件访问测试
**预期结果:**
- ✓ Mount 成功建立
- ✓ 12659 nodes 可见802 folders + 11857 files
- ✓ read() operation 正常工作
- ✓ write() operation 正常工作Phase 4 partial
---
**文档更新2026-05-17 11:20**
**状态Mount 流程已修复,等待实际测试**