使用FUSE以目录形式命名管道

时间:2019-10-03 13:06:40

标签: go fuse

我想创建一个FUSE文件系统,该文件系统接受对文件系统内部任何路径的任何类型的写操作。有点像命名管道,但采用目录形式。

echo test > bar         # consumes "test"
echo test > bar/foo     # consumes "test", even though the directory "bar" hasn't been created
echo test > x/y/z/test  # consumes "test", even though the directories "x/y/z" haven't been created

我正在使用bazil.org/fuse进行实施。我面临的问题是,当应用程序要写入文件系统中的foo/bar时,它将检查foo是否是目录,然后检查bar是否是文件。不幸的是,我无法预先知道foo是文件还是目录。

我的Attr函数如下所示:

func (d *Dir) Attr(ctx context.Context, a *fuse.Attr) error {
        a.Inode = 1
        a.Mode = os.ModeDir | 0755
}

由于os.ModeDir,此代码特定于目录节点类型。我希望它适用于目录或文件。

有没有办法实现我想要的?

1 个答案:

答案 0 :(得分:1)

  

我面临的问题是,当应用程序要写入文件系统内的foo/bar时,它将检查foo是否是目录,然后检查bar是否是目录。文件。不幸的是,我无法预先知道foo是文件还是目录。

鉴于这些限制,不可能解决您的问题。

文件系统节点可以是文件或目录;有时两者都不是,但绝不会同时出现。因为您的FUSE驱动程序无法事先知道执行getattr请求的应用程序是否意味着要在节点上进行递归直到它实际尝试执行,所以您无法知道它应该假装为文件还是目录。

您最好的选择似乎是:

  • 将特定于应用程序的虚拟目录结构硬编码到FUSE驱动程序中
  • 在FUSE驱动程序中实现特定于应用程序的试探法
  • 让您的FUSE驱动程序记住getattr请求并通过反复试验构造一个虚拟目录树(并继续重新运行该应用程序,直到它起作用为止)