# 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-nfsv4,Parent 保持 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 流程已修复,等待实际测试**