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
相关产品推荐
相关产品推荐

