You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Debian 11下FUSE及curlftpfs网络共享异常问题求助

问题解决:自定义FUSE代码异常及curlftpfs故障修复

一、自定义C++ FUSE代码问题修复

你的代码存在三个核心问题,导致my_mkdir不被调用且提示"function not implemented":

1. 缺少基础FUSE操作回调

FUSE内核在执行mkdir前会先调用getattr检查父目录的属性,如果未实现getattr,内核会判定路径非法,直接终止操作,不会触发mkdir。必须添加基础的getattr回调。

2. 参数初始化错误

fuse_args未传递任何FUSE配置参数(如挂载点、FUSE选项),导致FUSE会话初始化不完整,部分操作通道未建立。

3. my_mkdir逻辑错误

直接调用系统mkdir处理虚拟路径是错误的——挂载点是FUSE虚拟文件系统,本地系统无法直接操作该路径,且会引发递归调用FUSE自身的mkdir方法。需要模拟一个内存目录结构来处理虚拟操作。

修复后的代码

#define FUSE_USE_VERSION 30
#include <fuse.h>
#include <iostream>
#include <unordered_set>
#include <string>
#include <cstring>

static const char* mount_point = "/drv/drive1";
// 模拟内存中的目录结构
static std::unordered_set<std::string> dirs = {"/"};

static int my_getattr(const char* path, struct stat* stbuf)
{
    memset(stbuf, 0, sizeof(struct stat));
    if (dirs.count(path)) {
        // 目录属性配置
        stbuf->st_mode = S_IFDIR | 0755;
        stbuf->st_nlink = 2;
    } else {
        return -ENOENT;
    }
    return 0;
}

static int my_mkdir(const char* path, mode_t mode)
{
    std::cout << "called mkdir: " << path << std::endl;
    if (dirs.count(path)) {
        return -EEXIST;
    }
    dirs.insert(path);
    return 0;
}

static void* my_init(fuse_conn_info*)
{
    std::cout << "init" << std::endl;
    return nullptr;
}

static struct fuse_operations my_operations = {
    .getattr = my_getattr,
    .mkdir = my_mkdir,
    .init = my_init
};

int main(int argc, char* argv[])
{
    // 初始化FUSE参数,传递命令行传入的参数
    struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
    // 添加FUSE选项:允许其他用户访问(可选)
    fuse_opt_add_arg(&args, "-oallow_other");
    
    // 使用fuse_main简化会话管理(FUSE官方推荐用法)
    int res = fuse_main(args.argc, args.argv, &my_operations, nullptr);
    
    fuse_opt_free_args(&args);
    return res;
}

编译运行指令

g++ -o fuse_test fuse_test.cpp -lfuse3
sudo ./fuse_test /drv/drive1

二、curlftpfs故障修复

针对FileZilla FTP服务器的550错误及输入/输出异常,按以下步骤排查:

1. 调整FTP列表命令

curlftpfs默认使用LIST -a命令,部分FTP服务器(如FileZilla)对该命令兼容性不佳,改用NLST命令:

curlftpfs -o ftp_list_options="-n" ftp://user:pass@server_ip/path /drv/drive1

2. 启用被动模式

FileZilla服务器通常默认使用被动模式,curlftpfs可能默认用主动模式,强制指定被动模式:

curlftpfs -o ftp_pasv=yes ftp://user:pass@server_ip/path /drv/drive1

3. 修复权限配置

  • 编辑/etc/fuse.conf,取消注释user_allow_other选项,允许普通用户挂载的FUSE文件系统被其他用户访问。
  • 将当前用户加入fuse组:
    sudo usermod -aG fuse $USER
    
    重新登录后生效。

4. 验证FTP路径

确保curlftpfs挂载的FTP路径存在,FileZilla服务器的路径区分大小写,避免路径拼写错误。

内容的提问来源于stack exchange,提问作者r5t0neer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 04:35:31