FUSE 文件系统上的 Linux 功能

Posted

技术标签:

【中文标题】FUSE 文件系统上的 Linux 功能【英文标题】:Linux capabilities over FUSE file system 【发布时间】:2012-10-16 04:22:21 【问题描述】:

我有一个 FUSE 文件系统,我在其中编码了 getxattrsetxattr,如下所示:

int mfs_setxattr(const char *path, const char *name, const char *value, size_t size, int flags)

  ... /* some translation processing of path to rpath */

  int ret = lsetxattr(rpath, name, value, size, flags);

  ... /* some logging works */

  if (ret == -1) 
    return -errno;
  

  return 0;

int mfs_getxattr(const char *path, const char *name, char *value, size_t size)

  ... /* some translation processing of path to rpath */

  int ret = lgetxattr(rpath, name, value, size);

  ... /* some logging works */

  if (ret == -1) 
    return -errno;
  

  return ret;

我已经对此进行了测试,除了功能之外它运行良好: 当我使用 setcap 为程序设置功能并运行它时,该程序无法执行特权工作。尽管 getcap 返回了我之前设置的功能。

有人可以告诉我跟踪问题的方法或给我一些关于发生了什么的指示吗?

【问题讨论】:

有一个 fuse 邮件列表,我比 SO 更幸运。可能也值得尝试邮件列表。 @AndrewTomazos-Fathomling :我会试试的,我想 ...然后回到这里告诉我们你学到了什么。 【参考方案1】:

我认为一个很好的起点是 init 函数。在那里你得到一个论点

struct fuse_conn_info *conn

此结构包含以下字段

    proto_major:FUSE 的主要版本 proto_minor:FUSE 的次要版本 async_read:如果此条目 > 0,则您的 FS 支持异步 读取 max_write:支持的最大写入量是多少。如果你输入一个值 即小于 4K 它将直接将值恢复为 4K max_readahead:最大预读值 capable:这是 FUSE 内核模块支持的功能 它被编码为位标志 想要:FUSE 客户端想要什么功能,再次进行位编码

现在我还没有对此进行试验,但我敢打赌“想要”字段是您需要修改的。您拥有的选项如下

FUSE_CAP_DONT_MASK:如果设置,umask 不会应用于创建操作的文件。网上的一些说法并未真正实施 FUSE_CAP_EXPORT_SUPPORT:表示您的客户端是否处理“.”或“..”本身或 FUSE 需要执行陷阱并处理它 FUSE_CAP_ASYNC_READ:如果你基本上使用异步读取,默认启用此功能 FUSE_CAP_BIG_WRITES:如果 FS 可以处理大于 4KB 的写入,则应设置 FUSE_CAP_POSIX_LOCKS:如果 FS 客户端支持通过 lock 系统调用从远程实体锁定,则应设置 FUSE_CAP_ATOMIC_O_TRUNC:如果 FS 支持 O_TRUNC 作为打开标志,则应设置此标志

我不确定这有多大帮助,但这是一个开始。有人说,如果您实际上可以以某种方式禁用这些功能,您将获得巨大的性能提升。 但我仍然没有找到如何做到这一点。

【讨论】:

考虑您的回应,但我想要的不是我的 fs 程序的功能。我的 fuse fs 必须在底层目录中复制确切的行为,我已成功删除所有操作 ecxept 以获取功能: - 如果在受监视的目录中您有一些需要功能的程序,您可以使用 setcap 设置它们并使用 getcap 检索它们。 - 但是如果你执行那个程序,它就不会获得这些能力并且会失败。

以上是关于FUSE 文件系统上的 Linux 功能的主要内容,如果未能解决你的问题,请参考以下文章

FUSE文件系统介绍

FUSE文件系统介绍

Alluxio FUSE 实现原理

利用s3fs 将 s3 bucket 挂载到Linux目录

/hgfs下无共享文件夹?/mnt下没有hgfs文件夹?vmhgfs-fuse:找不到命令?

kubefuse 让Kubernetes 资源成为fuse 文件系统